2016-03-21 13 views
1

Ist jemand, der Sprache in der Produktion verwendet, mit Problemen beim Rollen von Protokolldateien konfrontiert?Die beste Methode, um eine Protokolldatei in GO zu rollen

Gibt es eine Möglichkeit, Protokolldatei Thread sicher zu rollen?

Gibt es irgendwelche Frameworks, die das machen?

Vielen Dank.

+0

@evanmcdonnal ich Erfahrung realer Benutzer interessant bin. Ich vermute, dass die Leute mit tausenden von Log-Dateien dieselben Probleme hatten. Können Sie eine genaue Implementierung empfehlen? –

Antwort

1

Hier ist eine interne Lösung. Sie können in Betracht ziehen, eine einzige Goroutine zu haben, die für das Protokollieren und Protokollieren der Rotation mit einem Kanal verantwortlich ist, auf dem sie Logs von anderen Goroutines erhält. Wann immer es an der Zeit ist, zu rotieren, wird die Goroutine das Log rotieren, während die eingehenden Logs von anderen Goroutinen in den Channel eingereiht werden. Wenn die Protokollrotation abgeschlossen ist, entfernt sie alle auf dem Kanal befindlichen Einträge und protokolliert sie weiter.

Etwas entlang der Linien von:

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

EDIT: Der vorherige Code hatte den blockierenden Aufruf nach der Überprüfung, ob die Protokolldatei gedreht. Es ist besser, sie vor dem timeToRotate Funktionsaufruf zu setzen, die Möglichkeit des Schreibens das Protokoll nach der Protokolldatei

mit https://github.com/natefinch/lumberjack gedreht hat
+0

Das sieht nach perfekter Lösung aus! –

2

Was ich normalerweise tun, ist nicht Log-Dateien direkt zu verwenden. Entweder schreibst du in einen Netzwerklogger, wie Schreiber oder Kafka, usw .; Oder Sie schreiben vorzugsweise in stdout/stderr und lassen sich vom Service-Runner in Log-Dateien schreiben, an einen Netzwerk-Logger weiterleiten oder die Dateien rotieren.

+0

Welchen Service-Läufer empfehlen Sie dafür? – AJPennster

+0

runit kann das tun IIRC –

2

Ich neige dazu, die 12 Factor Ansatz der Protokollierung auf STD Fehler und lassen etwas anderes mit der Rotation beschäftigen.

Dann müssen Sie das System die Protokolle für Sie drehen, wie erwähnt here

+0

Absolut zustimmen. Wenn Sie mehr als 15 Projekte mit Dutzenden (oder 100) Exemplaren jedes Exemplars ausführen, möchten Sie, dass alle Ausgaben stdout/stderr für die Protokollierung ausgegeben werden. Dies ermöglicht es dem Entwicklerteam (oder Ihnen selbst), die benötigte Protokollierung auszulagern. Sie können es beispielsweise in den AWS CloudWatch Logs-Dienst streamen, wo Sie Warnungen filtern, gruppieren und einrichten können. – eduncan911

2

Ich habe gute Erfolge zu verhindern, es ist leicht und Schweinchen Rücken golang Standard und Speicher effizient „log "Pkg.

sehr einfach zu verwenden, fügen Sie einfach eine Zeile Code um es einzurichten, und verwenden Sie wie gewohnt einloggen:

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

Ich habe das auch für kleine einmalige Projekte benutzt. Vermeiden Sie jedoch bei jeder groß angelegten Bereitstellung die Protokollierung auf Festplatte und wechseln Sie zu stdout/stderr, und lassen Sie die Infrastruktur mit Massenprotokollierung umgehen. – eduncan911

Verwandte Themen