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?
Zeile einer Log Datei per Mail
-
- Beiträge: 3799
- Registriert: 26.02.2009 14:35:56
Re: Zeile einer Log Datei per Mail
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..
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;
}
Re: Zeile einer Log Datei per Mail
Das Tool logwatch macht eigentlich genau sowas. Musst du halt nur die Config entsprechend erstellen.
Re: Zeile einer Log Datei per Mail
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
- 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
echo | grep?
[[ $line = *"gesuchtes"* ]] && mail ...
[[ $line = *"gesuchtes"* ]] && mail ...
Linux Professional Institute Certification Level 2
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!
Warum bist du immer so gehässig? | FAQ (aka "Mein Sound ist kaputt!")
Meine DF.de-Stalker: Cae und TRex - I <3 you!