我有一个使用go-logging库(https://github.com/op/go-logging)的Golang应用程序。正确生成日志文件,但是当我停止并重新启动Go应用程序时,此日志文件将被新日志文件覆盖。这不是一个错误,Golang做了它要求做的事情。但是如果可能的话,我希望将新日志附加到现有的日志文件中。
首先,我的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)
...
}
我的appUtils.go定义了utilitary函数:
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
}
如果需要,我还会把我的config.json的内容:
{
"LOG":{
"LEVEL": "DEBUG",
"FORMAT": "%{color}%{time:15:04:05.000} %{shortfunc} => %{level:.4s} %{id:03x}%{color:reset} %{message}",
"LogFile": "logfile.log"
}
}
我想要的是可行的吗? 我已经明白问题来自这条线:
f, err := os.Create(config.LogFile)
在(重新)启动应用程序后创建一个新文件。 为了避免这种情况,我尝试了这个:
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)
}
但是它非常糟糕,它根本不起作用。
如果不可行,我应该修改我的config.json,以便生成名称中的日期为毫秒的文件吗?
答案 0 :(得分:2)
您的版本不起作用,因为您正在隐藏if块中的f
变量。如果您先声明err
并使用简单的赋值,那么在大多数情况下这似乎都有效。
然而,对文件进行统计,然后尝试创建或打开它本身就是一种性格。只需一次尝试打开正确的标志即可。如果您想要“只写”,“追加”和“创建”,那么:
os.OpenFile(name, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600)