problem mit aktualisierung einer logdatei
Alain
- perl
Hallo,
ich habe ein problem mit einer logdatei die mit einem perlscript
aktualisiert wird.Vorher gings halbwegs mit einem DB_File (ausser dass der eintrag datum nicht aktualisiert wurde) jedoch möchte ich anstatt DB eine text
file zum loggen haben.Das script bzw. das problem sieht folgend aus:
my $ag_now = length($ENV{'HTTP_USER_AGENT'}) || '10';
open(LOG, "+>$loginlog") || die "cant open log\n";
flock(LOG,LOCK_EX) || die "cant flock\n";
print LOG "9*0*Jul 10 $username\n" || die "cant print\n";#hab ich nur zum testen
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});#mit logins gibts probleme
#if first time logging in today
if ($date_last ne $date_today)
{
$count_last=0;
}
elsif ($ag_last ne $ag_now)
{
$count_last++;#in der textdatei zählt der eintrag $count_last nicht hoch?!
seek (LOG, 0, 5); #der eintrag soll immer neu überschrieben werden nicht neu.
$logins{$username} = ("$ag_now*$count_last*$date_today");#hier auch,wie kann ich den eintrag aktualisieren?
print LOG "$ag_now*$count_last*$date_today $username\n" || die "cant print\n";
fehlermeldung des servers ist
Use of uninitialized value in string ne at test.cgi line...damit ist if ($date_old ne $date_today) gemeint.
im DB model sah es so aus:
use DB_File;
my $ag_now = length($ENV{'HTTP_USER_AGENT'}) || '10';
my %logins;
my $db = (tie %logins , 'DB_File', "$loginlog", O_RDWR|O_CREAT, 0644);
my $fd = $db->fd;
open(DB_FH, "+<&=$fd");
flock (DB_FH,LOCK_EX);
while (<DB_FH>){
if (!/$username/){
$logins{$username} = "$ag_now*1*$date_today"; #prüft ob der eintrag schon drinn ist
}
}
($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});
#if first time logging in today
if ($date_last ne $date_today)#der eintrag datum wird aber nicht aktualisiert in der DB
{
$count_last=0;
}
elsif ($ag_last ne $ag_now)
{
$count_last++;
$logins{$username} = ("$ag_now*$count_last*$date_today");
Gruss vom
Alain
open(LOG, "+>$loginlog") || die "cant open log\n";
Du kannst hier sinnvollerweise auch noch den Grund für ein Scheitern reinschreiben
open(LOG, "+>$loginlog") || die "cant open log ($!)\n";
print LOG "9*0*Jul 10 $username\n" || die "cant print\n";#hab ich nur zum testen
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});#mit logins gibts probleme
Was hat $logins{$username} für einen Wert?
#if first time logging in today
if ($date_last ne $date_today)
Was hat $date_today für einen Wert?
fehlermeldung des servers ist
Use of uninitialized value in string ne at test.cgi line...damit ist if ($date_old ne $date_today) gemeint.
Das heißt eine von beiden Variabeln ist undefiniert.
Struppi.
hi struppi,
open(LOG, "+>$loginlog") || die "cant open log\n";
Du kannst hier sinnvollerweise auch noch den Grund für ein Scheitern reinschreiben
open(LOG, "+>$loginlog") || die "cant open log ($!)\n";
print LOG "9*0*Jul 10 $username\n" || die "cant print\n";#hab ich nur zum testen
ok,daran liegts nicht.
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});#mit logins gibts probleme
Was hat $logins{$username} für einen Wert?
muss im zusammenhang mit dem eintrag in der logdatei zusammenhängen,welcher so aussieht.
$ag_last*10*datum username
ich wüsste jetzt nicht wie ich das sonst in einem wert schreiben könnte als in split.
Der zusammenhang "useragent*counter*datum username" sollte jeweils mit dem usernamen sein um zu unterscheiden von anderen.
username ohne logins geht glaub ich nicht oder ich weiss nicht wie ich den zusammenhang als wert schreiben soll.
#if first time logging in today
if ($date_last ne $date_today)Was hat $date_today für einen Wert?
my $date = date
;
my $date_today = join( " ", (split(" ",$date)) [1,2] );
schreibt z.B. "Jul 10" in die log.
fehlermeldung des servers ist
Use of uninitialized value in string ne at test.cgi line...damit ist if ($date_old ne $date_today) gemeint.Das heißt eine von beiden Variabeln ist undefiniert.
ja mit der variable hab ich ein problem.
Grüsse
Alain
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});#mit logins gibts probleme
Was hat $logins{$username} für einen Wert?
muss im zusammenhang mit dem eintrag in der logdatei zusammenhängen,welcher so aussieht.
$ag_last*10*datum username
ich wüsste jetzt nicht wie ich das sonst in einem wert schreiben könnte als in split.
Der split greift ja beim Sternchen '*' und zwischen dem Datum und dem Namen ist keines.
username ohne logins geht glaub ich nicht oder ich weiss nicht wie ich den zusammenhang als wert schreiben soll.
???
username ohne Logins geht nicht - heißt was?
du machst eine HTTP-Authentifizierung?
fehlermeldung des servers ist
Use of uninitialized value in string ne at test.cgi line...damit ist if ($date_old ne $date_today) gemeint.Das heißt eine von beiden Variabeln ist undefiniert.
^^^^^^
ja mit der variable hab ich ein problem.
^^^^
welcher von beiden?
Struppi.
hi Struppi,
muss im zusammenhang mit dem eintrag in der logdatei zusammenhängen,welcher so aussieht.
$ag_last*10*datum username
ich wüsste jetzt nicht wie ich das sonst in einem wert schreiben könnte als in split.Der split greift ja beim Sternchen '*' und zwischen dem Datum und dem Namen ist keines.
muss es auch nicht.Es geht nur ums zählen also die zahl zwischen den zwei ** im zusammenhang mit dem usernamen,
der sich authentifiziert hat.
username ohne logins geht glaub ich nicht oder ich weiss nicht wie ich den zusammenhang als wert schreiben soll.
???
username ohne Logins geht nicht - heißt was?
du machst eine HTTP-Authentifizierung?
htaccess auth - ja das tu ich.
fehlermeldung des servers ist
Use of uninitialized value in string ne at test.cgi line...damit ist if ($date_last ne $date_today) gemeint.Das heißt eine von beiden Variabeln ist undefiniert.
^^^^^^
ich nehm mal an mit date_last ,aber die steht ja schon in der Log als alt eintrag,welche ja mit
dem string
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});
deklariert wird.
Grüsse vom
Alain
$ag_last*10*datum username
ich wüsste jetzt nicht wie ich das sonst in einem wert schreiben könnte als in split.Der split greift ja beim Sternchen '*' und zwischen dem Datum und dem Namen ist keines.
muss es auch nicht.Es geht nur ums zählen also die zahl zwischen den zwei ** im zusammenhang mit dem usernamen,
der sich authentifiziert hat.
???
Du schreibst das:
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});
und danach machst du if($xxx ne $date_last) und jetzt behauptest du du würdest nur den 2 Wert nehmen?
Lass dir doch mal die dreit Werte ausgeben, ob die dem entsprechen was du erwartest.
username ohne logins geht glaub ich nicht oder ich weiss nicht wie ich den zusammenhang als wert schreiben soll.
???
username ohne Logins geht nicht - heißt was?
du machst eine HTTP-Authentifizierung?htaccess auth - ja das tu ich.
Ich seh nirgendwo wo du auf dem Namen zugreifst.
ich nehm mal an mit date_last ,aber die steht ja schon in der Log als alt eintrag,welche ja mit
dem string
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});
deklariert wird.
Ja sie dird deklariert, aber nicht definiert, das ist ein Unterschied und wird auch in der Fehlermeldung do beschrieben.
Was heißt ich nehm mal an? Was hast du getan um das zu überprüfen? Du solltest Varibeln immer prüfen, da du nie sicher sein kanst das das passiert was du erwartest.
also in der Art:
if(defined $username && exists $logins{$username}){
my ($ag_last,$count_last,$date_last) = split(/\*/,$logins{$username});
die "Fehler ag_last nicht definiert($logins{$username})" unless defined $ag_last;
die "Fehler count nicht definiert($logins{$username})" unless defined $count;
die "Fehler last_date nicht definiert($logins{$username})" unless defined $last_date ;
Dann kommst du auch schneller solchen Fehlern auf die Spur.
Struppi.