So erstellen Sie von Rotatelogs erstellte Protokolle

9

Ich verwende Rotatelogs, um meine täglichen Apache-Protokolle im Format zu erstellen host.<day>.<month>.<year>.access.log. Jetzt möchte ich das Protokoll gzipen und in ein anderes Verzeichnis verschieben, nachdem es fertig ist. Wie geht das?

Update: Es gab einen kleinen Fehler. logrotate->rotatelogs

Poma
quelle
Vielen Dank für die Korrektur der Frage. Ich habe meine ungenaue Antwort entfernt.
Jscott
Sie können ein einfaches Skript schreiben, das die alten Dateien gzip und an einen anderen Speicherort verschiebt / kopiert. Dieses Skript kann in einem täglichen Cron-Job aufgerufen werden.
Khaled
Ich bin nicht mit Shell-Skripten vertraut. Insbesondere weiß ich nicht, wie ich eine Dateinamenzeichenfolge für das gestrige Datum generieren soll.
Poma

Antworten:

8

Sie können die Rotatelogs- Option -p verwenden , um ein Programm zum Komprimieren des Protokolls nach der Rotation zu verwenden. (Siehe als Referenz: https://httpd.apache.org/docs/2.4/programs/rotatelogs.html )

-p Programm

Wenn angegeben, führen rotatelogs das angegebene Programm jedes Mal aus, wenn eine neue Protokolldatei geöffnet wird. Der Dateiname der neu geöffneten Datei wird als erstes Argument an das Programm übergeben. Bei der Ausführung nach einer Rotation wird die alte Protokolldatei als zweites Argument übergeben. rotatelogs wartet nicht auf das Beenden des angegebenen Programms, bevor der Betrieb fortgesetzt wird, und protokolliert keinen Fehlercode, der beim Beenden zurückgegeben wird. Das erzeugte Programm verwendet dasselbe stdin, stdout und stderr wie rotatelogs selbst und erbt auch die Umgebung.

Beispiel:

CustomLog "|bin/rotatelogs -p '/path/to/compress.sh' -l /var/log/logfile.%Y.%m.%d 86400"

compress.sh :

#!/bin/bash
file_to_compress="${2}"
compress_exit_code=0

if [[ "${file_to_compress}" ]]; then
    echo "Compressing ${file_to_compress} ..."
    tar --gzip --create --file "${file_to_compress}.tar.gz" "${file_to_compress}"

    compress_exit_code=${?}

    if [[ ${compress_exit_code} == 0 ]]; then
        echo "File ${file_to_compress} was compressed."
    else
        echo "Error compressing file ${file_to_compress} (tar exit code: ${compress_exit_code})."
    fi
fi

exit ${compress_exit_code}
Enrique Rivera
quelle
IMHO ist dies die beste Antwort (+1). 1) Wenn Sie die unkomprimierten Dateien nicht behalten möchten, fügen Sie --remove-filesin ein tar. 2) Abhängig von Ihrem Fall kann es auch interessant sein, dies aufzunehmen --verify.
Mark Messa
5

Ich habe mir das folgende Skript ausgedacht

#!/bin/sh
for file in $(ls /var/log/apache2/*.$(date +"%y.%m.%d" --date="1 day ago").access.log); do
    gzip $file
    mv $file.gz /var/log/apache2/archive
done;

Und nach dem Cron-Eintrag

15 0    0 0 0   root    /mypath/myscript.sh
Poma
quelle
2

Logrotate übernimmt gerne die Komprimierung für Sie. Einfach hinzufügen:

compress

Zur logrotate Konfiguration für Apache. Es gibt auch eine nette Option, die die Komprimierung um einen Tag verzögert:

delaycompress

Logrotate kann Ihnen beim Verschieben nicht helfen, aber ein Cron-Job wie dieser kann:

@daily mv /var/log/apache/*.gz /var/log/archive/
Ladadadada
quelle
2
logrotatebietet die olddirOptionen, mit denen die Protokolle verschoben werden können - siehe man logrotate. Das OP hat die Frage bearbeitet, um anzuzeigen, dass er sie nicht verwendet . rotatelogs logrotate
Jscott
Ah, das heißt, ich belle den falschen Baum an. Und ich wusste nicht einmal über die olddirOption. Das obige Shell-Skript scheint die beste Lösung zu sein.
Ladadadada
2
logrotate ist kein rotatelogs!
MUY Belgien
1

Ich benutze find und crontab, um dies zu erreichen

# crontab -e

5 0 * * * / bin / find / path / to / logs / * -Typ f \ (-mtime 1! -Name ". "! -Name " .gz" \) -print0 | xargs -0 gzip> / dev / null 2> & 1;

-mtime n Die Daten der Datei wurden zuletzt vor n * 24 Stunden geändert.

! -name "nicht". * "versteckte Dateien

! -name "nicht" .gz "-Dateien, die bereits komprimiert werden sollten

-print0 & -0 um sicherzustellen, dass Leerzeichen oder Sonderzeichen korrekt an xargs -> gzip weitergeleitet werden (zur Sicherheit des Dateinamens)

find -exec könnte verwendet werden, weist jedoch Fehler auf, bei denen | xargses stabiler ist

user3258557
quelle
1
CustomLog "|/opt/IHS/bin/rotatelogs -l /some/path/access_log.%Y.%m.%d 86400" common | gzip -9 /some/path/access_log.`date '+%Y.%m.%d'`
Arek
quelle
Hallo Arek und willkommen auf SF. Bitte nehmen Sie sich einen Moment Zeit, um diesen Artikel zu lesen .
Marco