2016-11-22 5 views
3

go-loggingライブラリー(https://github.com/op/go-logging)を使用するGolangアプリケーションがあります。ログファイルは正しく生成されますが、Goアプリケーションを停止して再起動すると、このログファイルは新しいログファイルで上書きされます。それはバグではありません、ゴランはそれは何をするように求めています。しかし、可能であれば、新しいログを既存のログファイルに追加することをお勧めします。Golangにログファイルアペンダーを実装します。

まず、私のmain.goの抜粋:utilitary関数が定義されてい

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:

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 
} 

必要であれば、私はまた私の設定の内容を置きます。 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)  
    } 

が、それはかなりbullshの* tのですが、それがすべてでは動作しません:私はこれを試したことを避けるために 。

実現できない場合は、名前にミリ秒の日付を持つファイルを生成するためにconfig.jsonを変更する必要がありますか?

+2

は、私は非常に非常には、瞬間を取り、あなたのパッケージを再編成し、[有効に行く](HTTPSを読むことをお勧めします。 org/doc/effective_go.html)。 – OneOfOne

答えて

2

ifブロックの変数fをシャドーイングしているため、バージョンが機能しません。最初にerrと宣言して単純な割り当てを使用した場合、ほとんどの場合、このように動作します。

しかし、ファイルを作成したり開いたりしようとすると、それは本質的に難しいことです。 1回の試行で正しいフラグでそれを開いてください。あなたは、「書き込みのみ」「追加」、および「作成」したい場合は、:// golang:

os.OpenFile(name, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) 
関連する問題