Apache Logfile- Größe begrenzen
Hallo,
wie der Titel schon sagt.
Wie kann ich es anstellen das die Logfiles meines Apachen nicht unendlich groß werden ?
Ich möchte die Größe gerne auf eine bestimmte MB-Zahl begrenzen.
Jemand ne Idee ?
wie der Titel schon sagt.
Wie kann ich es anstellen das die Logfiles meines Apachen nicht unendlich groß werden ?
Ich möchte die Größe gerne auf eine bestimmte MB-Zahl begrenzen.
Jemand ne Idee ?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 72239
Url: https://administrator.de/forum/apache-logfile-groesse-begrenzen-72239.html
Ausgedruckt am: 24.12.2024 um 12:12 Uhr
41 Kommentare
Neuester Kommentar
läuft dein apache unter linux oder windows?
unter linux gibt es nettes programm namens sed (stream oriented editor). damit kannst du in einer beliebigen datei nach bestimmten zeilen suchen und die löschen oder editieren. eine genaue beschreibung des editors erhälst du aus den manual pages ( man sed ).
damit solltest du dein problem lösen können. die zeilen beginnen immer mit einem bestimmten muster (zeit, datum). du suchst mit dem sed z.B nach zeilen die älter sind als X tagen und löscht sie einfach. um die größe zu beeinflussen, müsste man mehr aufwand betreiben. ersteinmal die größe der datei ermitteln, ist sie größer als deine vorgabe, löscht du eine bestimmte anzahl an zeilen in der datei. das kann man mit einem shellscript realisieren, das wiederum mit cron gestartet wird, wenn der rechner startet oder nach einer bestimmten zeitvorgabe dein logfile überprüft.
unter linux gibt es nettes programm namens sed (stream oriented editor). damit kannst du in einer beliebigen datei nach bestimmten zeilen suchen und die löschen oder editieren. eine genaue beschreibung des editors erhälst du aus den manual pages ( man sed ).
damit solltest du dein problem lösen können. die zeilen beginnen immer mit einem bestimmten muster (zeit, datum). du suchst mit dem sed z.B nach zeilen die älter sind als X tagen und löscht sie einfach. um die größe zu beeinflussen, müsste man mehr aufwand betreiben. ersteinmal die größe der datei ermitteln, ist sie größer als deine vorgabe, löscht du eine bestimmte anzahl an zeilen in der datei. das kann man mit einem shellscript realisieren, das wiederum mit cron gestartet wird, wenn der rechner startet oder nach einer bestimmten zeitvorgabe dein logfile überprüft.
Hallo Franzmann!
"GNU sed v4.0.7" für DOS/Windows findest Du, zusammen mit anderen Versionen, zB hier ...
Grüße
bastla
"GNU sed v4.0.7" für DOS/Windows findest Du, zusammen mit anderen Versionen, zB hier ...
Grüße
bastla
@Franzmann
Also ich muss da leider passen. Würde dir gern helfen, aber ich kenne die Syntax nicht. (ist das VBS? oder Batch? ).
Aber ich werde den Beitrag weiter verfolgen um zu sehen wie man sowas unter Windows realisiert.
Viel Erfolg weiterhin...
Also ich muss da leider passen. Würde dir gern helfen, aber ich kenne die Syntax nicht. (ist das VBS? oder Batch? ).
Aber ich werde den Beitrag weiter verfolgen um zu sehen wie man sowas unter Windows realisiert.
Viel Erfolg weiterhin...
Hallo Franzmann!
Grüße
bastla
Nicht so einfach ;)
... würde ich bei diesem Datumsformat ([Wed Sep 12 10:11:51 2007]) auch sagen, daher folgende Fragen:- Könntest (wolltest) Du das Format auf "YYYY-MM-DD ..." (oder noch besser "YYYYMMDD ...") ändern, bzw falls nicht:
- Wird der Tag mit oder ohne führende Null geschrieben ("Wed Sep 05" oder "Wed Sep 5")?
- Steht Datum/Zeit tatsächlich zwischen "[" und "]"?
- Könnte es sein, dass der String "Sep 12" auch in Zeilen auftaucht, die nicht gelöscht werden sollen?
Grüße
bastla
Hallo Franzmann!
Auf Deinem ursprünglichen Vorhaben basierend (die Einträge der ersten 5 Tage zu löschen), könnte ich folgenden Batch zum Testen anbieten:
Eigentlich müsstest Du nur die Pfadangabe zur Logdatei (bitte eine Kopie verwenden) in der ersten "set"-Zeile anpassen und danach den Batch starten, um alle Einträge mit dem ältesten Datum und den 4 (siehe zweite "set"-Zeile) darauf folgenden Tagen zu entfernen.
Voraussetzung ist dabei, dass bereits die erste Logdatei-Zeile (und natürlich alle weiteren) mit dem von Dir beschriebenen Datumsformat ([Wed Sep 12 10:11:51 2007]) beginnt (also keine Kopfzeile vorhanden ist), da aus dieser ersten Zeile das älteste Datum ermittelt wird.
Grüße
bastla
P.S.: Muss leider weg und bin erst am späteren Abend wieder zurück.
Auf Deinem ursprünglichen Vorhaben basierend (die Einträge der ersten 5 Tage zu löschen), könnte ich folgenden Batch zum Testen anbieten:
@echo off & setlocal
set "Log=D:\Apache-TestLog.txt"
set "Days=4"
set "Src=%temp%\ALogTemp.txt"
set "Dst=%temp%\ALog.txt"
set "GFD=%temp%\GetFormattedDate.vbs"
echo sM=",Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec":aM=Split(sM,","):aW=Array("","Sun","Mon","Tue","Wed","Thu","Fri","Sat")>%GFD%
echo iDDiff=-WScript.Arguments(0):iM=InStr(sM,WScript.Arguments(1)):If iM=0 Then WScript.Quit(1) Else iM=(iM+2)/4>>%GFD%
echo dtD=DateSerial(WScript.Arguments(3),iM,WScript.Arguments(2)-iDDiff):If Not IsDate(dtD) Then WScript.Quit(1)>>%GFD%
echo WScript.Echo aW(Weekday(dtD))^&" "^&aM(Month(dtD))^&" "^&Right("0"^&Day(dtD),2)>>%GFD%
set /p FirstLine=<"%Log%"
for /f "tokens=2,3,5 delims= " %%i in ('echo %FirstLine%') do set "Dat=%%i %%j %%k"
copy "%Log%" "%Dst%">nul
for /l %%d in (0,1,%Days%) do call :RemoveDeltaDayLogEntries %%d
move "%Dst%" "%Log%"
goto :eof
:RemoveDeltaDayLogEntries
for /f "delims=" %%i in ('cscript //nologo %GFD% %1 %Dat%') do set "Filter=%%i"
if not defined Filter goto :eof
echo Entferne Zeilen mit Datum: %Filter%
move "%Dst%" "%Src%"
findstr /v /b "[%Filter%" "%Src%" > "%Dst%"
Voraussetzung ist dabei, dass bereits die erste Logdatei-Zeile (und natürlich alle weiteren) mit dem von Dir beschriebenen Datumsformat ([Wed Sep 12 10:11:51 2007]) beginnt (also keine Kopfzeile vorhanden ist), da aus dieser ersten Zeile das älteste Datum ermittelt wird.
Grüße
bastla
P.S.: Muss leider weg und bin erst am späteren Abend wieder zurück.
hallo,
wenn sed für windows erhältlich ist, dann kann man auch mit der suchmustererkennung die zeilen, welche man löschen möchte erkennen. mit hilfe von suchmustern und feldern sollte es klappen.
wir wissen, das ein blank zwischen dem zeitformat vorhanden ist also können wir auch den wochentag überlesen und an der stelle des datums beginnen.
z.B. kann man mit
! -> sed -n '1,20p' dateiname
die ersten 20 zeilen anzeigen lassen.
um eine zeile zu löschen die ein "muster" enthält. kann man schreiben
! -> sed '/muster/d' dateiname
nun müssen wir noch den wochentag überlesen und das "muster" mit hilfe von regulären ausdrücken ersetzen.
! -> sed '/* [aA-zZ] [01][0-9] [01]:[0-5]·[0-9]/d'
ich hoffe das ich mich noch recht erinnere....
ich versuche das mal zu erleutern.
ich bin nicht mehr ganz sicher, ist einfach zu lange her. aber so in der art haben wir das im studium gelernt.
man sed
gibt die genaue anleitung .
wie schon gesagt: ist für linux aber weiter oben hat jemand gesagt, dass es sed auch für windows gibt.
wenn sed für windows erhältlich ist, dann kann man auch mit der suchmustererkennung die zeilen, welche man löschen möchte erkennen. mit hilfe von suchmustern und feldern sollte es klappen.
wir wissen, das ein blank zwischen dem zeitformat vorhanden ist also können wir auch den wochentag überlesen und an der stelle des datums beginnen.
z.B. kann man mit
! -> sed -n '1,20p' dateiname
die ersten 20 zeilen anzeigen lassen.
um eine zeile zu löschen die ein "muster" enthält. kann man schreiben
! -> sed '/muster/d' dateiname
nun müssen wir noch den wochentag überlesen und das "muster" mit hilfe von regulären ausdrücken ersetzen.
! -> sed '/* [aA-zZ] [01][0-9] [01]:[0-5]·[0-9]/d'
ich hoffe das ich mich noch recht erinnere....
ich versuche das mal zu erleutern.
- irgendein zeichen egal welches, dann ein blank, dann um den wochentag zu überlesen alle buchstaben egal ob groß oder klein, dann wieder ein blank, dann den monatstag, dann das zeitformat.
ich bin nicht mehr ganz sicher, ist einfach zu lange her. aber so in der art haben wir das im studium gelernt.
man sed
gibt die genaue anleitung .
wie schon gesagt: ist für linux aber weiter oben hat jemand gesagt, dass es sed auch für windows gibt.
Hmmm, bei sowas mach ich gerne mit...
Nein geht nicht !
Klar geht das. Selbst unter Windows, da wette ich...
Laut meiner Recherche hier ist
The common log format is defined like this:
%h %l %u %t "%r" %>s %b
...mit %t als diese Standarddarstellung des Timestamps.
...und etwas tiefer steht...
Configurable Format Reference
Here are all the % sequences allowed in the configurable log format in Apache.
%b bytes sent, excluding HTTP headers
...
%t time, in common log format time format
%{format}t The time, in the form given by format, which should be in strftime format
was bedeuten könnte, mit einem (sinngemäß/ungetestet!) Befehl
...sollte das Leben und das Logfile einfacher werden.
Grüße
Biber
* Könntest (wolltest) Du das Format auf "YYYY-MM-DD ..." (oder noch besser "YYYYMMDD ...") ....
Nein geht nicht !
Klar geht das. Selbst unter Windows, da wette ich...
Laut meiner Recherche hier ist
The common log format is defined like this:
%h %l %u %t "%r" %>s %b
...mit %t als diese Standarddarstellung des Timestamps.
...und etwas tiefer steht...
Configurable Format Reference
Here are all the % sequences allowed in the configurable log format in Apache.
%b bytes sent, excluding HTTP headers
...
%t time, in common log format time format
%{format}t The time, in the form given by format, which should be in strftime format
was bedeuten könnte, mit einem (sinngemäß/ungetestet!) Befehl
LogFormat %{"%YY-%mm-%dd %HH:%MM:%SS")t {und der Rest der Zeile nach Belieben}
-oder-
LogFormat %{"%YYYY%%mm%dd %HH:%MM:%SS")t
Grüße
Biber
ich bin auch auf der Suche nach einer Lösung für dieses Problem ... bin dann hier auf diesen Beitrag gestossen ...
ich hatte das gestern Abend auch mal gestestet ... ich kriege eine ähnliche Fehlermeldung ... bei mir kann "DAV/2" syntaktisch nicht verarbeitet werden ... kann mir leider nur keinen Reim draus machen
ich hatte das gestern Abend auch mal gestestet ... ich kriege eine ähnliche Fehlermeldung ... bei mir kann "DAV/2" syntaktisch nicht verarbeitet werden ... kann mir leider nur keinen Reim draus machen
aber klar doch ... vielen Dank schon mal für die Hilfe ...
[Thu Sep 20 21:50:22 2007] [notice] Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3 configured -- resuming normal operations
[Thu Sep 20 21:50:22 2007] [notice] Server built: Mar 5 2007 11:23:00
[Thu Sep 20 21:50:22 2007] [notice] Parent: Created child process 2720
[Thu Sep 20 21:50:24 2007] [notice] Child 2720: Child process is running
[Thu Sep 20 21:50:24 2007] [notice] Child 2720: Acquired the start mutex.
[Thu Sep 20 21:50:24 2007] [notice] Child 2720: Starting 250 worker threads.
[Thu Sep 20 21:50:24 2007] [notice] Child 2720: Starting thread to listen on port 443.
[Thu Sep 20 21:50:24 2007] [notice] Child 2720: Starting thread to listen on port 80.
[Fri Sep 21 06:32:18 2007] [notice] Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3 configured -- resuming normal operations
[Fri Sep 21 06:32:18 2007] [notice] Server built: Mar 5 2007 11:23:00
[Fri Sep 21 06:32:18 2007] [notice] Parent: Created child process 1880
[Fri Sep 21 06:32:19 2007] [notice] Child 1880: Child process is running
[Fri Sep 21 06:32:19 2007] [notice] Child 1880: Acquired the start mutex.
[Fri Sep 21 06:32:19 2007] [notice] Child 1880: Starting 250 worker threads.
[Fri Sep 21 06:32:19 2007] [notice] Child 1880: Starting thread to listen on port 80.
[Fri Sep 21 06:32:19 2007] [notice] Child 1880: Starting thread to listen on port 443.
[Fri Sep 21 17:54:13 2007] [notice] Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3 configured -- resuming normal operations
[Fri Sep 21 17:54:13 2007] [notice] Server built: Mar 5 2007 11:23:00
[Fri Sep 21 17:54:13 2007] [notice] Parent: Created child process 2056
[Fri Sep 21 17:54:14 2007] [notice] Child 2056: Child process is running
[Fri Sep 21 17:54:14 2007] [notice] Child 2056: Acquired the start mutex.
[Fri Sep 21 17:54:14 2007] [notice] Child 2056: Starting 250 worker threads.
[Fri Sep 21 17:54:14 2007] [notice] Child 2056: Starting thread to listen on port 443.
[Fri Sep 21 17:54:14 2007] [notice] Child 2056: Starting thread to listen on port 80.
Hallo!
Neuer Versuch:
Neben einer Korrektur/Ergänzung gibt es noch eine Änderung: Die in der Zeile "set /p Days=5" angegebene Tageanzahl muss nicht (wie in der ersten Version) um 1 vermindert sein, sondern entspricht jetzt der Anzahl der zu löschenden Tage (also im Beispiel: 5).
Grüße
bastla
Neuer Versuch:
@echo off & setlocal
set "Log=D:\Apache-TestLog.txt"
set /a Days=5
set "Src=%temp%\ALogTemp.txt"
set "Dst=%temp%\ALog.txt"
set "GFD=%temp%\GetFormattedDate.vbs"
echo sM=",Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec":aM=Split(sM,","):aW=Array("","Sun","Mon","Tue","Wed","Thu","Fri","Sat")>%GFD%
echo iDDiff=-WScript.Arguments(0):iM=InStr(sM,WScript.Arguments(1)):If iM=0 Then WScript.Quit(1) Else iM=(iM+2)/4>>%GFD%
echo dtD=DateSerial(WScript.Arguments(3),iM,WScript.Arguments(2)-iDDiff):If Not IsDate(dtD) Then WScript.Quit(1)>>%GFD%
echo WScript.Echo aW(Weekday(dtD))^&" "^&aM(Month(dtD))^&" "^&Right("0"^&Day(dtD),2)>>%GFD%
set /p FirstLine=<%Log%
set FirstLine=%FirstLine:~0,26%
for /f "tokens=2,3,5 delims= " %%i in ('echo %FirstLine%') do set "Dat=%%i %%j %%k"
set /a Days-=1
copy "%Log%" "%Dst%">nul
for /l %%d in (0,1,%Days%) do call :RemoveDeltaDayLogEntries %%d
move "%Dst%" "%Log%"
goto :eof
:RemoveDeltaDayLogEntries
for /f "delims=" %%i in ('cscript //nologo %GFD% %1 %Dat%') do set "Filter=%%i"
if not defined Filter goto :eof
echo Entferne Zeilen mit Datum: %Filter%
move "%Dst%" "%Src%"
findstr /v /b "[%Filter%" "%Src%" > "%Dst%"
Neben einer Korrektur/Ergänzung gibt es noch eine Änderung: Die in der Zeile "set /p Days=5" angegebene Tageanzahl muss nicht (wie in der ersten Version) um 1 vermindert sein, sondern entspricht jetzt der Anzahl der zu löschenden Tage (also im Beispiel: 5).
Grüße
bastla
Hallo Franzmann!
Du scheinst überzählige Zeilenumbrüche (zB in der Zeile "echo sM=",Jan,Feb ...." gleich nach dem "echo") in der Datei zu haben ...
Vielleicht kurz zur Funktionsweise: die "echo"-Zeilen ab der oben Beschriebenen bis zu "echo WScript.Echo aW(Weekday ..." erstellen ein VBScript (die Berechnung/Formatierung der Datumsangaben inkl der Wochentage lässt sich so einfacher realisieren als in Batch) in "%temp%\GetFormattedDate.vbs", daher müssen die jeweiligen Zeilen (ohne Umbrüche) intakt bleiben.
Ein "echo on" schadet dabei allerdings nicht ...
Grüße
bastla
Du scheinst überzählige Zeilenumbrüche (zB in der Zeile "echo sM=",Jan,Feb ...." gleich nach dem "echo") in der Datei zu haben ...
Vielleicht kurz zur Funktionsweise: die "echo"-Zeilen ab der oben Beschriebenen bis zu "echo WScript.Echo aW(Weekday ..." erstellen ein VBScript (die Berechnung/Formatierung der Datumsangaben inkl der Wochentage lässt sich so einfacher realisieren als in Batch) in "%temp%\GetFormattedDate.vbs", daher müssen die jeweiligen Zeilen (ohne Umbrüche) intakt bleiben.
Ein "echo on" schadet dabei allerdings nicht ...
Grüße
bastla
hallo,
ich bin sehr froh das es bei euch funkt.
würde das gern für ein windowssystem mit apache übernehmen. aber irgendwie habe ich den anschluss verloren.
wie habt ihr das format geändert, so dass am anfang einer zeile [Wed Sep 12 10:11:51 2006] steht.
ich habe versucht die config zu ändern, aber dann startet apache nicht mehr [lol]!
ist die zeile so richtig?
%{"%YYYY%%mm%dd%HH:%MM:%SS"}t
bei mir steht:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
kann mir einer von euch bitte mal die editierte zeilen zeigen???
thx
patric
ich bin sehr froh das es bei euch funkt.
würde das gern für ein windowssystem mit apache übernehmen. aber irgendwie habe ich den anschluss verloren.
wie habt ihr das format geändert, so dass am anfang einer zeile [Wed Sep 12 10:11:51 2006] steht.
ich habe versucht die config zu ändern, aber dann startet apache nicht mehr [lol]!
ist die zeile so richtig?
%{"%YYYY%%mm%dd%HH:%MM:%SS"}t
bei mir steht:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
kann mir einer von euch bitte mal die editierte zeilen zeigen???
thx
patric
hier ist die ausgabe meiner datei:
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Log=E:\access.log"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Days=6"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Src=C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ALogTemp.txt"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Dst=C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ALog.txt"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "GFD=C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs"
C:\Dokumente und Einstellungen\Administrator\Desktop>echo sM=",Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec":aM=Split(sM,","):aW=Array("","Sun","Mon","Tue","Wed","Thu","Fri","Sat") 1>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>echo iDDiff=-WScript.Arguments(0):iM=InStr(sM,WScript.Arguments(1)):If iM=0 Then WScript.Quit(1) Else iM=(iM+2)/4 1>>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>echo dtD=DateSerial(WScript.Arguments(3),iM,WScript.Arguments(2)-iDDiff):If Not IsDate(dtD) Then WScript.Quit(1) 1>>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>echo WScript.Echo aW(Weekday(dtD))&" "&aM(Month(dtD))&" "&Right("0"&Day(dtD),2) 1>>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>set /p FirstLine= 0<"E:\access.log"
C:\Dokumente und Einstellungen\Administrator\Desktop>for /f "tokens=2,3,5 delims= " %i in ('echo [Thu Sep 20 21:50:22 2007] [notice] Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3 configured -- resuming normal operations') do set "Dat=%i %j %k"
ich bekomme keine fehlermeldung aber die access.log wird nicht kleiner....
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Log=E:\access.log"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Days=6"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Src=C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ALogTemp.txt"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "Dst=C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\ALog.txt"
C:\Dokumente und Einstellungen\Administrator\Desktop>set "GFD=C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs"
C:\Dokumente und Einstellungen\Administrator\Desktop>echo sM=",Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec":aM=Split(sM,","):aW=Array("","Sun","Mon","Tue","Wed","Thu","Fri","Sat") 1>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>echo iDDiff=-WScript.Arguments(0):iM=InStr(sM,WScript.Arguments(1)):If iM=0 Then WScript.Quit(1) Else iM=(iM+2)/4 1>>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>echo dtD=DateSerial(WScript.Arguments(3),iM,WScript.Arguments(2)-iDDiff):If Not IsDate(dtD) Then WScript.Quit(1) 1>>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>echo WScript.Echo aW(Weekday(dtD))&" "&aM(Month(dtD))&" "&Right("0"&Day(dtD),2) 1>>C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp\GetFormattedDate.vbs
C:\Dokumente und Einstellungen\Administrator\Desktop>set /p FirstLine= 0<"E:\access.log"
C:\Dokumente und Einstellungen\Administrator\Desktop>for /f "tokens=2,3,5 delims= " %i in ('echo [Thu Sep 20 21:50:22 2007] [notice] Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8e mod_autoindex_color PHP/5.2.3 configured -- resuming normal operations') do set "Dat=%i %j %k"
ich bekomme keine fehlermeldung aber die access.log wird nicht kleiner....
Hallo IRIXuser!
Soferne ich das richtig sehe, verwendest Du aber nicht die um 11:30:09 Uhr gepostete Version?
Grüße
bastla
Soferne ich das richtig sehe, verwendest Du aber nicht die um 11:30:09 Uhr gepostete Version?
Grüße
bastla
hi,
ja du hast recht. ich hatte wohl die falsche version benutzt.
jetzt habe ich mir das mal genau angesehen und ich habe einige fragen zu dem script.
in der ersten echo zeile die variablen sM und aW .
ich benutze apache 2 und bei mir steht im ersten feld nicht [Wed... sondern [10....
für den Monat. also ein numerischer eintrag.
hier ein auszug der ersten zeile meines logfiles
[31/Okt/2007:18:04:41 +0100] - username IP ...........
ich habe die seite, welche du gelinkt hast gelesen (apacheweek) und danach meinen
%t eintrag nach vorn geholt. aber ich habe das gefühl das es so nicht mit deinem script übereinstimmt. mein script heisst clear.bat und wenn ich clear.bat > out.out umleite und mir das anschaue, sieht es ganz gut aus. keine fehler. aber die datei ist immer noch so wie zuvor.
wie muss ich das script von dir anpassen??? evtl in GetFormattedDate.vbs ???
dann habe ich nochmal eine allgemeine frage zu dem script.
du rufst in einer for schleife :RemoveDeltaDayLogEntries auf.
und weiter unten steht wieder :RemoveDeltaDayLogEntries
ist das eine funktion, die du dort aufrufst?
mir kommt das so ein bisschen C ähnlich vor (abgesehen von der syntax)
patric
ja du hast recht. ich hatte wohl die falsche version benutzt.
jetzt habe ich mir das mal genau angesehen und ich habe einige fragen zu dem script.
in der ersten echo zeile die variablen sM und aW .
ich benutze apache 2 und bei mir steht im ersten feld nicht [Wed... sondern [10....
für den Monat. also ein numerischer eintrag.
hier ein auszug der ersten zeile meines logfiles
[31/Okt/2007:18:04:41 +0100] - username IP ...........
ich habe die seite, welche du gelinkt hast gelesen (apacheweek) und danach meinen
%t eintrag nach vorn geholt. aber ich habe das gefühl das es so nicht mit deinem script übereinstimmt. mein script heisst clear.bat und wenn ich clear.bat > out.out umleite und mir das anschaue, sieht es ganz gut aus. keine fehler. aber die datei ist immer noch so wie zuvor.
wie muss ich das script von dir anpassen??? evtl in GetFormattedDate.vbs ???
dann habe ich nochmal eine allgemeine frage zu dem script.
du rufst in einer for schleife :RemoveDeltaDayLogEntries auf.
und weiter unten steht wieder :RemoveDeltaDayLogEntries
ist das eine funktion, die du dort aufrufst?
mir kommt das so ein bisschen C ähnlich vor (abgesehen von der syntax)
patric
Hallo IRIXuser!
Du kannst das Format für die Datumsangabe unverändert lassen - ich habe das Script entsprechend angepasst an
Sollte tatsächlich, wie Du vorher schreibst, das Datum mit dem Monat, also 10, beginnen, müsstest Du eine Logzeile in diesem Format posten.
In der aufgerufenen Prozedur wird diese Differenz samt dem Basisdatum dem oben erstellten VBScript übergeben, welches als Rückgabewert einen formatierten Datumsstring für (Basisdatum + %%d Tage) liefert.
Dieser String wird letztlich als Suchkriterium für die zu löschenden (genauer: auszufilternden, daher "findstr /v") Zeilen verwendet (Zeile muss mit [Datumsstring beginnen - daher "findstr /b").
Gelöscht wird also jeweils nur ein Tag, daher die Verwendung der beiden temporären Dateien %Src% und %Dst% zum Zwischenspeichern des gekürzten Logs (und das "move" des vorigen Ergebnisses %Dst% in die neue Ausgangsdatei %Src%).
Die Idee, die wir tatsächlich beide hatten: Eine rein numerische Datumsschreibweise "YYYYMMDD" ließe sich in Batch leichter weiter verarbeiten, als dies mit der Variante "Monat als Abkürzung" oder (eigentlich noch schlimmer) "vorangestelltem abgekürzten Wochentag" möglich ist - deswegen auch die Verwendung des VBScripts.
Grüße
bastla
Du kannst das Format für die Datumsangabe unverändert lassen - ich habe das Script entsprechend angepasst an
[31/Okt/2007:18:04:41 +0100] - username IP ...........
@echo off & setlocal
set "Log=E:\access.log"
set /a Days=7
set "Src=%temp%\ALogTemp.txt"
set "Dst=%temp%\ALog.txt"
set "GFD=%temp%\GetFormattedDate.vbs"
echo sM=",Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez":aM=Split(sM,",")>%GFD%
echo iDDiff=-WScript.Arguments(0):iM=InStr(sM,WScript.Arguments(2)):If iM=0 Then WScript.Quit(1) Else iM=(iM+2)/4>>%GFD%
echo dtD=DateSerial(WScript.Arguments(3),iM,WScript.Arguments(1)-iDDiff):If Not IsDate(dtD) Then WScript.Quit(1)>>%GFD%
echo WScript.Echo Right("0"^&Day(dtD),2)^&"/"^&aM(Month(dtD))^&"/"^&Year(dtD)>>%GFD%
set /p FirstLine=<%Log%
set FirstLine=%FirstLine:~1,11%
for /f "tokens=1-3 delims=/" %%i in ('echo %FirstLine%') do set "Dat=%%i %%j %%k"
set /a Days-=1
copy "%Log%" "%Dst%">nul
for /l %%d in (0,1,%Days%) do call :RemoveDeltaDayLogEntries %%d
move "%Dst%" "%Log%"
goto :eof
:RemoveDeltaDayLogEntries
for /f "delims=" %%i in ('cscript //nologo %GFD% %1 %Dat%') do set "Filter=%%i"
if not defined Filter goto :eof
echo Entferne Zeilen mit Datum: %Filter%
move "%Dst%" "%Src%"
findstr /v /b "[%Filter%" "%Src%" > "%Dst%"
du rufst in einer for schleife :RemoveDeltaDayLogEntries auf.
und weiter unten steht wieder :RemoveDeltaDayLogEntries
ist das eine funktion, die du dort aufrufst?
Eigentlich eine Prozedur (Unterprogramm) - der Aufruf erfolgt aus einer Zählschleife (von 0 bis Days-1), welche die Tagesdifferenz zum in der ersten Zeile gefundenen Datum (Basisdatum) übergibt.und weiter unten steht wieder :RemoveDeltaDayLogEntries
ist das eine funktion, die du dort aufrufst?
In der aufgerufenen Prozedur wird diese Differenz samt dem Basisdatum dem oben erstellten VBScript übergeben, welches als Rückgabewert einen formatierten Datumsstring für (Basisdatum + %%d Tage) liefert.
Dieser String wird letztlich als Suchkriterium für die zu löschenden (genauer: auszufilternden, daher "findstr /v") Zeilen verwendet (Zeile muss mit [Datumsstring beginnen - daher "findstr /b").
Gelöscht wird also jeweils nur ein Tag, daher die Verwendung der beiden temporären Dateien %Src% und %Dst% zum Zwischenspeichern des gekürzten Logs (und das "move" des vorigen Ergebnisses %Dst% in die neue Ausgangsdatei %Src%).
ich habe die seite, welche du gelinkt hast gelesen (apacheweek) ...
Damit Du mich nicht mit fremden Federn schmückst: Den Link hat Biber gefunden ...Die Idee, die wir tatsächlich beide hatten: Eine rein numerische Datumsschreibweise "YYYYMMDD" ließe sich in Batch leichter weiter verarbeiten, als dies mit der Variante "Monat als Abkürzung" oder (eigentlich noch schlimmer) "vorangestelltem abgekürzten Wochentag" möglich ist - deswegen auch die Verwendung des VBScripts.
Grüße
bastla
Hallo IRIXuser!
Vielleicht wird das Script so etwas leichter zu durchschauen:
Ein Auge solltest Du noch auf die Monatsnamen haben (zB ob "Jan" - in der jetzigen Version - oder "Jän"); das kannst Du dann gegebenen Falls aber sicher auch in der "Kurzfassung" oben selbst anpassen ...
Grüße
bastla
ganz schön abstrakt die sprache.
Sieht schlimmer aus, als es wirklich ist - speziell das VBScript habe ich halt stark "eingedampft" ...Vielleicht wird das Script so etwas leichter zu durchschauen:
sM = ",Jan,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez" 'verwendete Monatsnamen
'Aufteilung der Namen (in ein Array; eigentlich nullbasiert,
' aber durch das erste Komma oben stimmen Name und Monatszahl überein)
aM = Split(sM, ",")
'Erstes übergebenes Argument (ebenfalls nullbasiert) ist die Tagedifferenz
' (das "-" ist syntaktisch bedingt - siehe unten)
iDDiff = -WScript.Arguments(0)
'Monatsnummer als Integer ermitteln - Schritt 1: Position im String sM feststellen
iM = InStr(sM, WScript.Arguments(2))
If iM = 0 Then 'Monatsname gefunden?
'Nein, daher Ende (mit Errorlevel 1 - wird zwar nicht weiter verwendet,
' schadet aber auch nicht)
WScript.Quit(1)
Else
'Monatsnummer als Integer ermitteln - Schritt 2: aus Position im String Monatszahl ermitteln
iM = (iM + 2) / 4
End If
'Datum aus iM und den weiteren Argumenten zusammenstellen - Jahr, Monat, Tag;
' dabei auch gleich Tagedifferenz berücksichtigen -
' hier wird ein negativer Wert benötigt, daher oben der Vorzeichenwechsel
dtD = DateSerial(WScript.Arguments(3), iM, WScript.Arguments(1)- iDDiff)
'Falls kein gültiges Datum entstanden ist, mit Fehler beenden
If Not IsDate(dtD) Then WScript.Quit(1)
'Datum formatiert ausgeben: Tag mit führender 0, Monat als Text
WScript.Echo _
Right("0" & Day(dtD), 2) & "/" & _
aM(Month(dtD)) & "/" & _
Year(dtD)
Grüße
bastla
Hmmm,
das Thema "eigenes LogFile-Format setzen" ist irgendwie noch nicht durch für mich...
Muss ja nicht sein, dass ein begnadeter bastla für jedes irgendwo scheinbar zufällig vom Himmel fallende Logfile-Datumsformat eine eigene kleine Routine schreibt.
Auch wenn er im Routinen schreiben durchaus routiniert ist.
Deshalb noch mal zu der meiner oben zusammenphantasierten NICHT funktionierenden Behauptung:
---> nicht ganz, vermutlich ist die Syntax eher so, dass mit...
...so eine Logzeile definiert wird.
@IRIXuser
Deshalb wäre für das Verstehen der Syntax der Logformat-Direktive ganz interessant, was bei Dir in der httpd.conf drinsteht an "Logformat"-Zeilen.
Denn Dein Datumsformat unterscheidet sich ja schon von Franzmanns....
Grüße
Biber
Deshalb
das Thema "eigenes LogFile-Format setzen" ist irgendwie noch nicht durch für mich...
Muss ja nicht sein, dass ein begnadeter bastla für jedes irgendwo scheinbar zufällig vom Himmel fallende Logfile-Datumsformat eine eigene kleine Routine schreibt.
Auch wenn er im Routinen schreiben durchaus routiniert ist.
Deshalb noch mal zu der meiner oben zusammenphantasierten NICHT funktionierenden Behauptung:
....was bedeuten könnte, mit einem (sinngemäß/ungetestet!) Befehl
LogFormat %{"%YY-%mm-%dd %HH:%MM:%SS")t {und der Rest der Zeile nach Belieben}
-oder-
LogFormat %{"%YYYY%%mm%dd %HH:%MM:%SS")t
LogFormat %{"%YY-%mm-%dd %HH:%MM:%SS")t {und der Rest der Zeile nach Belieben}
-oder-
LogFormat %{"%YYYY%%mm%dd %HH:%MM:%SS")t
---> nicht ganz, vermutlich ist die Syntax eher so, dass mit...
Logformat "%{%Y%m%d %H:%M %S}t [...weitere definierte %-Vars..] " NameDesLogformats
@IRIXuser
Deshalb wäre für das Verstehen der Syntax der Logformat-Direktive ganz interessant, was bei Dir in der httpd.conf drinsteht an "Logformat"-Zeilen.
Denn Dein Datumsformat unterscheidet sich ja schon von Franzmanns....
Grüße
Biber
Deshalb
hallo,
@bastla
danke für die erleuterung des scripts, es ist jetzt nicht mehr so abstrakt wie zuvor.
und - was ich gestern schon erwähnen wollte, schmücken wollte ich niemanden' wollte nur andeuten, dass ich mich mit der thematik auseinander gesetzt habe, was auch dazu führte, dass ich jetzt an Biber schreiben kann:
@Biber
auf der seite apacheweek (common format) habe ich gesehen, dass die fomatierung in der form
und meine zeile in der config sieht nun so aus:
die von euch vorgeschlagene formatierung :
der grund warum sich die formatierung zu der config von franzmann unterscheidet, kann ich nur damit erklären, dass sich evtl. die version von apache unterscheidet.
ich benutze den apachen 2.2.4 .
da ich windows nur für CAD und Flash benutze, und zufällig gerade einen webserver auf windows aufgesetzt hatte, war ich schon interessiert, wie sich das thema mit dem logfile entwickelt.
aber es macht spass mit leuten wie euch "erfahrungen" auszutauschen.....
schade das der beitrag nun zum ende kommt....
grüße aus hannover
patric
@bastla
danke für die erleuterung des scripts, es ist jetzt nicht mehr so abstrakt wie zuvor.
und - was ich gestern schon erwähnen wollte, schmücken wollte ich niemanden' wollte nur andeuten, dass ich mich mit der thematik auseinander gesetzt habe, was auch dazu führte, dass ich jetzt an Biber schreiben kann:
@Biber
auf der seite apacheweek (common format) habe ich gesehen, dass die fomatierung in der form
%h %l %u %t "%r" %>s %b
in der config steht. um meine datei nun anzupassen, habe ich einfach das %t nach vorn gezogenund meine zeile in der config sieht nun so aus:
LogFormat "%t %l %u %h \"%r\" %>s %b" common
mehr nicht!die von euch vorgeschlagene formatierung :
Logformat "%{%Y%m%d %H:%M %S}t [...weitere definierte %-Vars..] " NameDesLogformats
habe ich nicht benutzt.der grund warum sich die formatierung zu der config von franzmann unterscheidet, kann ich nur damit erklären, dass sich evtl. die version von apache unterscheidet.
ich benutze den apachen 2.2.4 .
da ich windows nur für CAD und Flash benutze, und zufällig gerade einen webserver auf windows aufgesetzt hatte, war ich schon interessiert, wie sich das thema mit dem logfile entwickelt.
aber es macht spass mit leuten wie euch "erfahrungen" auszutauschen.....
schade das der beitrag nun zum ende kommt....
grüße aus hannover
patric