2017-03-13 60 views
7

log.Lshortfile bayrağını kullanarak, logger örneğin kaydedici işlevi çağrısının dosya adı ve satır numarası ile tüm günlük hatlarını önekLog.Logger işlevlerini satır numarası önekini kaybetmeden sarmak mümkün mü? Ben mesela, böyle günlük işlevi sarın Eğer</p> <pre>myfile.go:14: Hello, world!</pre> <p>:

func info(pattern string, args ...interface{}) { 
    myLogger.Printf(pattern + "\n", args...) 
} 

Bu işlev tarafından yayılan her satır, Printf çağrısının satır numarası ile öneklenecek. Beklendiği gibi, ancak istenen davranış, her satırın info'un çağrıldığı satırın satır numarasıyla öneklenmesidir.

Etrafında herhangi bir yolu var mı?

cevap

6

Yöntemleri uygun çıkışa mesaj göndermek için:

bir geçici çözüm log.Lshortfile bayrağını kaldırıp elle davranışı uygulamaktır. Logger.Output(), calldepth (atlanacak karelerin sayısı) geçirmenizi sağlar.

log.Logger için ne yazık ki yöntemleri calldepth "kablolu" içeriyor, bu yüzden sarma işlevinin çerçevesini atlamak için bir ofset sağlayamıyorsunuz.

Fakat bu daha iyi bir alternatif, bu Logger.Output()'u ambalajınızdan çağırmaktır, böylece çerçeveler ve çizgilerle kendinizi rahatsız etmenize gerek kalmaz. Ayrıca, "\n" numaralı bir satırsonu eklemeniz gerekmediğine de dikkat edin, çünkü log.Logger türü, günlüğe kaydedilecek olan mesajın bir satırsonu ile bitmemesi anlamına gelir.

Yani daha iyi ve daha kısa bir alternatif:

var myLogger = log.New(os.Stdout, "[my]", log.Lshortfile) 

func info(pattern string, args ...interface{}) { 
    myLogger.Output(2, fmt.Sprintf(pattern, args...)) 
} 

Testler:

func main() { 
    log.SetFlags(log.Lshortfile) 
    log.Println("hello") 
    info("world") 
} 

Çıkış (Go Playground üzerinde denemek):

main.go:11: hello 
[my]main.go:12: world 

Gördüğünüz gibi, info() Doğru satır numarasını yazdırır (tarafından basılan satır numarasına kıyasla +1) Bir önceki satırda.

+2

Bahsettiğim konu bu: D Great answer – Hubro

0

Bu sorunu benim şu andaki geçici çözümüm olarak ekleyecektim, ancak bunun geçerli bir yanıt olduğunu varsayalım. Birisi bana loger konfigürasyon seçeneği bana cevap verebilir Ben loger runtime.Caller çağırdığında kullandığı derinliğini ayarlamak sağlar özledim. log.Logger çağrı Logger.Output() yöntem

func info(format string, args ...interface{}) { 
    _, file, line, _ := runtime.Caller(1) 

    prefix := fmt.Sprintf("%v:%v: ", path.Base(file), line) 

    if logger != nil { 
     logger.Printf(prefix+format+"\n", args...) 
    } 
}