2016-03-21 19 views
1

Üretimde go dili kullanan herkes günlük dosyalarının yuvarlanmasıyla sorun mu yaşıyor?Günlük dosyasının en iyi yolu GO

Günlük dosyası iş parçacığı güvenli bir şekilde döndürme olanağı var mı?

Bunu yapan herhangi bir çerçeve var mı?

Teşekkür ederiz.

+0

Ben gerçek kullanıcı deneyimi ilginç olduğum @evanmcdonnal:

normal günlük sadece bunu ayarlamak için bir kod satırı ekleyin kullanmak ve kullanımı çok basit

. Sanırım insanlar binlerce günlük dosya ile aynı sorunları yaşadılar. Kesin uygulama önerebilir misiniz? –

cevap

1

here İşte bir iç çözüm sözü edildiği gibi sistem, sizin için günlükleri döndürmek var. Başka bir goroutines'ten günlükleri aldığı bir kanalla günlük kaydı ve günlük rotasyonundan sorumlu tek bir goroutine sahip olmayı düşünebilirsiniz. Döndürülme zamanı geldiğinde, goroutine, diğer goroutines gelen gelen günlükleri kanalda sıralanır iken, günlüğü döndürecektir. Kayıt döndürme işlemi tamamlandıktan sonra kanaldaki her şeyi yok eder ve kayıt devam eder. çizgisinde

şey:

type Log struct { 

    log string 
    // other info you might want 
} 

// This will be your goroutine 
func Logging(LogChannel chan Log) { 

    // assume logger creates/opens a file and prepares it for writing 
    logger := New(logger) 

    for { 

     // collect a log. Will also block until a log is available on the channel 
     log <- LogChannel 

     if timeToRotate() { 

      RotateLogFile(logger) 

     } 

     // write log 
     logger.Log(log) 
    } 
} 

DÜZENLEME: önceki kod günlük dosyası dönersem kontrol ettikten sonra engelleme çağrısı vardı. Günlük dosyası i https://github.com/natefinch/lumberjack ile iyi başarı elde ettik

+0

Mükemmel bir çözüm gibi görünüyor! –

2

Genelde yaptığım şey doğrudan günlük dosyaları kullanmamaktır. Ya bir yazara ya da kafka gibi bir ağ günlüğüne yazarsın; Ya da tercihen, stdout/stderr'a yazarsınız ve servis sağlayıcısına, günlük dosyalarına yazma, bir ağ günlüğüne iletme veya dosyaları döndürme ile ilgilenirsiniz.

+0

Bunun için hangi servis aracısını önerirsiniz? – AJPennster

+0

runit bunu yapabilir IIRC –

2

12 Factor std hata günlüğüne kayıt yapma ve döndürme işlemiyle başka bir şey yapmanıza izin verme eğilimindeyim.

Sonra

+0

Kesinlikle katılıyorum. Her biri için düzinelerce (veya 100'lerce) örneğiyle, 15'ten fazla projeniz olduğunda, tüm çıktısını günlüğe kaydetme için stdout/stderr'a sahip olursunuz. Bu, devops ekibinin (veya kendinizin) ancak gerekli olan günlük kaydını boşaltmasına izin verir. Örneğin, uyarıları filtreleyip gruplandırabileceğiniz ve ayarlayabileceğiniz AWS CloudWatch Günlükleri servisine yönlendirin. – eduncan911

2

döndürülmüş sonra günlüğünü yazmaya olasılığını önlemek için timeToRotate işlev çağrısı önüne koymayı iyidir öyle golang standart ve hafıza verimli "kütüğün üzerinde hafif ve domuz sırtları "pkg.

log.SetOutput(&lumberjack.Logger{ 
    Filename: "/var/log/myapp/foo.log", 
    MaxSize: 500, // megabytes 
    MaxBackups: 3, 
    MaxAge:  28, //days 
}) 
+0

Bunu da küçük bir proje için kullandım. Ancak, herhangi bir büyük ölçekli dağıtım için, diske giriş yapmaktan kaçının ve stdout/stderr öğesine gidin ve altyapının kütle kaydıyla uğraşmasına izin verin. – eduncan911

İlgili konular