Alain: in logdatei nach wert suchen

Morgen, Ich hab mich etwas umgeguckt in selfhtml aber nichts ähnliches gefunden. Ich möchte eine logdatei füttern mit einer seperaten userjnfo. Jedoch möchte ich dass,wenn ein Eintrag schon vorhanden ist z.B. $date,$username,$ip_now,$agent,$ref dass das skript den weiteren vorgang beendet ansonsten soll es diese daten drucken in die log. Ich habe da ein skript das aber einfach immer den eintrag macht egal ob der eintrag vorhanden ist oder nicht. Dies sieht etwa so aus: #!/usr/bin/perl -w

$logfile = "stat.log";

$username = $ENV{'REMOTE_USER'} || 'anyuser';

$ip_now         = $ENV{'REMOTE_ADDR'};

$agent =  $ENV{'HTTP_USER_AGENT'};

$ref =  $ENV{'HTTP_REFERER'};

$ips = "$date,$username,$ip_now,$agent,$ref";

Now that we know what the time/date is.. let's have fun

&log;

sub log {

if (! open(LOG,">>$logfile")) {

print "Content-type: text/html\n\n";

print "Couldn't open $logfile so I'm bugging out..\n";

exit;                         }

print LOG "$ips\n"; print LOG "------- \n";

close (LOG); }

Die $date variable hab ich weggelassen,da das skrip zu lange würde. Gibts da einen einfachen schalter den man dazwischen legen kann (falls eintrag vorhanden nicht drucken), bevor das skript die log druckt?

Grüsse vom Alain

  1. Hallo!

    Ich hab mich etwas umgeguckt in selfhtml aber nichts ähnliches gefunden.

    Wonach hast Du gesucht?
    http://selfhtml.teamone.de/cgiperl/sprache/bedingt.htm#if_else_elsif
    http://selfhtml.teamone.de/cgiperl/funktionen/einausgabe.htm#open
    http://selfhtml.teamone.de/cgiperl/funktionen/zeichenketten.htm#split
    http://selfhtml.teamone.de/cgiperl/sprache/listen.htm#elementzugriff
    ...?

    Jedoch möchte ich dass,wenn ein Eintrag schon vorhanden ist z.B.

    $date,$username,$ip_now,$agent,$ref
    Was soll das sein? Sollen alle Werte vorhanden sein?

    Gibts da einen einfachen schalter den man dazwischen legen kann
    (falls eintrag vorhanden nicht drucken),
    bevor das skript die log druckt?

    Wo bitte wird hier was gedruckt?

    [ ] Du hast das Script geschrieben
    [ ] Du hast das Script verstanden

    Der Schalter den Du suchst ist "if"! Also wo genau liegt Dein Problem?

    Grüße
    Andreas

    PS: Bist Du unter die erfolgreichen 1und1 "powerseller" gegangen oder was soll schon wieder die Werbung?

    1. Moin,

      Wonach hast Du gesucht?

      nach cgi log

      http://selfhtml.teamone.de/cgiperl/sprache/bedingt.htm#if_else_elsif http://selfhtml.teamone.de/cgiperl/funktionen/einausgabe.htm#open http://selfhtml.teamone.de/cgiperl/funktionen/zeichenketten.htm#split http://selfhtml.teamone.de/cgiperl/sprache/listen.htm#elementzugriff ...?

      diese beispiele waren mir nicht unbekannt,aber leider zeigen sie die beispiele nur im skript selbst und nicht mit einer log datei wo etwas gesucht wird z.B. die IP adresse oder so.

      [nicht ganz ] Du hast das Script geschrieben [ja ich denke schon] Du hast das Script verstanden

      Der Schalter den Du suchst ist "if"! Also wo genau liegt Dein Problem?

      »»

      dacht ich mir auch,dass man das mit if lösen könnte eventuell auch mit foreach oder while, aber das geht wohl doch nicht so einfach,da es sich um eine log datei handelt in der gesucht wird und nicht im cgi selbst z.B. foreach ips { if($ip_now) #wenn ipadresse eintrag vorhandnen

      { close LOG; } else { print LOG ................ aber das geht wohl so nicht.

      PS: Bist Du unter die erfolgreichen 1und1 "powerseller" gegangen oder was soll schon wieder die Werbung?

      werbung? muss ja niemand auf den link klicken.... ich Mitglied hier und hätte auch einen anderen link schreiben können.

      Grüsse vom Alain

      1. Hallo!

        http://selfhtml.teamone.de/cgiperl/sprache/bedingt.htm#if_else_elsif
        http://selfhtml.teamone.de/cgiperl/funktionen/einausgabe.htm#open
        http://selfhtml.teamone.de/cgiperl/funktionen/zeichenketten.htm#split
        http://selfhtml.teamone.de/cgiperl/sprache/listen.htm#elementzugriff
        ...?

        diese beispiele waren mir nicht unbekannt,aber leider zeigen sie die beispiele
        nur im skript selbst und nicht mit einer log datei wo etwas gesucht wird z.B.
        die IP adresse oder so.

        Ich bin bei leibe kein PERL-Experte, aber ich bin mir ziemlich sicher das "LOG" ein selbstdeifinierter Name für das Dateihandle ist, und nichts besonderes. Könntest dasselbe machen wenn Du das USERDATEN oder was weiß ich wie nennen würdest. Wie es scheint hast Du nicht verstanden wie in PERL, das schreiben in Dateien funktioniert, denn genau das macht das Script und genau das ist unter einem meiner angegebenen links genau erklärt. Probiere das Script doch erstmal zu verstehen bevor Du es ändern willst! Die Links oben helfen Dir dabei.

        dacht ich mir auch,dass man das mit if lösen könnte eventuell auch mit foreach oder while,
        aber das geht wohl doch nicht so einfach,da es sich um eine log
        datei handelt in der gesucht wird und nicht im cgi selbst

        Wie gesagt, in einem der Links oben  ist genau erklärt wie man eine Datei öffnet und den gesamten Inhalt bekommt, im Gegensatz zum Script, wo der neue Inhalt nur aagehängt wird. Diesesm Inhalt kommt dann aus der "log-File" in Dein CGI-Script und Du kannst damit veranstalten was immer Du willst/kannst.

        z.B.
        foreach ips {
        if($ip_now) #wenn ipadresse eintrag vorhandnen

        Beispiel wofür?

        {
        close LOG;
        }
        else
        {
        print LOG
        ................
        aber das geht wohl so nicht.

        Nein, Du mußt LOG auf alle Fälle schließen, aber nur unter einer bestimmten "Bedingung"(*winkmitzaunpfahl*) in die Datei schreiben(print), und diese Bedingung hast Du ja vorher definiert:
        Der Datensatz soll ncht vorkommen. Dazu mußt Du wie gesagt die Datei anders öffnen, zum lesen, die eingelesenen Daten mit den neuen Daten vergleichen, und entsprechend print LOG oder eben nicht ausführen.

        IMHO steht ales was Du dafür brauchst unter den obigen Links. Vor allem den 2. solltest Du Dir mal näher ansehen!

        werbung? muss ja niemand auf den link klicken....
        ich Mitglied hier und hätte auch einen anderen link schreiben können.

        Jaja, ist klar.

        Grüße
        Andreas

  2. Moin,

    Morgen,
    Ich hab mich etwas umgeguckt in selfhtml aber nichts ähnliches gefunden.
    Ich möchte eine logdatei füttern mit einer seperaten userjnfo.
    Jedoch möchte ich dass,wenn ein Eintrag schon vorhanden ist z.B.
    $date,$username,$ip_now,$agent,$ref
    dass das skript den weiteren vorgang beendet ansonsten soll es diese daten drucken in die log.

    Schau dir mal das PERL Modul Text::Query an, das ermöglicht richtige Queries, hier ist ein Anwendungs - Beispiel: http://perlbase.xwolf.de

    Und mit tie() kannst du erreichen dass eine Datei auf welche die Query angewandt wird nicht komplett in den Speicher geladen wird sondern die Query auf eine Datei im FS erfolgt (siehe perldoc).

    Rolf