Logfile per TelegramBot senden

Begonnen von andies, 20 Februar 2020, 08:18:07

Vorheriges Thema - Nächstes Thema

andies

Ich will mir jeden Morgen um sechs die Logfileeinträge von gestern und heute (also die bis 6:00) zusenden und die Einträge auf insgesamt 20 Zeilen begrenzen. Hier der Code. Ist sicher nicht elegant, vielleicht kann das ja jemand kürzer schreiben, aber es geht - gerade getestet:

<edit>Ich habe nach Beta-Users Beitrag meinen Code etwas angepasst (FileRead statt qx). Sein Code bleibt professioneller, das sieht man auf den ersten Blick.
sub LogFileEintraegeSenden(){
# Datum holen
my $datum = POSIX::strftime("%Y-%m",localtime(time));
my $today_log = POSIX::strftime("%Y.%m.%d",localtime(time));
my $yesterday_log = POSIX::strftime("%Y.%m.%d",localtime(time-24*60*60));

my $nachricht = "";
my ($err, @nachrichtenliste) = FileRead({FileName => "/opt/fhem/log/fhem-$datum.log", ForceType => "file"});
if ($err) {
$nachricht = "Fehler beim Lesen der Logdatei /opt/fhem/log/fhem-$datum.log: $err";
} else {
# die letzten 20 Zeilen holen
my @datatosend;
    if (@nachrichtenliste > 19) {
      @datatosend = @nachrichtenliste[-20..-1];
    } else {
      @datatosend = @nachrichtenliste;
}

foreach my $nachrichtenzeile(@datatosend){
$nachrichtenzeile =~ s/[;&><]//g;  ##Semikolon entfernen, siehe https://core.telegram.org/bots/api#markdown-style
if ((substr($nachrichtenzeile, 0, 10) eq $today_log) or (substr($nachrichtenzeile, 0, 10) eq $yesterday_log)){
$nachricht .= substr($nachrichtenzeile, 11)."\n";
    }
}
}
fhem("set TelegramBot _msg ```".$nachricht."```");
}
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

Beta-User

Nette Idee!

Hab' mal ein wenig gespielt, scheint grundsätzlich zu funktionieren...

Aufruf dann mit dem Bot-Namen und der ID des Empfängers (jeweils in Quotes, durch Komma getrennt):
sub mySendLast20LogEntries($$){
  my ($bot,$receiver) = @_;
  my $seconds = time();
  my $stop_processing = 0;
  my @t = localtime($seconds);
  my $today_log_filename = ResolveDateWildcards($attr{global}{logfile}, @t);
  my @tyesterday = localtime($seconds-DAYSECONDS);
  my ($err, @logdata) = FileRead({FileName => $today_log_filename,ForceType => "file"});
  my $message = "Fehler beim lesen des logfiles von heute: $err";
  unless ($err) {
    my @datatosend;
    if (@logdata > 19) {
      @datatosend = @logdata[-20..-1];
    } else {
      @datatosend = @logdata;
      my $yesterday_log_filename = ResolveDateWildcards($attr{global}{logfile}, @tyesterday);
      unless ($yesterday_log_filename eq $today_log_filename) {
        my ($err2, @logdata2) = FileRead({FileName => $yesterday_log_filename,ForceType => "file"});
        my $remainingLines = (@datatosend) - 20;
        unshift (@datatosend, @logdata2[${remainingLines}..-1]) unless $err2;
      }
    }
    my $str_today = ResolveDateWildcards("%Y.%m.%d",@t);
    my $str_yesterday = ResolveDateWildcards("%Y.%m.%d",@tyesterday);
    @datatosend = grep {
      $_ =~ s/($str_today|$str_yesterday).//g #get only values from today and yesterday, cut off date and one character
    } @datatosend;
    for (@datatosend)  { s/[;&<>]//g };#remove unwanted characters
    $message = join("\n", @datatosend);
  }
  CommandSet(undef,"$bot _msg \@$receiver ```${message}```");
  return;
}


Unklar war mir v.a., ob das qx nicht in bestimmten Fällen blockiert, habe daher das interne Kommando FileRead gewählt und sonst mal etwas mit Arrayfunktionen rumgespielt...

Kann aber durchaus sein, dass da Verbesserungspotential besteht... ::)

Grüße, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files