Zeile einer Log Datei per Mail

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Benutzeravatar
frindly
Beiträge: 1085
Registriert: 23.10.2007 08:13:26
Wohnort: Recklinghausen

Zeile einer Log Datei per Mail

Beitrag von frindly » 24.04.2013 09:07:00

Hallo
ich möchte gerne eine Zeile einer Log Datei per Mail zuschicken lassen,
wenn diese auftaucht.
Z.b. wenn in der syslog steht "blablabal" soll mir diese Zeile per eMail zugesendet werden.
Wie geht sowas am besten?

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: Zeile einer Log Datei per Mail

Beitrag von pferdefreund » 24.04.2013 09:30:08

Genau für sowas hab ich mir ein kleines Programm geschrieben - nicht wirklich schön - hab mir c selbst beigebracht - aber funktioniert.
Achtung #include <libpferd> muss raus und das Lesen mit fgets oder so
gemacht werden. Nonewline ist auch sowas, was dann händig gemacht werden muß.
Ich weiß, da sind gotos drinne - aber ich komme halt aus der Großrechnerwelt und da hatten wir halt nur Cobol, Assembler usw..

Code: Alles auswählen

 #include <stdio.h>
#include <string.h>
#include <libpferd.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
/* changes */
/* change am 18.10.2011 - Eingau cm= fuer die Schnittstelle  */
/* mvs 3.8 unter Hercules an Linux zwecks Ausfuehren von     */
/* Linux-Befehlen aus MVS 3.8                                */
/* change am 19.10.2011 - Fortsetzungszeilen fuer Lochkarten */
/* aus MVS 3.8 - hier muss in Stelle 72 ein + stehen, damit  */
/* die naechste Karte einfach an den Systembefehl angehaengt */
/* wird                                                      */
/* Dateidefinition */
FILE *eingabe;
FILE *params;
char esatz[4096];
int rc = 0;
int iein = 0;
int sprint = 0;
long filepos = 0;
char datei[256];
char parmdat[256];
char udatum[] = __DATE__;
char uzeit[] = __TIME__;
char filter[1000] [100];
int ifilter;
char aktion[1000][100];
int pid;
char *pointer = NULL;
/* upros */
void progende(void);
void parmles(void);
void filtern(void);
void befehl(void);
/* hier gehts los */
void filtern(void) {
int itab;
char befehl[1024];
char such[512];
itab = 0;
if (sprint < 1) return;
loop:
strcpy(such,filter[itab]);
if (strstr(esatz,such) == NULL) goto nichtgefunden;
strcpy(befehl,aktion[itab]);
nonewline((char *) befehl);
system(befehl);
nichtgefunden:
itab = itab + 1;
if (itab >= ifilter) goto endloop;
goto loop;
endloop:
return;
}
/* parameter einlesen */
void parmles(void) {
int iein;
int bytes;
char workfeld1 [512];
char workfeld2 [512];
char xbyte;
params = fopen(parmdat,"r");
if (params == NULL) {
printf("Open parmdat dumm gelaufe\n");
exit(1);
}
iein = 0;
lesparm:
bytes = readhigh(512, params, (char *) &workfeld1);
nonewline((char *) &workfeld1);
if (bytes <= 1) goto endles;   // ende erreicht
/* pruefung auf kommentar */
if (workfeld1[0] == '#') goto lesparm;  // kommentare ueberlesen
xbyte = '=';
unstring((char *) &workfeld1, (char *) &xbyte, (char *) &workfeld2);
printf("%s%s%s\n",workfeld1," =====> ", workfeld2);
strcpy(filter[iein],workfeld1);
strcpy(aktion[iein],workfeld2);
iein = iein + 1;
ifilter = ifilter + 1;
goto lesparm;
endles:
fclose(params);
printf("%s%i\n","Anzahl Filtereintraege: ",ifilter);
return;
}
int main( int argc, char *argv[] )
{
printf("RZ der Pferdefreunde Lindheim - Logwatch\n");
printf("Logwatch - Version 0.2\n");
printf("%s%s%s%s\n","Umandlumg am ",udatum,"-", uzeit);
if (argc != 3) {
printf("Bitte Programm mit 2 Parametern starten\n");
printf("1. Parameter - zu ueberwachende Datei\n");
printf("2. Parameter - Kontrolldatei\n");
progende();
}
pid = fork();
if (pid > 0) exit(0);
strcpy(datei,argv[1]);
strcpy(parmdat,argv[2]);
printf("%s%s\n","Ueberwacht wird: ",datei);
printf("%s%s\n","Kontrolldatei  : ",parmdat);
/* oeffnen der Dateien */
eingabe = fopen(datei,"r");
perror ("Open Input Eingabe");
if (eingabe == NULL) {
printf("Open Eingabe dumm gelaufe\n");
exit(1);
}
signal(SIGINT,(void *) progende);
signal(SIGTERM,(void *) progende);  
parmles(); //einlesen Parameter fuer das Filtern
/* und nun schicken wir ihn als Daemon in den Hintergrund */
pointer = getenv("logwatch");
if (pointer != NULL) {
printf ("Datei wird ab Beginn abgearbeitet\n");
sprint = 1;
}
lesen:
rc = readpipe(1250,eingabe, (void *) &esatz);
/* eof-behandlung */
rc = feof(eingabe);
if (rc != 0) {
// printf("%s%d\n","RC EOFSTATUS ",rc);
/* wir warten 3 sekunden , schliessen die Eingabe */
/* oeffnen erneut und positionieren an letzte Stelle */
/* dann geht das Spiel von vorne los */
 sleep(3);
 sprint = 1;
 filepos = ftell(eingabe);
 fclose (eingabe);
 eingabe = fopen(datei,"r");
 rc = fseek(eingabe,filepos,SEEK_SET);
 if (rc != 0) {
 printf("%s%d\n","RC fseek ",rc);
 goto ende;
}
 goto lesen;
}
/* fehlerbehandlung */
rc = ferror(eingabe);
if (rc != 0) {
 printf("%s%d\n","RC read ",rc);
 goto ende;
}
iein = iein + 1;
if (sprint == 1)
{
printf(esatz);
if (strncmp(esatz,"cm=",3) == 0) {
befehl();
}
else {
filtern();
}
}
/* hier haben wir jetzt nen Datensatz */
goto lesen;
ende:
progende();
return 0;
}
void progende(void) {
if (eingabe != NULL) fclose(eingabe);
printf("%s%i\n","Gelesen ",iein);
exit (0);
return;
}
void befehl() {
static char systembefehl[1024];
int rc;
static int em;
if (em == 0) {
strcpy(systembefehl,"");
em = 1;
}
if (esatz[71] == '+') {
printf("%s%s\n","Fortsetzung gewuenscht - kein system....",systembefehl);
esatz[71] = 0;
strcat(systembefehl,esatz+3);
return;
}
else {
strcat(systembefehl,esatz+3);
} 
printf(systembefehl);
printf("\n");
rc = system(systembefehl);
printf("%s%i\n","RC = ", rc);
/* nach Ausfuehrung wieder platt machen */
strcpy(systembefehl,"");
return;
}


nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: Zeile einer Log Datei per Mail

Beitrag von nepos » 24.04.2013 10:01:55

Das Tool logwatch macht eigentlich genau sowas. Musst du halt nur die Config entsprechend erstellen.

Benutzeravatar
frindly
Beiträge: 1085
Registriert: 23.10.2007 08:13:26
Wohnort: Recklinghausen

Re: Zeile einer Log Datei per Mail

Beitrag von frindly » 24.04.2013 11:05:49

Meine Lösung sieht jetzt so aus:

Code: Alles auswählen

#!/bin/bash
tail -fn0 /var/log/syslog | \
while read line ; do
        echo "$line" | grep "gesuchtes"
        if [ $? = 0 ]
        then
                echo "Logzeile $line" | mail -s "Logzeile" email@adresse.de

        fi
done

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Zeile einer Log Datei per Mail

Beitrag von Natureshadow » 24.04.2013 13:37:53

echo | grep?

[[ $line = *"gesuchtes"* ]] && mail ...

Antworten