[Gelöst:] letzte n Zeilen des fhem.log ausgeben

Begonnen von topfi, 12 Mai 2016, 20:22:54

Vorheriges Thema - Nächstes Thema

topfi

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

JoWiemann

#1
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
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

ernst1024

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.
Gruß Ernst

igami

$currlogfile liefert dir den aktuellen Namen. Mit tail lassen sich die letzten Zeilen einer Datei anzeigen. Musst du nur noch kombinieren.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

topfi

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.

topfi

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

topfi

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?

topfi

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)

ernst1024

Super! ist doch immer ein gutes Gefühl wenn man letztlich dem Computer gezeigt hat wer der Herr im Haus ist, oder :-)
Gruß Ernst

Puschel74

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  ;)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

topfi

Mache ich doch immer, wenn ich eine Lösung finde. :D

Ja, der Compi guckt neidisch auf mein Bierchen... :D

Puschel74

Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

igami

Ich hatte eigentlich an was kürzeres gedacht :D

{qx(tail -n 11 $currlogfile)}


Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

JoWiemann

ist auch schön als cmdalias:

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

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

P.A.Trick

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
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn