FileLog loggt nicht mehr

Begonnen von Dr. Boris Neubert, 19 September 2015, 21:13:18

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Hallo,

seit einem kürzlich gemachten Update loggt FileLog in einer bestimmten Konstellation nicht mehr.

Definition:


define comp.nas.log FileLog /opt/fhem/log/comp.nas-%Y%m.log comp.nas
attr comp.nas.log archivecmd /opt/fhem/scripts/logarchive.sh %
attr comp.nas.log group NAS
attr comp.nas.log logtype text:Text
attr comp.nas.log room Control/EDV


Auf der FHEM-Konsole sieht man die Events:


inform on comp.nas
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas power: 46
ECMDDevice comp.nas CPUTemp: 38.00
ECMDDevice comp.nas SystemTemp: 33.00
ECMDDevice comp.nas PeripheralTemp: 42.00
ECMDDevice comp.nas drivepm: 255 255 255 255
WOL comp.nas.wol isRunning: true
WOL comp.nas.wol on
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas power: 45
ECMDDevice comp.nas CPUTemp: 38.00
ECMDDevice comp.nas SystemTemp: 33.00
ECMDDevice comp.nas PeripheralTemp: 42.00
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas drivepm: 255 255 255 255
ECMDDevice comp.nas power: 43
ECMDDevice comp.nas CPUTemp: 39.00
ECMDDevice comp.nas SystemTemp: 34.00
ECMDDevice comp.nas PeripheralTemp: 43.00


Die Logdatei wird noch nicht einmal angelegt, obwohl

currentlogfile /opt/fhem/log/comp.nas-201509.log

am FileLog gesetzt ist.

Möglicherweise hat Irgendeine Änderung am Code vermutlich zwischen 23.08. und 18.09. das Problem ausgelöst. Kann es etwas mit dem Handling der Archivierung zu tun haben?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Ja, HandleArchiving (und damit archivecmd) wird vom FileLog-Modul nach dem Start aufgerufen, damit logs, die nie geschrieben werden, irgendwannmal aufgeraeumt werden (Forum #39792).

Dass wegen dieser Aenderung archivecmd ploetzlich intelligenter sein muss, und die gerade angelegte Datei nicht einfach wegraeumen darf, war mir (bis gerade eben) nicht bewusst.

Dr. Boris Neubert

Drei Wochen war der Effhemm krank! Jetzt loggt er wieder, Gott sei Dank!

(Frei nach Wilhelm Busch, Die beiden Enten und der Frosch)
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Wieso Effhemm?
Es heisst nur Femm.

Dr. Boris Neubert

***Schluck***

Dann muss es (näher am Original) "war der Femm so krank" heißen.

Und die Zukunft gehört den Fhembots (https://www.google.de/search?q=fembots&safe=off&source=lnms&tbm=isch&sa=X).

*Duck und weg*
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig


Dr. Boris Neubert

Leider auch beim Logging.

Hattest Du eine Änderung eingecheckt? Die Version im Repo ist vom 22.08.2015 und ich bekomme auch kein Log angelegt.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

Nein.

Wie geschrieben: Seit der Aenderung vom 9. August muss archivecmd intelligent sein, und darf nur alte Dateien wegraeumen. Davor wurde HandleArchiving nur vor dem Dateiwechsel aufgerufen. Dateiwechsel findet bei FileLog dann statt wenn ein Event geschrieben werden soll, und das aktuelle Datum nicht zum Dateinamen passt. Die Aenderung wurde eingebaut, damit leere Dateien (d.h. FileLogs mit nie erfuellten Regexp), bei denen nie ein Dateiwechsel stattfindet, auch mal weggeraeumt werden.

Dr. Boris Neubert

Das bedeutet also, dass der Anwender sich darum kümmern muss, dass archivecmd nur alte Dateien wegräumt?

Aus der commandref

archivecmd / archivedir / nrarchive
When a new FileLog file is opened, the FileLog archiver wil be called. This happens only, if the name of the logfile has changed (due to time-specific wildcards, see the FileLog section), and there is a new entry to be written into the file.
If the attribute archivecmd is specified, then it will be started as a shell command (no enclosing " is needed), and each % in the command will be replaced with the name of the old logfile.
If this attribute is not set, but nrarchive and/or archivecmd are set, then nrarchive old logfiles are kept along the current one while older ones are moved to archivedir (or deleted if archivedir is not set).
Note: setting these attributes for the global instance will effect the FHEM logfile only.

kann ich das nicht erkennen. Und ich wüsste auch nicht, wie das Shell-Skript wissen soll, dass die Datei "alt" ist. Ich glaube, dass archivecmd dadurch unbenutzbar ist.

(Bin ich der einzige, der diese Funktion nutzt?)

Die Anleitung stimmt nicht ganz. HandleArchiving geht so:
- wenn archivecmd gesetzt ist, wird es ausgeführt.
- sonst wird die FHEM-interne Archivierung genau dann angestoßen, wenn nrarchive vorhanden ist.
- dabei findet eine Archivierung der Log-Datei statt, wenn archivedir gesetzt ist, ansonsten wird die Log-Datei gelöscht.

Hilfreich wäre es für den Anwender, dann auch gleich folgenden Trick an dieser Stelle zu verraten, um die Attribute für alle FileLogs zu setzen:



Use the following command at the end of the configuration after all FileLog devices have been defined to set archiving globally (but not for the global FHEM log):

attr TYPE=FileLog nrarchive 3
attr TYPE=FileLog archivedir /protege/moi/


Was will ich eigentlich? Ich will, dass die Datei beim Archivieren nicht nur verräumt sondern auch komprimiert wird. Ich rege folgende Änderung in HandleArchiving an (ungetestet):

Neues Attribut:

doAfterArchive
If this attribute is given, then it will be started as a shell command (no enclosing " is needed), and each % in the command will be replaced with the name of the old logfile after it was moved to the archivedir. For example, this can be used to compress the archived files: attr MyFileLog bzip2 %.


  for(my $i = 0; $i < $max; $i++) {
    if($ard) {
      Log 2, "Moving $files[$i] to $ard";
      myrename("$dir/$files[$i]", "$ard/$files[$i]");
      my $par = $attr{$ln}{doAfterArchive};
      return if(!defined($par));
      $par =~ s/%/$log->{currentlogfile}/g;
      Log 2, "Archive: postprocessing " . $files[$i] . " with $par";
      system($par);
    } else {
      Log 2, "Deleting $files[$i]";
      unlink("$dir/$files[$i]");
    }
  }


Viele Grüße
Boris


Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

justme1968

wäre es nicht sinnvoll das komprimieren (optional) auch gleich fhem machen zu lassen wenn es die files sowieso schon anfasst und an eine andere stelle verschiebt? ohne das hierzu noch ein shellscript angelegt werden muss.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Dr. Boris Neubert

Neues Attribut:


compressArchive
compresses a log file with gzip after it has moved to the archive directory


Codespende (ungetestet):

    eval { require IO::Compress::Gzip; };
    if($@) {
      Log 1, "Archive: compression requested but cannot load IO::Compress::Gzip";
    }
    else {
      Log 4, "Archive: compressing " . $files[$i] ;
      gzip $files[$i] => $files[$i] . ".gz" || Log 1, "Archive: compression failed ($@)";
    }
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

rudolfkoenig

1. Beim Initialen Aufruf von HandleArchiving wird archivecmd nicht mehr ausgefuehrt.
Damit werden zwar in komischen Konstellationen Dateien mit archivecmd nicht oder erst verspaetet weggeraeumt, aber das war vor meiner urspruenglichen Aenderung auch der Fall.

2. Ich habe das Attribut archiveCompress eingefuehrt (so rum passt es besser zu den anderen Attributen), verwendet wird das Compress::Zlib Modul, was auch anderswo zum Einsatz kommt.