ubuntuusers.de

Apache-Logfiles mit Bash-Script via E-Mail frei Haus

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Oliver_Deisenroth

Avatar von Oliver_Deisenroth

Anmeldungsdatum:
12. Dezember 2010

Beiträge: 69

Wohnort: Schwalmstadt

Hallo liebe Ubuntu Freunde,

ich möchte euch gerne mein Bash-Script vorstellen, was mir jetzt sehr dabei hilft, von unterwegs aus meinen kleinen vServer mit Ubuntu-Server zu überwachen.

1
2
3
4
5
6
7
#!/bin/bash

DATUM="$(date +%d.%m.%Y) $(date +%H:%M)"

tail -n 80 /var/log/apache2/error.log > /var/log/apache2/error_tail.log

mail -s "Apache-Error Log $DATUM" webmaster@meinedomain.de < /var/log/apache2/error_tail.log

Die Experten werden wohl schnell erkennen, was es macht...

Ich habe es als Cronjob in die crontab eingebunden und bekomme somit alle 3-Stunden die letzten 80-Zeilen vom Apache error.log zugeschickt. Sehr hilfreich, um Hack-Versuche oder Fehler zu erkennen etc...

1
0 0,3,6,9,12,15,18,21 * * * root /bin/bash --login /etc/init.d/logmail/apache-errorlog.sh>/dev/null 2>&1

Mein Smartphone habe ich nämlich immer dabei - und so kann ich von unterwegs meine Apache-Logfiles lesen. Ja, vielleicht klein, aber fein dieses Script, wie ich finde.

Es ist natürlich auch universell einsetzbar, muss ja nicht zwingend der Apache sein... Bin gestern zufällig auf den mail -s Befehl gestoßen und da kam mir die Idee 😉

Und die Ausgabe an /dev/null ist nur dafür da, dass ich nicht ständig eine root-Mail auf der Konsole bekomme.

Wenn ich das Script in die Crontab jedoch ohne /bin/bash --login einbinde, dann funktioniert es nicht.

(Ausführlich getestet)

Kann mir jemand sagen, wie ich das Script anpassen müsste, damit es auch ohne diesen --login String über die Crontab aufgerufen werden kann?

Danke für die Hilfe, wenn es keiner weiß, ist es auch nicht schlimm,

ich wollte euch hauptsächlich mal das Script vorstellen!

LG Oliver

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Programme müssen im cron-Pfad stehen, der entweder zu setzen ist, oder die Programme (tail, mail) müssen mit vollem Pfad aufgerufen werden.

1
DATUM="$(date +%d.%m.%Y) $(date +%H:%M)"

Das ist übrigens Quark.

1
x=$(y)

weist dem x immer den ganzen Output von y zu, nur bei der späteren Verwendung von $x kann es evtl. nötig sein dieses zu maskieren.

Oliver_Deisenroth

(Themenstarter)
Avatar von Oliver_Deisenroth

Anmeldungsdatum:
12. Dezember 2010

Beiträge: 69

Wohnort: Schwalmstadt

user unknown schrieb:

Programme müssen im cron-Pfad stehen, der entweder zu setzen ist, oder die Programme (tail, mail) müssen mit vollem Pfad aufgerufen werden.

Danke für den Hinweis, na dann ist mir das Workaround mit /bin/bash --login doch lieber!^^

Viel Spaß mit dem Script... 😉

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

user unknown schrieb:

1
DATUM="$(date +%d.%m.%Y) $(date +%H:%M)"

Das ist übrigens Quark.

1
x=$(y)

weist dem x immer den ganzen Output von y zu, nur bei der späteren Verwendung von $x kann es evtl. nötig sein dieses zu maskieren.

Nein, das ist kein Quark. Wenn du genau hinsiehst sind in der Zuweisung zu DATUM zwei durch Leerzeichen getrennte Command Substitutions drin. Ohne die Quotes geht das mächtig in die Hose. Tipp: der Fehler ohne die Quotes wird dann "Command not found" sein.

Mann könnte die zwei date-Aufrufe zwar zu einem zusammenfassen:

1
DATUM=$(date +'%d.%m.%Y %H:%M')

Aber in der Form oben brauchts halt zwingend die Quotes.

Oliver_Deisenroth

(Themenstarter)
Avatar von Oliver_Deisenroth

Anmeldungsdatum:
12. Dezember 2010

Beiträge: 69

Wohnort: Schwalmstadt

radoe2 schrieb:

Nein, das ist kein Quark. Wenn du genau hinsiehst sind in der Zuweisung zu DATUM zwei durch Leerzeichen getrennte Command Substitutions drin. Ohne die Quotes geht das mächtig in die Hose. Tipp: der Fehler ohne die Quotes wird dann "Command not found" sein.

Das hatte ich mir leise gedacht, aber nicht ausgesprochen... Beim von user unknown angesprochenen Ausdruck kam nämlich genau das, was du angesprochen hast:

1
"Command not found"

Hihi, ☺ ich teste meine Scripte nämlich, bevor ich sie öffentlich mache.

Danke, dass du aber nochmal darauf hinweist, freut mich, wenn die Leute aufpassen 👍 ....

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Mit dem Datum machst Du es aber auch kompliziert ... wer ruft denn dafür 2x eine Command Substitution und 2x date auf ??

Üblich wäre es so, auch einfacher, und dann brauchst Du tatsächlich keine "Quotes" außen herum: (und das hatte user unknown wohl vor Augen)

datum=$(date "+%d.%m.%Y %H:%M")

n.b.: Benutzervariablen sollten immer $klein sein, damit sie nicht aus Versehen mit einer $SYSTEMVARIABLEN in Konflikt kommen !

Und der cron- Eintrag geht auch etwas übersichtlicher. Dann sieht man sofort die "3 Stunden":

0 */3 * * * root /bin/bash --login /etc/init.d/logmail/apache-errorlog.sh>/dev/null 2>&1

LG,

track

Oliver_Deisenroth

(Themenstarter)
Avatar von Oliver_Deisenroth

Anmeldungsdatum:
12. Dezember 2010

Beiträge: 69

Wohnort: Schwalmstadt

@track

Oh, danke für den Tipp, habe es umgesetzt und das Script beherrscht jetzt auch Archivierung der Log-Abfragen! (den Tipp habe ich mir aus einem anderen Forum geholt)

Einfach in einen Ordner innerhalb eines vhosts vom Apache speichern, was haltet ihr davon? Dann kann man sich auch ältere Logdateien von unterwegs anschauen...

Ach ja, wenn den Log-Ordner keiner kennt, dann ist er doch eigentlich sicher innerhalb von /var/www, oder?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

DATUM=$(date "+%d.%m.%Y %H:%M") # Datum
LOGFOLDER=/var/www/log-ordner-den-keiner-wissen-soll/apache # Archiv-Ordner

tail -n 80 /var/log/apache2/error.log > /var/log/apache2/error_tail.log

# Mail mit dem Log versenden
mail -s "Apache-Error Log $DATUM" webmaster@meinedomain.de < /var/log/apache2/error_tail.log

# Log-File archivieren
cp /var/log/apache2/error_tail.log $LOGFOLDER/apache_$(date +%Y_%m_%d-time-%H-%M).txt

Nur noch den Logfolder an die eigenen Bedürfnisse anpassen.

LG Oliver

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Tja, ich muss zugeben nur so oberflächlich geschaut zu haben, dass ich nicht sah, dass da noch ein zweites date-Kommando drinsteckte.

Wie die anderen schon anmerkten ist aber fast immer zu raten die Variable in einem Kommando zu verarzten:

1
DATUM=$(date +"%d.%m.%Y %H:%M")

Der einzige Unterschied ist, dass die zwei Kommandos länger brauchen, was aber wohl kaum erwünscht sein dürfte - es ist wohl egal in 99,99% der Fälle.

In einem von 1 Milliarde Fällen kann es aber passieren, dass date-1 am 25.3. um 23:59 Uhr exekutiert wird, und date-2 am 26.3 um 0:00 Uhr. Dann zeigt die Variable aber "25.3.2014 23:59" - Bingo!

Oliver_Deisenroth

(Themenstarter)
Avatar von Oliver_Deisenroth

Anmeldungsdatum:
12. Dezember 2010

Beiträge: 69

Wohnort: Schwalmstadt

Ich möchte nochmal dazu schreiben... so als Tipp:

Übersichtlicher zur Logfile-Auswertung ist auf jeden Fall logwatch: Hier eine schönes HowTo dazu! ☺

Bei mir musste ich auch noch den Cronjob dazu abändern, die /etc/cron.daily/00logwatch sieht jetzt so aus:

1
2
#execute
/usr/sbin/logwatch --mailto webmaster@meinedomäääääne.de

LG Oliver

Antworten |