Donnerstag, 20. August 2015

Hilfe! Mein Log File läuft über

Gestern habe ich mit einem FHEM Modul für LG Fernseher gespielt. Es war das Falsche wie sich schnell herausgestellt hat. Nun ja, gelöscht und gut!?
Heute konnte ich mein Log File nicht öffnen, bzw. hat es ewig gedauert. Toll plötzlich 132 MB groß!
Das LGTV Device war zwar gelöscht aber das Modul noch aktiv und das hat ca. 70 mal in  der Sekunde rumgejammert, dass da kein Fernseher ist. Um das Problem erstmal zu stoppen:
shutdown in der FHEM Befehlszeile eingeben. Oder im Terminal:
 sudo invoke-rc.d fhem stop  
Und nun? Log File weg schmeißen und neu anfangen? Muss nicht sein, Linux hilft und ist genial wenn man weiß wie. Ich weiß die Linuxer werden jetzt müde lächeln. Also Terminal auf und los:
 sudo cat /opt/fhem/log/fhem-2015-08.log |grep -v "LGTV" > /opt/fhem/log/fhem-2015-08.txt  
Damit wird das Logfile neu geschrieben und alle Zeilen mit LGTV werden ausgelassen (Option -v)  (es waren ca 3,3 Mio Zeilen). Das dauert wenige Sekunden, ein Benchmark der besonderen Sorte.
Jetzt stimmt der neue Name nicht und die Berechtigung (Ich war als pi angemeldet).
Anschließend FHEM wieder starten.
 sudo rm /opt/fhem/log/fhem-2015-08.log  
 sudo mv /opt/fhem/log/fhem-2015-08.txt /opt/fhem/log/fhem-2015-08.log  
 sudo chown fhem:dialout /opt/fhem/log/fhem-2015-08.log  
 sudo invoke-rc.d fhem start  

Hinweis

Je nach konkreter Systemumgebung kann es sein, dass die erste Zeile so nicht läuft, da grep die sudo Rechte nicht erbt. Dann hilft die sudo "shell" mit
 sudo -i  
und man kann die ganzen sudo weglassen. Mit exit wird die sudo shell wieder verlassen.

Wer es öfters braucht: man kann auch ein kleines Script machen, wo lediglich der Suchbegriff angepasst werden muss. Achtung die eigentliche Version des Scripts schafft Tatsachen. Deshalb erstmal testen und dann die entscheidenden Kommentarzeichen löschen.
Grep sucht nach Regular Expressions - man kann die Suche auch komplexer oder feiner machen. Mein Script sucht einfach nach der Textkette (Auch mit Leerzeichen):
#!/bin/bash
# Script entfernt Zeilen aus dem aktuellen Log File von FHEM
# Suchbegriff für die Zeile die entfernt werden soll
STR="LGTV"
month=$(date +%Y)-$(date +%m)
service fhem stop

cat /opt/fhem/log/fhem-$month.log |grep -v "$STR" > /opt/fhem/log/fhem-$month.txt$
#rm /opt/fhem/log/fhem-$month.log
#mv /opt/fhem/log/fhem-$month.txt /opt/fhem/log/fhem-$month.log
#chown fhem:dialout /opt/fhem/log/fhem-$month.log

service fhem start

Zwei Jahre später habe ich dazu gelernt:
Man kann vieles direkt in der FHEM Kommandozeile machen:
LogFile kurzerhand auf 0 setzen:
{qx(truncate $currlogfile --size 0);;Log 1, "Logfile gelöscht"}
Die Ausgabe des korrigierten aktuellen Logfiles direkt im Browser betrachten:
{`sed /<Suchmuster in der Zeile>/d $currlogfile`}
Oder mit Umwegen auch wieder zurückschreiben und das LogFile funktioniert weiter:
{qx(sed /<Suchmuster in der Zeile>/d $currlogfile > temp.log ;; cp temp.log $currlogfile;; rm temp.log);;Log 1, "Logfile manipuliert"}

Das Tool sed kann zwar einfach Zeilen aus dem Textfile löschen, aber danach wird das LogFile nicht weiter beschrieben.
sed -i /<Suchmuster in der Zeile>/d <Logfile>


Hier habe ich noch ein paar nützliche sed Script Beispiele gefunden.

Keine Kommentare:

Kommentar veröffentlichen