FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: topfi am 12 Mai 2016, 20:22:54

Titel: [Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: topfi am 12 Mai 2016, 20:22:54
Ich habe mit Hilfe des rss-workshops von Betateilchen eine Webseite im passwortgeschützten Bereich meines Webservers (ist eine Synology) erstellt, auf der ich einen Überblick über mein FHEM (das läuft auf einem BananaPi) sehe.

Ich hätte nun gern irgendwie die Möglichkeit, die letzten - sagen wir mal 10 - Zeilen des fhem.log dort auszugeben. Ich suche erstens so etwas wie tail, um die jeweils letzten Zeilen der Datei zu sehen (funktioniert so ein Aufruf ähnlich wie curl in der cgi-Datei?) und habe zweitens keine Idee, wie ich das mit den monatlich wechselnden Dateinamen a'la fhem-2016-05.log aufrufen soll. Ich möchte gern bei den monatlichen Dateien bleiben, sonst werden die mir zu groß.

Hat jemand eine Idee für mich?

[Edit:] Lösung in Post #7  https://forum.fhem.de/index.php/topic,53318.msg451111.html#msg451111 (https://forum.fhem.de/index.php/topic,53318.msg451111.html#msg451111)
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: JoWiemann am 12 Mai 2016, 20:46:30
Hallo,

um eine Datei rückwärst zu lesen schau Dir doch mal das CPAN-Modul: File::ReadBackwards an und das Beispiel: http://perl-howto.github.io/2008/06/dateien-ruckwarts-lesen.html

Grüße Jörg
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: ernst1024 am 12 Mai 2016, 22:00:35
Die Frage ist ja auch von wo, oder womit willst du auf die Daten zugreifen? Das mit dem Namen (fhem-2016-05.log oder wie auch immer) kann man ja aus fhem heraus lösen ala fhem-%year-%mon.log oder so. Oder ähnlich mit einem shell script. Aber wäre es nicht besser direkt dbLog zu verwenden und dann mit php oder was auch immer ne mysql Abfrage zu starten? Dann schlägst du zwei Fliegen mit einer Klappe.
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: igami am 12 Mai 2016, 22:37:28
$currlogfile liefert dir den aktuellen Namen. Mit tail lassen sich die letzten Zeilen einer Datei anzeigen. Musst du nur noch kombinieren.

Grüße
igami
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: topfi am 13 Mai 2016, 14:14:44
Danke, ich glaube das bringt mich in die richtige Richtung. Ich könnte dann ein Script in die 99_myUtils.pm schreiben und das Ergebnis mit dem Text-Befehl in rss anzeigen. Ich werde das am WE mal versuchen.

Mit dblog mochte ich jetzt nicht anfangen. Ich habe überhaupt keine Ahnung von Datenbanken und das System muss funktionieren. Da muss ich mich später erst mal richtig einarbeiten.
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: topfi am 15 Mai 2016, 20:32:36
Prinzipiell funktioniert es jetzt, aber irgendetwas habe ich dabei verkehrt gemacht. Meine Sub* in der 99_myUtils.pm:


sub taillog($$){
# Aufruf taillog  filename  anzahl_zeilen

my $filename = shift or die "Usage: $0 file numlines\n";
my $numlines  = shift;
my $byte;

open FILE, "<$filename" or die "Couldn't open $filename: $!";

seek FILE,-1, 2;  #get past last eol
my $count=0;
while (1){
   seek FILE,-1,1;
   read FILE,$byte,1;
   if(ord($byte) == 10 ){$count++;if($count == $numlines){last}}
   seek FILE,-1,1;
if (tell FILE == 0){last}
}
$/=undef;
my $tail = <FILE>;
seek FILE,0, 0;
close(FILE);
return sprintf($tail);
}


Das rufe ich in der rss.layout Datei auf mit

text x y { taillog("/opt/fhem/log/fhem-2016-05.log",10)}

Das funktioniert genau einmal. Danach ist direkt in fhem die log-Datei verkehrt herum (bzw. der älteste Eintrag wieder oben, ich habe aber attr WEB reverseLogs 1 gesetzt) und auch meine SVG-Plots sind leer. Irgendwas hat er mir mit den Log-Dateien durcheinander gebracht.

Wo steckt mein Fehler?

*Code unter Ausnutzung von Beispielen aus perlmonks.org
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: topfi am 15 Mai 2016, 20:53:23
Jetzt habe ich den Perlcode mal etwas aufgeräumt, aber das hilft leider nicht:


sub taillog($$){
# usage taillog  filename  numberoflines

my $filename = shift or die "Usage: $0 file numlines\n";
my $numlines  = shift;
my $byte;

open(my $file, "<$filename") or die ("Couldn't open $filename: $!");

seek($file,-1, 2);  #get past last eol
my $count=0;
while (1){
   seek($file,-1,1);
   read($file,$byte,1);
   if(ord($byte) == 10 ){$count++;if($count == $numlines){last}}
   seek($file,-1,1);
if (tell($file) == 0){last}
}
$/=undef;
my $tail = <$file>;
seek($file,0,0);
close($file);
return sprintf($tail);
}


Habe ich hier irgendwelche globalen Zeiger verbogen? Kann doch eigentlich nicht sein, oder?
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: topfi am 15 Mai 2016, 22:32:01
So, nun möchte ich meinen heutigen abendlichen Monolog erfolgreich abschließen. Auf diese Lösung bin ich jetzt gekommen:


sub read_back($$)
{
  my ($fh,$lines)=@_;
  my $line_cnt=0;
  my $data='';

  seek($fh,0,02);
  my $pos=tell($fh);

  while($line_cnt < $lines and $pos > 0)
  {
   $pos--;
   seek($fh,$pos,00);
   my $bite=getc($fh);
   $line_cnt++ if($bite eq $/);
  }
  return <$fh>;
}

sub taillog($$){

my $filename = shift or die "Usage: $0 file numlines\n";
my $numlines  = shift;

open(my $fh,"<$filename") or die ("Couldn't open $filename: $!");
my @lines = read_back($fh,$numlines);
close($fh);
my $zeilen = join("\n",@lines);
return sprintf($zeilen);
}


Ich rufe das in der rss.layout auf mit:

text x y { taillog($currlogfile,11)}


Damit erhalte ich auf meiner Seite die letzten 10 Zeilen der aktuellen fhem.log - Datei. Ohne Nebenwirkungen.  :D

Jetzt gibt es noch ein Pfingstbierchen und dann ab ins Bett.  :o  8)
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: ernst1024 am 15 Mai 2016, 23:01:58
Super! ist doch immer ein gutes Gefühl wenn man letztlich dem Computer gezeigt hat wer der Herr im Haus ist, oder :-)
Titel: Antw:letzte n Zeilen des fhem.log ausgeben
Beitrag von: Puschel74 am 15 Mai 2016, 23:08:09
Und nun noch dem ersten Beitrag ein Gelöst spendieren damit auch andere sehen das in dem Beitrag auch die Lösung zu finden ist  ;D
Hilfreicherweise sollte dann auch im ersten Beitrag die Lösung eingearbeitet werden damit andere nicht erst lange suchen müssen - aber das steht ja alles in meinem angepinnten Beitrag  ;)
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: topfi am 15 Mai 2016, 23:25:02
Mache ich doch immer, wenn ich eine Lösung finde. :D

Ja, der Compi guckt neidisch auf mein Bierchen... :D
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: Puschel74 am 15 Mai 2016, 23:28:09
Danke und Prösterchen  ;D
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: igami am 19 Mai 2016, 18:17:23
Ich hatte eigentlich an was kürzeres gedacht :D

{qx(tail -n 11 $currlogfile)}


Grüße
igami
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: JoWiemann am 19 Mai 2016, 20:41:42
ist auch schön als cmdalias:

define lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}

Grüße Jörg
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: P.A.Trick am 22 Mai 2016, 22:31:13
Zitat von: JoWiemann am 19 Mai 2016, 20:41:42
ist auch schön als cmdalias:

define lastloglines cmdalias lastloglines .* AS {qx(tail -n $EVENT $currlogfile)}

Grüße Jörg

Cool habe ich ins Wiki aufgenommen! http://www.fhemwiki.de/wiki/Cmdalias#Beispiele
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: Pfriemler am 04 Mai 2018, 15:09:56
Ich bin ja kein Freund von Thread-Aufwärmung, aber das passt leider zu gut:

Habe cmdalias lastloglines wie im vorigen Beitrag definiert.
Funktioniert prinzipiell, liefert aber verstümmelte Zeilen - Minuten und Sekunden werden unterdrückt:

2018.05.04 14 3: CUL_HM set Lightbox1_RightDown off
2018.05.04 14 1: Fenster Bad Obergeschoss meldet Sabotagealarm
2018.05.04 14 3: CUL_HM set FK_OGBad getConfig

Passiert natürlich auch wenn ich explizit als Befehl eingebe (FHEM-Kommandozeile):
{qx(tail -n 3 /opt/fhem/log/fhem-2018-05.log)}

Auf einer putty-Sitzung liefert
tail -n 3 /opt/fhem/log/fhem-2018-05.log
aber genau die korrekten Zeilen, wie ich sie auch als letzte Zeilen im Logfile sehe, wenn ich es "normal" aufrufe.

2018.05.04 14:41:39 3: CUL_HM set Lightbox1_RightDown off
2018.05.04 14:46:40 1: Fenster Bad Obergeschoss meldet Sabotagealarm
2018.05.04 14:46:40 3: CUL_HM set FK_OGBad getConfig



Warum?
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: Otto123 am 04 Mai 2018, 15:50:32
Hi,

dein Beispiel funktioniert bei mir
2018.05.04 14:21:01 3: ABFALL Abfall - CALENDAR:AbfallKalender triggered, updating ABFALL Abfall ...
2018.05.04 14:21:01 3: ABFALL_UPDATE
2018.05.04 15:00:00 3: CUL_HM set LichtKeSW1_Sw01 on


Muss offenbar etwas "Exemplarabhängiges" sein, ich habe keine Idee was das sein könnte.

Gruß Otto
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: Wuppi68 am 04 Mai 2018, 16:18:02
deine Zeilen tun es bei mir auch problemlos .... und richtig

klingt irgendwie nach den "üblichen" Verdächtigen:

Stromversorgung
SD Karte

aber ich denke, dass hast Du schon überprüft, nicht wahr?
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: frank am 04 Mai 2018, 16:44:32
mein fhem auf pi3 mit jessie zeigt richtigerweise auch die millisekunden vom timestamp.
Titel: Antw:[Gelöst:] letzte n Zeilen des fhem.log ausgeben
Beitrag von: Pfriemler am 04 Mai 2018, 22:46:15
War ja wieder mal klar, dass das was spezielles bei mir ist. Übrigens auf unterschiedlichen Geräten - liegt also am Raspi oder FHEM.

Zitat von: Wuppi68 am 04 Mai 2018, 16:18:02
deine Zeilen tun es bei mir auch problemlos .... und richtig
klingt irgendwie nach den "üblichen" Verdächtigen:
Stromversorgung
SD Karte

Warum das einen Einfluss haben soll, erschließt sich mir jetzt überhaupt nicht. Es fehlen sauber immer die gleichen Zeichen. In der Datei sind sie natürlich, siehe Log und Befehl auf Jessie-Kommandozeile.

Seit der Geschichte mit meinen Temperatursensoren traue ich Perl alles zu ...  ;D Ich hätte auf irgendeine mitlaufende Formatierung getippt.

Und jetzt kommt der größte Brüller: Nachdem ich das heute mehrfach probiert hatte - heute abend geht alles wie es soll.

Kann das sein, dass FHEMWEB da immer die gleichen Seiten aus dem Cache geliefert hat und die einmal falsch zusammengestückert waren?
Während meiner Versuche hatte sich am Log ja nichts geändert. Aber wie gesagt: Auch auf dem Handy fehlten Minuten und Sekunden.

Ich beobachte weiter ...