PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Logs über Nutzeraktionen


Marbleearth
2010-06-17, 08:31:19
Hallo,
ich möchte für eine Communityseite eine Logging-Funktion schreiben, die die Nutzeraktivitäten dokumentiert.
Die Seite besteht aus einem nach außen geschlossenen Login-System.

Einerseits möchte ich das ganze für die Statistik (zB welche Seitenteile werden am häufigsten genutzt), andererseits möchte ich damit zB Captcha-Fehlversuche aufdecken.

Datenschutzrechtlich dürfte es ja ok sein, da es nur Seitenaufrufe intern betrifft oder?

Nun habe ich überlegt wie ich dazu vorgehe. Um die Datenbank nicht komplett vor die Wand zu fahren habe ich mir überlegt, dass mittels Textdateien zu lösen.

in dieser Art:

17.06.2010 08:25 NutzXYZ ruft die Shoutbox auf
17.06.2010 08:25 NutzXYZ hat folgenden Eintrag in die Shoutbox gepostet:
"Guten Morgen"

usw.
Nehme ich da für jeden Nutzer eine Datei? Lieber wäre mir eine globale Datei pro Tag. Nur was ist wenn 2 Nutzer zur selben Zeit eine Aktion ausführen? Dann hätte der eine Zugriff auf die Datei, und der andere nicht. Wie löst man das am Besten?

Grüße,

bluestyler

schleiftier
2010-06-17, 09:10:40
Warum du nicht die DB verwenden willst, verstehe ich nicht so ganz. Dafür sind die doch da...

Falls du tatsächlich direkt in eine Datei schreiben willst, solltest du Dir sowas wie eine globale Logger-Klasse schreiben, die dann eine einzelne Datei öffnet und beschreibt.

Marbleearth
2010-06-17, 11:08:37
Der Grund ist u.a. folgender:

Die Seite liegt momentan noch auf Freewebspace, da sie noch nicht komplett fertig ist.
Dort sind nur 10.000 MySQL-Abfragen pro Stunde erlaubt. Die hätte ich ruckzuck zusammen wenn ich das in der DB speichere.

Eine weitere blöde Einschränkung ist, dass die mail()-Funktion dort gesperrt ist.

Kenn jemand einen guten (kostenlosen) PHP Mailer, der die Daten aus Forms entgegenimmt und per Mail versendet?

EDIT: bezüglich des Mailproblems werde ich mir mal den PHPMAILER ansehen.

Gast
2010-06-17, 21:20:39
Meiner Meinung nach sind Textdateien für Logs generell besser da sie die Datenbank eben nicht belasten, leichter ausgewertet werden können (kein SQL) und auch schneller sein sollten. So ein öffnen einer Datei und eben ein paar Byte anhängen sollte doch schneller von statten gehen als einen Eintrag in die DB zu schreiben, denn eine DB muss letztendlich ja auch aufs Dateisystem schreiben und produziert dabei einen gewissen Overhead indem sie vorher Optimierungen durchführt

gereggter Gast
2010-06-17, 21:46:22
Handelt es sich hier um eine PHP Applikation? Für die gibt es doch sicher auch ein Logging Framework, welches das Logging vollständig übernimmt und somit als Singleton den Alleinzugriff auf die Logdatei hat. Damit sind auch gleichzeitige Log-Aktionen kein Problem mehr.
Die Log Datei stellt man dann auf Daily-Roll ein, damit die alte Datei am Tagesende abgeschlossen und umbenannt wird.

Per grep kann man dann schnell herausfiltern, wer wann was getan hat und wieviele das am Tag gemacht haben, z.B.:
grep 'Captcha falsch eingegeben' community.log.2010-06.16

Marbleearth
2010-06-18, 00:54:27
Handelt es sich hier um eine PHP Applikation?

Hallo ja es geht um PHP! Aber es ist alles selbst geschriebener Code (inklusive graphischem Captcha!). Außer Smarty für die PHP-Variablen-Übergabe an die HTML-Seiten verwende ich nichts vorgegebenes, deshalb wird es keine fertige Logging-Funktion für mein Seite geben. Aber sowas möchte ich auch nicht benutzen, da ich alles selbst machen möchte ;) Habe mich jetzt entschlossen nur Teile zu protokollieren. Bisher 2 wichtige Aktionen und die Captchafehler. Wird in der Datenbank verzeichnet. Läuft sehr gut bisher.

Tiamat
2010-06-18, 07:35:24
Hi,
eine Textdatei im Style "Aktion : Beschreibung" wäre der einfachste Fall.
Im Endeffekt hast du dann im Laufe der Zeit jede Menge Log Dateien, die du aber nur sehr schwierig auswerten kannst. Natürlich kannst du diese Aktionen abfragen und auch deren Beschreibung, aber wenn du darüber hinaus noch wissen möchtest, an welchem Captcha die User die meisten Fehler gemacht haben und welche Aktion der Plattform am geringsten e.t.c benutzt wird oder kompliziertere Statistiken, z.b zwischen welchen User der meiste Kontakt stattfindet, dann musst du dafür jedes Mal wieder Programmcode schreiben.

Die Datenbank ist dagegen kompaktes, da formulierst du dann lediglich eine Abfrage und du kannst durch Links, wenn du dir darauf aufbauend ein Backend schreibst, jeden einzelnen Schritt direkt nachvollziehen.
Vom Aufwand her kostet es dich eigentlich fast nichts.

Zu dem Zeitpunkt wenn ein User eine Aktion ausführt und du z.b die Nachricht in der DB speicherst, hast du i.d.R zu genau diesem Zeitpunkt alle Informationen parat. Du weißt, wer gerade postet, du hast den String, du kannst die Zeit u.s.w abspeichern.

Bei den Einschränkungen des WebSpace würd ich das nicht machen, aber langzeitlich gesehen, ist das die bessere Wahl.

Gruß
Tiamat

Marbleearth
2010-06-18, 09:57:00
Werd es wohl auch alles in der Datenbank machen und alle 3 Tage die Logs automatisch löschen lassen.

Cronjob brauche ich ja nicht, kann ja einfach wenn ein neuer Eintrag hinzukommt prüfen ob es 3 Tage alte Einträge gibt ;)

P.S.
Bei deiner Seite gibt es eine Zugriffsrechtsverletzung Tiamat. Baust du da gerade was um?

EDITH sagt: Mit www davor gehts, also müsstest du nur mal deine Sig anpassen :)

Tiamat
2010-06-18, 15:30:11
Hi,
ja danke ich weiß. Ich war mit der neuen Version noch nicht fertig, aber das hat keine Eile.

Gruß
Tiamat

registrierter Gast
2010-06-22, 01:32:01
Werd es wohl auch alles in der Datenbank machen und alle 3 Tage die Logs automatisch löschen lassen.

Cronjob brauche ich ja nicht, kann ja einfach wenn ein neuer Eintrag hinzukommt prüfen ob es 3 Tage alte Einträge gibt ;)
Diese Lösung hat gegenüber dem Cronjob zwei leichte bis mittlere Nachteile.

Wenn du vor jedem neuen Eintrag einen DELETE auf die Datenbank ausführst, um drei Tage alte Einträge zu löschen, hast du damit neben dem Eintrag selbst einen zweiten Request auf die Datenbank. Ich dachte, deine Requestzahl sei begrenzt?
Den Cronjob kannst du auf eine nutzerschwache Zeit in der Nacht setzen, wo du sowieso nie auf 10.000 Requests kommst. Das wäre insgesamt ein Request pro Tag!

Der zusätzliche Request vor jedem Eintrag kostet dich schätzungsweise - je nach System - 60 bis 200ms. Zeit, in der die Seite eigentlich gerendert werden sollte. Diese fünftel Sekunde merkt der Nutzer nicht, kann sich aber mit anderen renderunabhängigen oder doppelten Berechnungen schnell aufsummieren.
Ein Cronjob liefe außerhalb des Renderings.

AlecWhite
2010-06-22, 02:37:53
Als was den parrallen Zugriff auf die Log Datei angeht: flock() ist dein Freund. Kann auf die Datei kein exklusiver Schreibzugriff erlangt werden, dann wartet das Skript nämlich solange bis es geht. Ein Schreibzugriff dauert aber auch nur wenig ms - für den Benutzer bleibt das transparent.

Bezüglich des Problems mit der mail() Funktion: Gibt 'ne Menge Klassen, welche direkt mit einem SMTP Server kommunizieren, ohne dabei auf die sendmail Funktionen des Hosts zurück zu greifen. Bei phpclasses wirst du bestimmt fündig.

Marbleearth
2010-06-23, 08:11:50
Diese Lösung hat gegenüber dem Cronjob zwei leichte bis mittlere Nachteile.

Wenn du vor jedem neuen Eintrag einen DELETE auf die Datenbank ausführst, um drei Tage alte Einträge zu löschen, hast du damit neben dem Eintrag selbst einen zweiten Request auf die Datenbank. Ich dachte, deine Requestzahl sei begrenzt?
Den Cronjob kannst du auf eine nutzerschwache Zeit in der Nacht setzen, wo du sowieso nie auf 10.000 Requests kommst. Das wäre insgesamt ein Request pro Tag!


hm du kannst dir sicherlich vorstellen, dass ich bei dem Freehoster leider keine Cronjobs zur Verfügung habe :(



Bezüglich des Problems mit der mail() Funktion: Gibt 'ne Menge Klassen, welche direkt mit einem SMTP Server kommunizieren, ohne dabei auf die sendmail Funktionen des Hosts zurück zu greifen. Bei phpclasses wirst du bestimmt fündig.

Da bin ich schon dabei. Habe mir PHPMAILER und Swift angesehen. Das Problem ist, dass für SMTP Kommunikation fsockopen freigeschaltet sein muss.

Ich habe 2 Tage lang rumprobiert, bis ich drauf gekommen bin, dass es wohl daran liegt. (von meinem lokalen Apache gingen die Mails nämlich raus)

Habe jetzt noch anderen Freespace eingerichtet, wo ich eine PHP-Datei zum Mailversand ablegen werde.

Kann man eigentlich per Post von PHP zu PHP übergeben ohne, dass der Nutzer auf die 2. Seite geleitet wird?

Grüße,
bluestyler ;)

registrierter Gast
2010-06-24, 01:57:58
hm du kannst dir sicherlich vorstellen, dass ich bei dem Freehoster leider keine Cronjobs zur Verfügung habe :(
Neee, kann ich nicht. Wäre aber natürlich toll, wenn das ginge. :)