2016-04-09 13 views
0

Ben Git günlük çalışmaya başladı ve ben (biraz değişmiş) Aşağıdaki kaynak koduyla Go https://www.goinggo.net/2013/11/using-log-package-in-go.html yılındaKayıt formatına özel (const olmayan) dize bilgileri nasıl eklenir?

günlüğü ile ilgili bu madde karşılaştım: Bazı özel eklemek istiyorum şimdi

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) 
} 

bilgiler bu kaydedici tarafından üretilen günlük girişleri ama günlük tetikledi edildiği işlevin bir isim eklemek istiyorum Örneğin

(orada eklendi INFO: veya WARNING: gibi) const dize hazır değildir hangi. (here itibaren)

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) 
} 

nasıl günlükçüsüne bu ekleyebilirsiniz: ı bunun için kullanmak istiyorum aşağıdaki işlevi var diyelim?

cevap

1
  • Tabii ki en basit yanıt, yalnızca günlük kaydını yazarken yazmanızdır. kütüphanelerin sürü aslında 123 satır numarasını olup

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

    gibi bir kural kullanabilir. Bu da bir ide veya editör tarafından oldukça betimlenebilir.

  • İşlev adını döndürmek için _enter()'u değiştirirseniz, bu geri kalanını daha kolay hale getirir. Her bir işlevin içinde logger.SetPrefix()'u arayabilir ve örnek kodunuza göre aşağıdaki gibi görünebilir.

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

    otomatik yukarıdaki yapmalarına yardımcı olacak bir yapı içinde logger sarabilirdiniz ama _enter()her zaman çağrısı yapma yükü bilmelidir. Bu noktada, daha fazla özelliğe sahip bir kayıt kitaplığı kullanarak bakmak isteyebilirsiniz. Standart lib'in günlük paketi için bir düşüş olabilecek logrus ile iyi deneyimlerim oldu.

İlgili konular