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?
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