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
@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? –