PDA

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

marce
15.03.16, 16:21
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.

nopes
15.03.16, 16:47
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?

marce
15.03.16, 18:04
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.

nopes
15.03.16, 18:24
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