2016-08-09 113 views
8

Ich muss die Protokolle täglich außer der Datei für den aktuellen Tag drehen. Ich verwende Winston und winston-daily-rotate-Datei Bibliotheken.Wie rotieren täglich Protokolle mit Winston außer dem ersten Tag

Im folgenden Beispiel wird eine Datei "info.log.2016-08-09" nur beim ersten Ausführen des Knotens generiert.

Aber ich muss wirklich die Datei "info.log" generieren, und nach diesem Tag sollte in "info.log.2016-08-09" umbenannt werden, und erstellen Sie eine neue "info.log" für der aktuelle Tag. Ich verstehe, dass dies das normale Verhalten in anderen Anwendungen ist.

var logger = new (winston.Logger)({ 
 
    transports: [ 
 
    new dailyRotateFile( 
 
     { 
 
     name: 'cronInfo', 
 
     filename: path.join(__dirname,"log", "info.log"), 
 
     level: 'info', 
 
     timestamp: function(){     
 
     return utils.formatDate(new Date(), "yyyy-mm-dd'T'HH:MM:ss.l'Z'") 
 
     }, 
 
     formatter: function(options) { 
 
      return options.timestamp() +' ['+ options.level.toUpperCase() +'] '+ (undefined !== options.message ? options.message : '') + 
 
       (options.meta && Object.keys(options.meta).length ? '\n\t'+ JSON.stringify(options.meta) : '');   
 
     }, 
 
     json:false, 
 
     datePattern:".yyyy-MM-dd" 
 
    }) 
 
    ] 
 
}); 
 

+0

Wenn die Anwendung gestartet wird, können Sie den Timer auf 'time-to-change-log-name' setzen. On Timer: Log-Datei umbenennen, neue 'info.log' durch' Sync'-Funktion erstellen, um 'Winston'-Aufrufe zu vermeiden, nächsten Timer einstellen. Vielleicht muss "Winston" neu gestartet werden, um den Deskriptor/Stream der Logdatei zu aktualisieren (ich bin mir nicht sicher, ob es möglich ist). –

+0

https://github.com/winstonjs/winston-daily-rotate-file/issues/23 – Arjan

Antwort

2

Nun ja, eine Abhilfe kann man mehr Verkehr haben

Genau wie diese info.log:

var logger = new (winston.Logger)({ 
    transports: [ 
    new dailyRotateFile( 
     { 
     //your definition of rotate file 
     }), 
    new (winston.transports.File)({ filename: 'info.log' }) 
    ] 
}); 

und dann einige cron einrichten löschen info.log um Mitternacht, dh node-schedule

Mit diesem Ansatz kann es jedoch wenig Inkonsistenzen geben, wenn etwas über Mitternacht läuft, kann es wenige Zeilen in das info.log schreiben, das zum nächsten Tag gehört und dann gelöscht wird, daher kann info.log nicht abgeschlossen werden.

Aber alle Protokolle mit diesem info.log.2016-08-09 Format bleibt voll und unberührt.

So ist es zu prüfen, wenn sehr kleine Chance, unvollständiges info.log für einen Tag zu haben, annehmbar ist. (Sie können jedoch auch erweiterte Checker erstellen, die nicht nur Dateien löschen, sondern auch nach neuen Dateien suchen. Wenn ja, sieht es nach dem Inhalt aus und löscht nur die Logs früherer Tage aus info.log und löscht sie nicht auf einmal)