Heute beim Durchlesen der HLDS-Mailing-List, bin ich auf das hier gestoßen:
Hi!
Anyone here that has any log-scripts for their hlds/srcds setups that moves yesterdays logs to a folder with yesterdays date?
Windows/Unix
------
//Rikard 'Zapy' Bremark
Er möchte also ein Script, dass die Logdateien des Servers in Unterverzeichnisse packt, die das jeweilige Datum haben.
Die erste Antwort auf seinen Beitrag hatte schon eine sehr einfache Lösung parat.
|
Quellcode
|
1
2
|
crontab -e:
0 0 * * * cd /path/to/logs/ && mkdir "`date +%F`" && mv *.log "`date +%F`"
|
Hier ist aber das Problem, dass bereits existierende Logdateien zur ersten Ausführung des Cronjobs alle in ein Unterverzeichnis mit dem Datum des Ausführungszeitpunktes verschoben werden. D.h. wer im Nachhinein seine Logs sortieren möchte, kann diese Methode nicht einsetzen. An den nachfolgenden Tagen würde das Script die Dateien in die richtigen Verzeichnisse packen.
Ich kam zu dem Schluss, dass es vielleicht besser wäre den Zeitstempel der Dateien auszulesen. Die Dateinamen der Logdateien beinhalten z.B. das Jahr nicht. Mehr zum Format der Logdateien kann bei uns im
Wiki eingesehen werden. Letztendlich wäre es mir zu umständlich gewesen jede Datei einzeln nach dem Inhalt auszulesen, nur um das Jahr zu erfahren.
Für diese Aufgabe habe ich dann kein kleines Python-Script geschrieben, welches die Aufgabe erledigt:
|
PHP-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#!/usr/bin/python
from glob import iglob
from shutil import move
from datetime import datetime
from os import chdir, path, mkdir, stat
import sys
def usage():
print "Please run the Programm with %s /path/to/srcds_logfiles" % sys.argv[0]
sys.exit()
if len(sys.argv) <= 1:
usage()
now = datetime.today().strftime('%Y-%m-%d')
if path.isdir(sys.argv[1]):
chdir(sys.argv[1])
for log in iglob('L???????.log'):
log_date=datetime.fromtimestamp(stat(log)[8])
dirname=datetime.strftime(log_date,'%Y-%m-%d')
if dirname == now:
continue
if not path.isdir(dirname) and not path.isfile(dirname):
mkdir(dirname)
if not path.isfile(path.join(dirname,log)):
move(log,dirname)
else:
usage()
|
Funktion des Programms
Es erstellt für jedes Datum der Logdateien ein Unterverzeichnis im angegebenen Pfad und verschiebt diese dort hin.
Aufruf des Scripts
|
Quellcode
|
1
|
log_sort.py /pfad/zu/den/logs
|
Update
Script wurde so erweitert, dass Logs des aktuellen Tages nicht verschoben werden. Des Weiteren wird jetzt auch überprüft, ob eine Datei schon vorhanden ist. Sollte sie doppelt sein, kommt es jetzt nicht mehr zum Programmabbruch.
Unter anderem hab ich auch vergessen zu dem Pfad zu wechseln. Solange das Script im gleichen Verzeichnis ausgeführt wurde, wurden die Logs gefunden. Sobald man das Script außerhalb des Log-Verzeichnisses aufgerufen hat, passierte nichts.
Windows
Für Windows habe ich das Programm kompiliert. Somit ist eine Pythoninstallation nicht notwendig.
Download
Rapidshare-Mirror
MD5
|
Quellcode
|
1
2
|
7a3364ac975ca9cb66c1ee11b4521d76 log_sorter.exe
c94ee175212d0f745a91f8c0a9f0be67 log_sorter.zip
|
Beispiel
|
Quellcode
|
1
|
log_sorter.exe C:\HLServer\orangebox\cstrike\logs
|