LogRotate verwendet Regex für Dateinamen

7168
Phill Pafford

Ich habe eine benutzerdefinierte Protokollierungsklasse, die für jede Instanz des Prozesses ein Protokoll erstellt und dem Protokolldateinamen eine eindeutige ID hinzufügt. Beispiel:

  • process.1234.log
  • process.1235.log

Ich kann auch einen Datums- / Zeitstempel hinzufügen, Beispiel:

  • process.1234.03012012.log
  • process.1235.03012012.log

Kann LogRotate einen regulären Ausdruck verwenden, damit ich meine Protokolldateien nach Datum und / oder Prozess-ID archivieren kann?

3

1 Antwort auf die Frage

5
deoren

Ich weiß nicht, ob spätere Versionen dies tun, aber nachdem ich weiter recherchiert hatte, stellte ich fest, dass Shell-Platzhalter unterstützt werden. Sowohl *(mit mehreren Zeichen übereinstimmen) als auch ?(mit einem einzelnen Zeichen) können zu bestimmten Dateien kombiniert werden.

Als Beispiel sind hier Muster, die zu Ihrem Anwendungsfall passen, zusammen mit dem Rest einer Datei, die unter gefunden werden kann /etc/logrotate.d/process

/path/to/my/logfiles/process.????.????????.log /path/to/my/logfiles/process.????.log {  # Look for previously matched log files and rotate daily if found daily  # use date as a suffix of the rotated file dateext  # Compress log file, optional if the files are small enough compress  # Allow for a log file pattern to NOT match in order to support both # filename formats missingok  # Do not create replacement log files, the application will do that nocreate  # Keep 30 days worth of rotated logs maxage 30 } 

Wenn Sie jedoch beabsichtigen process, ein Platzhalter für eine tatsächliche Prozess-ID zu sein, können Sie meiner Meinung nach mit einem Platzhalter anstelle der Prozess-ID-Nummer wie folgt umgehen:

/path/to/my/logfiles/*.????.????????.log /path/to/my/logfiles/*.????.log { ... } 

Ich hoffe das hilft. Ich suchte auch nach einem regulären Regex-Ansatz, der funktionieren sollte, und entschied mich schließlich für die Verwendung von Shell-Platzhaltern anstelle von meiner Meinung nach praktikablen, aber komplexeren Lösungen.

Ein Beispiel:

Auf der Suche nach einer Regex-Lösung fand ich einen Blogbeitrag mit dem Titel " Dateien von logrotate-globbing-Matches ausschließen ", die diese Lösung bereitstellten :

/var/log/upstart/*.log { daily missingok rotate 7 compress notifempty nocreate nosharedscripts prerotate bash -c "[[ ! $1 =~ testprogram ]]" endscript } 

Ich zog am Ende zwei Punkte aus diesem Beispiel heraus und änderte das Match leicht. In meiner Situation wollte ich alle Dateien in einem Verzeichnis drehen, mit Ausnahme einiger Eingabedateien, die eine .inpErweiterung haben.

Das ist was ich mir ausgedacht habe:

# Force the prerotate "script" below to be run on each individual file # in order to verify that it isn't an unprocessed input file nosharedscripts  # Skip rotating any unprocessed input files (*.inp extension) prerotate bash -c "[[ ! $1 =~ \.inp$ ]]" endscript 

Demnach logrotate -d /etc/logrotate.d/myfilenamescheint es zu funktionieren. Wie ich jedoch erwähnte, entschied ich mich für die Shell-Wildcards-Annäherung, da es für jemanden, der hinter mir kam, leichter zu halten schien.

Ist die bash -c erforderlich? Ich denke, zumindest unter Linux würde die / bin / sh diese Syntax direkt unterstützen. Peter vor 6 Jahren 0
@Peter Nicht sicher. Am Ende habe ich eine andere Richtung eingeschlagen, also glaube ich nicht, dass ich weiter getestet habe, als ich bemerkt habe. Wenn Sie testen und bestätigen, werde ich gerne meine Antwort aktualisieren, um hervorzuheben, was notwendig ist / nicht. deoren vor 6 Jahren 0