2016-04-09 14 views
0

私は行くにログインして作業を開始していると私は(若干変更)以下のソースコードで行くhttps://www.goinggo.net/2013/11/using-log-package-in-go.htmlログフォーマットにカスタム(非const)文字列情報を追加するには?

をロギングについては、この記事に遭遇している:今、私はいくつかのカスタムを追加したいと思い

var (
    Trace *log.Logger 
    Info *log.Logger 
    Warning *log.Logger 
    Error *log.Logger 
) 

func Init(
    traceHandle io.Writer, 
    infoHandle io.Writer, 
    warningHandle io.Writer, 
    errorHandle io.Writer) { 

    Trace = log.New(traceHandle, 
     “TRACE: “, 
     log.Ldate|log.Ltime|log.Lshortfile) 

    Info = log.New(infoHandle, 
     “INFO: “, 
     log.Ldate|log.Ltime|log.Lshortfile) 

    Warning = log.New(warningHandle, 
     “WARNING: “, 
     log.Ldate|log.Ltime|log.Lshortfile) 

    Error = log.New(errorHandle, 
     “ERROR: “, 
     log.Ldate|log.Ltime|log.Lshortfile) 
} 

func main() { 
    Init(ioutil.Discard, os.Stdout, os.Stdout, os.Stderr) 
} 

をこのロガーによって生成されたログエントリへの情報ですが、const文字列リテラルではありません(たとえば、INFO:またはWARNING:

たとえば、ログがトリガーされた関数の名前を追加したいとします。のは、私はこのために使用したい以下の機能を持っているとしましょう:(hereから)

func _enter() { 
    // Skip this function, and fetch the PC and file for its parent 
    pc, _, _, _ := runtime.Caller(1) 
    // Retrieve a Function object this functions parent 
    functionObject := runtime.FuncForPC(pc) 
    // Regex to extract just the function name (and not the module path) 
    extractFnName := regexp.MustCompile(`^.*\.(.*)$`) 
    fnName := extractFnName.ReplaceAllString(functionObject.Name(), "$1") 
    fmt.Printf("Entering %s\n", fnName) 
} 

私はロガーにこれを追加することができますどのように?

答えて

1
  • 最も単純な答えは、ロギングの行を書き込むときに入力するだけです。ライブラリの多くは、実際に123行番号です

    logger.Logf("myfilename.go:123" + "other logging info")

    のような規則を使用します。これはideやエディタでもかなりスクリプト可能です。

  • _enter()を変更して関数の名前を返すと、残りの部分がはるかに簡単になります。それぞれの関数の中でlogger.SetPrefix()を呼び出すことができます。これは、サンプルコードに基づいて次のようになります。

    Info.SetPrefix("INFO: " + _enter() + ":")

    あなたは、自動的に上記の操作を行う助けとなる構造体のロガーをラップすることができますが、あなたは_enter()ごと時間に電話をかけるのオーバーヘッドに注意する必要があります。

  • この時点で、より多くの機能を備えたロギングライブラリを使用することを検討することもできます。私はlogrusで良い経験をしていますが、これは標準のlibのログパッケージの代わりになります。

関連する問題