2016-11-22 4 views
3

Ich habe eine Golang-Anwendung, die die Go-Logging-Bibliothek verwendet (https://github.com/op/go-logging). Eine Protokolldatei wird korrekt generiert, aber wenn ich die Go-Anwendung stoppe und neu starte, wird diese Protokolldatei von einer neuen Protokolldatei überschrieben. Es ist kein Fehler, Golang macht, was er zu tun hat. Aber wenn es möglich ist, möchte ich, dass die neuen Protokolle in der vorhandenen Protokolldatei angehängt werden.Implementieren Sie eine Protokolldatei Appender in Golang

Zunächst ein Auszug meiner main.go:

package main 

import (

"utils" 
"webapp" 
"odbc" 
"constants" 
"github.com/op/go-logging" 
) 

var config = &Configuration{} 

var log = logging.MustGetLogger("main") 

func main() { 

    // Load the configuration file 
    utils.Load(constants.CONFIG_PATH, config) 

    utils.InitLog(config.LOG) 

    ... 
    } 

Meine appUtils.go wo die utilitary Funktionen definiert sind:

package utils 

import (
"github.com/op/go-logging" 
"os" 
"fmt" 
) 

func InitLog(config LOG) { 

f, err := os.Create(config.LogFile) 

backend := logging.NewLogBackend(f, "", 0) 

format := logging.MustStringFormatter(config.FORMAT,) 

backendFormatter := logging.NewBackendFormatter(backend, format) 

// Only errors and more severe messages should be sent to backend1 logging.Level 
logging.SetBackend(backendFormatter) 


    level, err := logging.LogLevel(config.LEVEL) 
    if err != nil { 
    logging.SetLevel(logging.ERROR, "") 
    } else{ 
    logging.SetLevel(level, "") 
    } 
} 

type LOG struct { 
    FORMAT string 
    LEVEL string 
    LogFile string 
} 

Bei Bedarf ich auch den Inhalt meiner Config setzen. json:

{ 
    "LOG":{ 
     "LEVEL": "DEBUG", 
     "FORMAT": "%{color}%{time:15:04:05.000} %{shortfunc} => %{level:.4s} %{id:03x}%{color:reset} %{message}", 
     "LogFile": "logfile.log" 
     } 
} 

Ist was ich will machbar? Ich habe verstanden, dass das Problem von dieser Linie kommt:

f, err := os.Create(config.LogFile) 

eine neue Datei erstellt wird, nach einer (Wieder-) Einführung der Anwendung. Um zu vermeiden, dass ich versucht, dieses:

var f *os.File 
    if _, err := os.Stat(config.LogFile); os.IsNotExist(err) { 
     f, err := os.Create(config.LogFile) 
    } 
    else { 
    f, err := os.OpenFile(config.LogFile, os.O_APPEND|os.O_WRONLY, 0600)  
    } 

aber es ist ziemlich bullsh * t, ist es nicht bei allen.

Wenn es nicht machbar ist, sollte ich meine config.json ändern, um Dateien zu generieren, die in ihrem Namen das Datum mit den Millisekunden beispielsweise haben?

+2

ich sehr empfehlen, nehmen Sie einen Moment Zeit und Ihre Pakete neu zu organisieren und lesen [wirksam go] (https: // golang. org/doc/effective_go.html). – OneOfOne

Antwort

2

Ihre Version funktioniert nicht, weil Sie die f Variable in den If-Blöcken spiegeln. Wenn Sie zuerst err deklarierten und eine einfache Zuweisung verwenden, scheint dies in den meisten Fällen zu funktionieren.

Wenn Sie jedoch eine Datei erstellen oder öffnen, ist das von Natur aus rassig. Öffnen Sie es einfach mit den richtigen Flaggen in einem Versuch. Wenn Sie „nur schreiben“ wollen „anhängen“ und „erstellen“, dann:

os.OpenFile(name, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) 
Verwandte Themen