Archiv verlassen und diese Seite im Standarddesign anzeigen : File descriptor zuverlaessig verschieben
Huhn Hur Tu
15.03.16, 16:13
Hi,
fuer mein Glueck im Logfilehandling fehlt mir noch eine Kleinigkeit.
Beim Logrotieren soll zuverlaessig einen Datei verschiben werden, damit der dahinterliegenden Prozess in das neue Log schreiben kann, auch bei einem anhaltendem Datenstrom.
Ich habe etwas von Filedescriptoren gelesen die ich aendern muss, weiss jemand wie das zuverlaessig und einfach geht.
Die Logs werden von Log4J in einem Jboss unter Linux geschrieben
Gruss Stefan
ohne ggf. Service-Restart dürftest Du das nicht sauber hinbekommen, wenn Du nicht den Weg über "Proxies" wie rotatelogs (https://httpd.apache.org/docs/2.4/programs/rotatelogs.html) gehst.
Dinge wie http://ingvar.blog.redpill-linpro.com/2010/07/10/changing-a-process-file-descriptor-on-the-fly/ gehen zwar, elegant und sauber ist aber anders.
Bei Log4j würde ich es aber idealerweise direkt über die passende Log4j-Konfiguration lösen, das kann das nämlich von alleine.
Also der Trick den wir hier nutzen ist einfach, statt eines einfachen "mv foo.log foo.log.old" verwenden wir "cp foo.log foo.log.old && :>foo.log || fatal_cmd", jedenfalls darf die log Datei nicht gelöscht werden, wenn du den FD nicht neu initialisieren willst, was bei mv passiert...
Alternativ gibt es auch den Befehl truncate, der ist aber nicht bei allen dabei, :> klappt für mich bisher überall (sh,bash und vermutlich auch bei allen anderen shells).
[edit]Jedenfalls bleibt so ein tail -f bei der Sache, bei mv ist dann halt vorbei. Was in der Art wolltest du doch oder?
ich verstehe ihn so, daß das Logfile rotiert werden soll (und mit mv auch würde) aber der Server dann nicht ein neues Log anlegt sondern in das alte weiterschreibt. Was bei offenen Files ja auch logisch ist.
Für's lesen des Files mit tail würde sich der Aufwand nicht lohnen, das kann tail mit -F von sich aus.
Natürlich kann man z.B.
cp log log_old
echo > log machen - das geht auch, ist aber alles andere als sauber, hübsch und elegant.
Für Log4j-Anwendungen macht man das sauber über die Log4j-Konfiguration, bei allen anderen Servern, die das angeblich nicht können (was sich meist aber durch aufmerksames Dokulesen erledigt) gibt's Tools wie das z.B. oben genannte rotatelogs oder man logt in einen ded. Logserver.
ja hast du recht ist qad aber funktioniert ;)
Huhn Hur Tu
16.03.16, 08:16
Hm.. danke fuer die Ideen.
gestern fiel mir auch auf, dass Log4J ja auch selbst rotiert und nur dort groessere Logmengen zusammenkommen, deswegen hab eich jetzt eine Weiche drin, die meine Jbosss beim rotieren ignoriert
Aufruf
- LogCleanup2.sh $HOME/jboss/log/slot1 3 8 "mail@me.de" optionalstringtodisablerotate
#!/bin/bash
Logpath="$1"
Compresstime="$2"
Rmtime="$3"
Mail="$4"
JbossOrNot="$5"
Datum=$(date -d "yesterday" +%Y-%m-%d)
if [ $# -ge 4 ]; then
if [ -d $Logpath ]; then
if [ $(echo $Logpath | grep log | wc -l) -ge 1 ]; then
if [ $(echo $JbossOrNot | wc -w) -gt 0 ]; then
nice -n 19 /usr/bin/find $Logpath/* -type f -name '*.log' -exec mv -nv '{}' '{}'.$Datum \;
fi
nice -n 19 /usr/bin/find $Logpath/* -type f -name '*.log.*' ! -name '*.gz' -mtime +${Compresstime} -exec /bin/gzip -f -9 '{}' ';'
nice -n 19 /usr/bin/find $Logpath/* -type f -name '*.log.*gz' -mtime +${Rmtime} -exec rm -f '{}' ';'
else
echo "Der Pfad $Logpath sieht nicht nach Log aus, bitte verifizieren"
fi
fi
else
#echo "Skript $0 hat zu wenig Parameter" | mailx -r "$Mail" -s 'LogCleanUp2' $Mail
echo "Skript $0 hat zu wenig Parameter"
fi
um dem Rant zuvorzukommen, die Logs landen als Stream auf einem Loghobel, nur die lokalen Logs, die als Fallback rumliegen, sollen rotiert, gepackt und nach Zeitpunkt X geloescht werden
Vielleicht kann das ja jemand brauchen
Gruss Stefan
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.