在Golang

时间:2016-11-22 22:29:19

标签: logging go

我有一个使用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,以便生成名称中的日期为毫秒的文件吗?

1 个答案:

答案 0 :(得分:2)

您的版本不起作用,因为您正在隐藏if块中的f变量。如果您先声明err并使用简单的赋值,那么在大多数情况下这似乎都有效。

然而,对文件进行统计,然后尝试创建或打开它本身就是一种性格。只需一次尝试打开正确的标志即可。如果您想要“只写”,“追加”和“创建”,那么:

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