Textfiles automatisch kürzen?
Hallo, ich spiele ein Spiel (Everquest), das mir automatisch ein Logfile anlegt. Leider vergesse ich das Logfile immer wieder zu kürzen. Nach nem 1/2 Jahr fällt es mir dann wieder ein, und es ist mal locker 6 GB groß.
Die Logfiles an sich werden in einem Ordner Log abgelegt. Ich suche nun eine Möglichkeit, das dieser Ordner automatisch durchsucht wird, und wenn ein Log größer als 1 MB ist, es auf 500 KB zu kürzen.Dabei ist es egal, ob am anfang ein Wort abgeschnitten wird oder nicht.
Das laufende Logfile wird für eine Auswertung ( Gina) gebraucht, die in Echtzeit passiert, die Letzten 500 KB dienen nur für mich, falls ich mal was nachlesen möchte.
Es reicht mir, wenn ich ein Skript von Hand starten kann, was dann den Ordner überprüft, und die Logfiles kürzt.
2 Antworten
edit: Powershell kann normal nur mit Dateien bis 2 GB arbeiten desshalb bitte keine 6GB-Monster anbieten (evtl beim ersten lauf vorher von hand kürzen
Textdateien Lassen sich am einfachsten Zeilenweise verarbeiten. Ich mache mir deshalb nicht die Mühe irgendwie mit einer festen Anzahl von Restzeichen zu arbeiten. Soundsoviele Zeilen der Logs werden behalten und gut is.
Wie ich annehme sollen lediglich die letzten X Zeilen behalten werden.
Im folgenden Powershell-Script werden die im Angegebenen Ordner befindlichen Dateien mit der Extension .log ermittelt. Wenn Dateien größer als 1MB sind, wird werden diese Eingelesen und nur die letzten $NewSize_Lines Zeilen wieder zurückgeschrieben. Wieviel Zeilen Du behalten möchtest kannst Du in der 3 Zeile festlegen.
demo.ps1
$WorkPath='C:\Users\bubb\woauchimmer\Log'
$MaxSize = 1MB
$NewSize_Lines = 1000 #die neue Zielgröße in Zeilen angeben, Logs sind Zeilenorientiert!
Get-ChildItem -Path $WorkPath -Filter '*.log'|
Where-Object {$_.Length -gt $MaxSize} |
Foreach-Object{
Write-Host $( 'Found File: {0} Size: {1:F2} MB'-f $_.Name,($_.Length / 1MB)) -ForeGround red
$LogText = Get-Content $_ |
Select-Object -Last $NewSize_Lines #nur die letzten x Zeilen behalten
$LogText >$_ #in Datei zurück schreiben
Write-Host $( 'New Size: {0:F2} MB'-f ((Get-Item $_).Length / 1MB)) -ForeGround green
}
pause
wenn Du die ersten x Zeilen behalten möchtest, ändere Zeile 10 zu:
Select-Object -First $NewSize_Lines
Bevor Du das Script testest, lege bitte ein Backup (Kopie) deines Logordeners an. Ich habe leider keine Möglichkeit das Script unter den Bedingungen Deines Rechners zu testen.
wenn alles bei manuellem Start funktioniert kannst Du obiges Script auch als HybridBatch im Autostartordner ausführen.
demo.cmd ( Powershellteil gekürzt)
<# : Batch Abschnitt Zeile nicht ändern
start "" /min powershell "iex (gc '%~f0' -Encoding UTF8 -Raw | out-string)"
exit /b
: #>
$WorkPath='C:\hier dein ordnerPfad'
dir -Path $WorkPath -Filter '*.log'|
?{$_.Length -gt 1MB} |
%{
$LogText = gc $_ | select -Last 1000
$LogText >$_
}
Ahhh, sorry mein Fehler hatte nur im scriptordner probiert.
und S_ gibt nint den Vollen Pfad des Objekts wieder.
Der volle Dateipfad wird mit .FullName spezifiziert. (mein Fehler)
die scripts lauten entsprechend:
$WorkPath='D:\Everquest\Logs'
$MaxSize = 1MB
$NewSize_Lines = 1000 #die neue Zielgröße in Zeilen angeben, Logs sind Zeilenorientiert!
Get-ChildItem -Path $WorkPath -Filter '*.log'|
Where-Object {$_.Length -gt $MaxSize} |
Foreach-Object{
Write-Host $( 'Found File: {0} Size: {1:F2} MB'-f $_.Name,($_.Length / 1MB)) -ForeGround red
$LogText = Get-Content $_.FullName|
Select-Object -Last $NewSize_Lines #nur die letzten x Zeilen behalten
$LogText >$_.FullName #in Datei zurück schreiben
Write-Host $( 'New Size: {0:F2} MB'-f ((Get-Item $_).Length / 1MB)) -ForeGround green
}
pause
bzw als hybridbatch:
<# : Batch Abschnitt Zeile nicht ändern
start "" powershell "iex (gc '%~f0' -Encoding UTF8 -Raw | out-string)"
exit /b
: #>
$WorkPath='D:\Everquest\Logs'
dir -Path $WorkPath -Filter '*.log'|
?{$_.Length -gt 1MB} |
%{
$LogText = gc $_.FullName | select -L 1000
$LogText >$_.FullName
}
pause
Das addon Finalscript sollte Abhilfe leisten. Im ligfile Gibt es verschiedene Daten die Anhand der zu beziffernden Menge evaluiert werden müssen. Die Installation erfordert ein komplettes vorheriges Backup und der cmd master muss in tcpip eingeführt werden. Dazu die logfiles via cmd per enter taste einführen. Ein Fenster öffnet sich in dem eingeben werden muss: cmd/Script/1/Finalscript/Backup
Der Vorschlag hört sich gut an, jedoch habe ich da 2 Probleme bei...
- Kann ich kaum mehr Englisch
- Mit Programmieren stehe ich mittlerweile auch auf Kriegsfuß ^^
Ich habe dazu leider nur was in Englischen Foren gefunden, oder auf Github.
Da bin ich dann leider völlig aufgeschmissen, da ich durch meine Multiple Sklerose sehr viel an Englisch vergessen habe.
Wow, erstmal ein Dankeschön für die Mühe :)
Ein kleiner Fehler scheint wohl noch im Script enthalten zu sein. Das Log wird gefunden, aber Get-Content wird im C:\WINDOWS\system32\eqlog_Username_Server.txt nicht gefunden.Nicht wundern, de Logfiles haben die Endung .txt.
Die Dateien liegen in D:\Everquest\Logs
Vielleicht hilft das ja.