Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Apache, Lighttpd, nginx, Cherokee
Post Reply
web-gear
Posts: 59
Joined: 2003-03-15 00:25
 

Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by web-gear »

Hallo zusammen,


bei Lesen des Forumthemas werden vermutlich viele erst einmal die Augen verdreht haben - wohl zu recht.

Aber bitte lasst mich spezifizieren: ich suche ein Kommandozeilentool für SuSE 8.1, dass mir meinen Traffic auswerten kann, und zwar mit einer ganz besonderen Filterregel:
Ich habe nämlich ein Unterverzeichnis auf meinem Server, das in vielen Unterordnern einige Dateien von bei meinem Service angemeldeten Benutzern enthält.

Das sieht also so aus:
Angenommen, mein Apache Document-Root heißt
/www/html
und das Stammverzeichnes der Benutzer heißt
/www/html/members
dann wäre ein Unterverzeichnis eines Users "username"
/www/html/members/username

Okay, soviel zum Aufbau. Da es sich aufgrund der hohen Anzahl an Nutzern nicht rechnen würde, für jeden einen "Linux-User-Account" anzulegen, läuft das alles unter einem Benutzer.
Zur Zeit werte ich alles zusammen mit Webalizer aus, die Apache Logfiles werden aufgrund der Größe täglich neu erstellt.

Ich suche jetzt eine Möglichkeit, irgendwie mit einem einzigen Kommandozeilenaufruf (der dann z.B. täglich durchgeführt wird) eine Ausgabe des Traffic für diesen Tag für jeden der Benutzer=Unterverzeichnisse zu bekommen.

Zur Zeit handelt es sich um mehrere zehntausend Unterverzeichnisse.

Ich habe jetzt schon die Doku von allen mir bekannten und einigen neu gefundenen Kommandozeilentools gewälzt, darunter natürlich v.a. Webalizer und AWStats, aber irgendwie komme ich nicht weiter.
Auch Suchmaschinen konnten mir nicht helfen.

Ich wollte deshalb fragen, ob vielleicht jemand hier einen Tip geben könnte, in wlecher Richtung ich mich z.B. unbedingt schlau machen sollte. Ich meine, es wird doch wohl irgendwie die Möglichkeit geben, einfach einen derartigen Filter anzulegen.

Wie die Ausgabe dann erfolgt, wäre nicht so entscheidend. Das kann z.B. eine Datei in jeder Unterordner sein, oder eine große Datei oder ein Eintrag in eine MySQL-DB. Ich könnte da mit allem was anfangen.

Der restliche Traffic soltle natürlich "normal" ausgewertet werden, aber DAS stellt natürlich kein Problem, könnte auch in nem extra Aufruf erfolgen, in dem ich dann z.B. das Benutzerverzeichnis auschließe etc.

MfG
Hermann
superuser1
Posts: 291
Joined: 2003-11-26 18:43
Location: earth
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by superuser1 »

Hi...

lerne Perl, PHP oder Python und schreibe dir selbst ein entsprechendes Skript, das dir die Apache-Logfiles nach den entsprechenden Einträgen aufschlüsselt.

Ich glaube kaum, dass du ein extra auf deine doch recht speziellen Wünsche zugeschnittenes Programm finden wirst...

:roll:
web-gear
Posts: 59
Joined: 2003-03-15 00:25
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by web-gear »

superuser1 wrote:Hi...

lerne Perl, PHP oder Python und schreibe dir selbst ein entsprechendes Skript, das dir die Apache-Logfiles nach den entsprechenden Einträgen aufschlüsselt.

Ich glaube kaum, dass du ein extra auf deine doch recht speziellen Wünsche zugeschnittenes Programm finden wirst...

:roll:
Erstmal danke für Deine Antwort!

Mit PHP arbeite ich bereits seit längerer Zeit, Perl beherrsche ich ansatzweise habe aber keine Erfahrung, Python kenne ich nur vom Namen.

Ich hatte schon daran gedacht, das ganze selbst auszuwerten. Aber ist z.B. PHP, das jha trotz der vielfältigen Einsatzmöglichkeiten immer noch als eine Scriptsprache zur Generierung von HTML-Seiten ausgelegt ist, nicht zu wenig perfomant für so eine Operation?

Ich meine, die Logfiles haben z.Z. ein Größe von mehreren hundert Megabyte, und mit jedem Tag werden sie größer. Es soltle also eine Lösung gefunden werden, die auch noch mit wesentlich mehr zurecht kommt. Wäre da eine Lösung mit z.B. C nicht besser? Leider kenne ich mich damit (noch) nicht so aus.

Aber ich glaube, dass Du im Endeffekt wohl recht hast.

Oder gibt es noch andere Meinungen?
bungeebug
Posts: 187
Joined: 2004-04-14 10:08
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by bungeebug »

wow ... mehr als hundert MB? Benutzt du "logrotate" oder etwas ähnliches?
web-gear
Posts: 59
Joined: 2003-03-15 00:25
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by web-gear »

BungeeBug wrote:wow ... mehr als hundert MB? Benutzt du "logrotate" oder etwas ähnliches?
Ja ich rotiere einmal täglich um kurz nach 0:00 Uhr. Die alte Log-Datei, die dann z.Z. eine Größe von fast 300 MB hat, hebe ich dann noch bis zur nächsten Rotation auf, also ich habe 24h Zeit um sie auszuwerten. Ich habe mir überlegt, dass ich ja auch ein Script schreiben könnte, dass jede Minute aufgerufen wird und dann eben nur einen kleinen Teil auswertet usw.
Ich habe inzwischen ein bißchen mit C++ experimentiert. Ich werde mich natürlich noch etwas einarbeiten müssen, aber ich glaube ich könnte das hinkriegen :-)

Ich habe mir außerdem einmal die Apache Dokumentation für Logfiles durchgelesen (hätte ich eigentlich auch früher draufkommen können).
Einerseits wäre es evtl. längerfristig sinnvoll, nicht mehr das "combined" Format zu benutzen, sondern entweder einfach nur das "common" oder z.B. die "referer" - Daten in eine extra Logfile zu verfrachten.
Eine andere interessante Sache scheint das "Piped Logging" zu sein. Damit übergebe ich jeden Logbefehl an ein Programm, d.h. ich könnte es da sofort auswerten. Ich denke, dass wäre wohl eine gute Lösung, aber was für eine Sprache verwende ich für das "Pipe" Programm? Ich meine, was zu tun ist, ist ja wirklich simpel:

1.) Prüfen, ob eine Datei aus einem User-Verteichnis aufgerufen wurde.
2.) Wenn ja, fortfahren und den Usernamen rausfiltern.
3.) Die Größe der aufgerufenen Datei ("Traffic") rausfiltern und verarbeiten, z.B. im Userverzeichnis in eine Datei schreiben.

Was eigenet sich da am besten?

Oder gibt es noch Vorschläge? Hat jemand vielleicht schon was ähnliches gemacht?
kama
Posts: 51
Joined: 2004-05-11 22:07
Location: Aachen
Contact:
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by kama »

Hallo,

ich habe mit AWStats schon Dateien von einer Größe von ca. 1GB ausgewertet und das hat ca. 1/4 - 1/2 h gedauert...

Umschaltung auf common würde ich nicht unbedingt machen, da verlierst Du einige Infos....

In C++ so ein Script würde ich auf keinen Fall machen, da es in Perl viel einfacher und schneller geht (bezogen auf die Entwicklung).

Wie wäre es wenn Du direkt in eine DB Logs mit apache ?

MfG
Karl Heinz
kess
Posts: 24
Joined: 2003-06-25 09:24
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by kess »

Aufgrund der Größe deiner Logfiles bzw. der Requestfreguenz ist eine direkte Auswertung über piped Logs mit einem Skript nicht so sinnvoll. Das dürfte (muss nicht, ist aber wahrscheinlich) zu langsam sein. Entweder benutzt du dazu ein Binary oder du fährst die Auswertung wirklich erst hinterher.

Eine Standardlösung wirst du wahrscheinlich nicht finden. Hier ist Eigeninitiative gefragt.

Du kannst dir aber vom Apache selbst schon ein wenig helfen lassen und zwei verschiedene Logs schreiben: eines für die User und eines für den Rest. (Ein Log pro User geht auch ohne Accounts, ist aufgrund der Anzahl aber wieder nicht sinnvoll.) Wenn du wirklich nur am Traffic je User interessiert bist, schreibst du in dieses User-Log eben nur die entsprechenden Angaben, die du später auch zur Auswertung brauchst. Referrer, Datum und Uhrzeit, Status usw. kannst du dir hier dann sparen. Selbst das Common-Logformat ist dann noch zu viel.
Für die Aufteilung der Logeinträge setzt du vorher eine Variable, in deren Abhänigkeit du dann in das eine oder andere Log schreibst. Dabei hilft dir das Modul mod_setenvif.

Das so entstandene Log wertest du dann mit einem eigenen Skript (ist hier dann durchaus performant genug und vor allem schnell entwickelt). Auf Wunsch kann ich dir gern dabei helfen. Im dem Fall dann bitte PN an mich.

Gruß
Kess
web-gear
Posts: 59
Joined: 2003-03-15 00:25
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by web-gear »

Kess wrote:Aufgrund der Größe deiner Logfiles bzw. der Requestfreguenz ist eine direkte Auswertung über piped Logs mit einem Skript nicht so sinnvoll. Das dürfte (muss nicht, ist aber wahrscheinlich) zu langsam sein. Entweder benutzt du dazu ein Binary oder du fährst die Auswertung wirklich erst hinterher.
Also das mit der Binary war mir klar, ich habe es schon mit C++ eben versucht. Ich glaube ich hab irgendwas falsch gemacht, da es nichts geloggt hat und der Server sich aufhing ;-)
Aber ich denke dass das auf jeden Fall klappen könnte, nach einigen weiterführenden Studien, wie die Daten übergeben werden etc.
Kess wrote: Du kannst dir aber vom Apache selbst schon ein wenig helfen lassen und zwei verschiedene Logs schreiben: eines für die User und eines für den Rest. (Ein Log pro User geht auch ohne Accounts, ist aufgrund der Anzahl aber wieder nicht sinnvoll.) Wenn du wirklich nur am Traffic je User interessiert bist, schreibst du in dieses User-Log eben nur die entsprechenden Angaben, die du später auch zur Auswertung brauchst. Referrer, Datum und Uhrzeit, Status usw. kannst du dir hier dann sparen. Selbst das Common-Logformat ist dann noch zu viel.
Für die Aufteilung der Logeinträge setzt du vorher eine Variable, in deren Abhänigkeit du dann in das eine oder andere Log schreibst. Dabei hilft dir das Modul mod_setenvif.

Das so entstandene Log wertest du dann mit einem eigenen Skript (ist hier dann durchaus performant genug und vor allem schnell entwickelt). Auf Wunsch kann ich dir gern dabei helfen. Im dem Fall dann bitte PN an mich.

Gruß
Kess
Vielen DAnk für diesen Tipp, das ist eine gute Idee!

Mir ist aber noch eine weiterführende Idee gekommen, und ich hätte zu mod_setenvif noch eine Frage.

Zuerste die Frage: Wie lautet die Variable, die ich nehmen kann, um den vollen Dateinamen der angeforderten Datei rauszubekommen? "Request_URI" ist leider nicht ausreichend, da ich auch noch einige mod_rewrite Dinge etc. drin habe und einige Subdomains besonders umleite, sprich "Request_URI" ist nicht immer richtig. Ich bräuchte den vollen Dateinamen oder den Dateinamen ab dem "document_root".
Ich habs mir "Request_Filename" probiert, war leider nix.

Jetzt die Idee.: Die "SetEnvIfNoCase" Direktive setzt ja Regexe ein. Kann ich da nichts gleich noch die Rückgabewerte evtl. verarbeiten? Also sprich wenn es sich um den Members-Pfad handelt, such ich mir mit nem Regex den usernamen raus und speichere das Log dann gleich da, ganz ohne pipe etc.

Geht das?


Danke schonmal,

MfG
Hermann
kess
Posts: 24
Joined: 2003-06-25 09:24
 

Re: Kommandozeilentool f. Auswertung von Apache-Logfiles gesucht

Post by kess »

Sorry, ich konnte leider nicht eher antworten.

Also ....
Also das mit der Binary war mir klar, ich habe es schon mit C++ eben versucht. Ich glaube ich hab irgendwas falsch gemacht, da es nichts geloggt hat und der Server sich aufhing Wink
Aber ich denke dass das auf jeden Fall klappen könnte, nach einigen weiterführenden Studien, wie die Daten übergeben werden etc.
Du liest die Daten in deinem Programm ganz normal von STDIN ein. Das Satzformat legst du ja selbst fest. Also nichts besonderes eigentlich.

Hm, der Apache hing sich auf? Seltsam. Was heißt das genau? Hat er aufgehört, Requests zu bedienen? CPU endlos verbraucht? Gar nicht mehr reagiert? Oder wie kann ich mir das vorstellen? Stand etwas im Errorlog? Hast du den Apache schon mal im Debug-Mode laufen lassen (Startoption -X)? Vielleicht brigt strace dich auch weiter ...
Zuerste die Frage: Wie lautet die Variable, die ich nehmen kann, um den vollen Dateinamen der angeforderten Datei rauszubekommen? "Request_URI" ist leider nicht ausreichend, da ich auch noch einige mod_rewrite Dinge etc. drin habe und einige Subdomains besonders umleite, sprich "Request_URI" ist nicht immer richtig.
Ich habs mir "Request_Filename" probiert, war leider nix.
Request_Filename ist theoretisch richtig. SetEnvIf(NoCase) kann diese Variable allerdings nicht verwenden. Im Zusanmenspiel mit mod_rewrite wäre hier außerdem der Kontext wichtig. Im Server-Kontext wird SetEnvIf nämlich vor allen Rewrite-Rules ausgeführt. Du mußt deine Variable jedoch danach setzen. Für dich ist es also besser, noch eine RewriteRule anzufügen, welche statt SetEnvIf die gewünschte Variable setzt. Du kannst dazu %{LA-U:REQUEST_FILENAME} abfragen. Das macht allerdings einen Subrequest und ist langsam. Schneller geht es mit

Code: Select all

<Location />
   RewriteCond %{REQUEST_FILENAME} regex
   RewriteRule ^  - [E=loguser:1]
</Location>
Ich bin allerdings nicht sicher, ob das so funktioniert. RewriteRule sind eigentlich nicht für Location gemacht. Probier es halt mal aus.
Jetzt die Idee.: Die "SetEnvIfNoCase" Direktive setzt ja Regexe ein. Kann ich da nichts gleich noch die Rückgabewerte evtl. verarbeiten? Also sprich wenn es sich um den Members-Pfad handelt, such ich mir mit nem Regex den usernamen raus und speichere das Log dann gleich da, ganz ohne pipe etc.
Rückgabewerte kannst du ab Version 2.0.51 verwenden, die eigentlich in den nächstne zwei Wochen etwa rauskommen sollte.
Ich rate dir aber dringend davon ab, je User ein eingenes Log zu führen. Du hast mehrere zehntausend User, sagst du. Du bekommst arge Probleme, für jeden User ein Log zu führen - wenn du es überhaupt schaffst den Apache dann zu starten. Denn Logfiles werden beim Hochfahren geöffnet und bleiben es bis zum Runterfahren des Apache, d.h. du hättest auch mehrere zehntausend Dateidescriptoren offen. Das willst du nicht wirklich ;)

Gruß
Kess
Post Reply