none
Boolschen Parameter einem Logrotationsskript hinzufügen RRS feed

  • Frage

  • Guten Tag,

    bin gerade dabei aus ein Logrotationsskript zu basteln. Es erfüllt bereits seinen Zweck, jedoch möchte ich noch eine weitere Funktion hinzufügen.

    Bereits vorhanden :

    -Splittung bei Übergröße in mehrere .log-Files
    -Timestamp im Filename 
    -Archivierung der Logs in Timestampfolder 
    -Löschung veralteter Logfiles 
    -Leerung der Quelllog nach backup

    Fehlend :

    - Die Möglichkeit über einen Boolean die Splittung ( $split) zu aktivieren bzw. zu deaktivieren.

    Mein Problem :

    - Dadurch das ich mich mit PS noch nicht allzu lange befasse fällt es mir relativ schwer in der Schleife zu verstehen wo ich für die Prüfung ansetzen muss wo die Splittung erfolgen soll.

    Im Grunde splittet er alle $linesperfile. Das soll er auch weiter beibehalten, solange $split="true". Sollte dieser wert "false" sein, dumpt er das Logfile in einer Logdatei ohne alle $linesperfile zu splitten.  

    Danke im Voraus !

    Call.ps1 - Ruft die Powershell.ps1

    Die Parameter werden durch die Call.ps1 an das Logrotationsskript übergeben.

    filename : Pfad zum Logfile

    rootname : Pfad + Name der Logfile nach Splittung

    ext : Dateiendung

    linesperfile : Anzahl Zeilen die er schreiben soll bevor er die Splittung durchführt.

    path : Verzeichnis wohin er die gesplitteten Logs hinschreibt

    split : Boolscher Parameter der zukünftig dafür sorgen soll diese Split funktion an bzw. ausschalten zu können.

    D:\powershell.ps1 -filename "D:\Test\WindowsUpdate.log" -rootName "D:\backup-logs\Apache2_Lognummer_" -ext ".log" -linesperFile 1000 -path "D:\backup-logs" -split $True
    powershell.ps1
    param(
        [Parameter(Mandatory=$true,Position=0)]
        [string]$filename,
     
        [Parameter(Mandatory=$true,Position=1)]
        [string]$rootName,
     
        [Parameter(Mandatory=$true,Position=2)]
        [string]$ext,
     
        [Parameter(Mandatory=$true,Position=3)]
        [int]$linesperFile,
     
        [Parameter(Mandatory=$true,Position=4)]
        [string]$path,
     
        [Parameter(Mandatory=$true,Position=5)]
        [bool]$split
    )
     
    ############################## Parameter ##############################
     
    $sw = new-object System.Diagnostics.Stopwatch
    $sw.Start() # Timer startet
     
     
    $DateNow = ((Get-date).Day).ToString()+"-"+`
               ((Get-date).Month).ToString()+"-"+`
               ((Get-date).Year).ToString()+"-"+`
               ((Get-date).Hour).ToString()+"-"+`
               ((Get-date).Minute).ToString()+"-"+`
               ((Get-date).Second).ToString()+".log" # Ermittelt das aktuelle Datum (Deutscher Timestamp Tag-Monat-Jahr-Stunde-Minute-Sekunde !)
    $filecount = 1 # Namenszähler
    $reader = $null
     
     
    ############################ Skript Start #############################
     
    try{
        $reader = [io.file]::OpenText($filename)
        try{
            "Creating file number $filecount"
            $writer= [system.io.directory]::CreateDirectory("$path\$DateNow")
            $writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
            $linecount = 0
            $filecount++
     
            while($reader.EndOfStream -ne $true) {
                "Reading $linesperFile"
                while( ($linecount -lt $linesperFile) -and ($reader.EndOfStream -ne $true)){
                    $writer.WriteLine($reader.ReadLine());
                    $linecount++
                }
     
                if($reader.EndOfStream -ne $true) {
                    "Closing file"
                    $writer.Dispose();
     
                    "Creating file number $filecount"
                    $writer= [system.io.directory]::CreateDirectory("$path\$DateNow") 
                    $writer = [io.file]::CreateText("{0}{1}_{2}" -f ($rootName,$filecount.ToString("0000"),$DateNow,$ext))
                    $filecount++
                    $linecount = 0
                }
            }
        } finally {
            $writer.Dispose();
        }
    } finally {
        $reader.Dispose();
    }
     
    ############################ Logfile verschieben ############################
     
    $mostRecentSubDir = Get-ChildItem $path\ | Where-Object { $_.psiscontainer } | Sort-Object CreationTime -Descending | Select-Object -first 1
    Robocopy $path $path\$mostRecentSubDir *.log /move
     
    #Remove-Item $path | Where-Object name -like "*.log"
     
    ####################### Veraltete Verzeichnisse und Logdateien löschen/leeren #######################
     
    $limit = (Get-Date).AddDays(60) # Anzahl Tage bis Löschung
     
    # Lösche Dateien älter als $limit.
    Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
     
    # Löscht leere Verzeichnisse -- > Uncomment 
    Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
     
    Clear-Content $filename # Löscht alten Inhalt der .Logfile ($filename siehe oben) nachdem diese gebackupt wurde.
     
    #####################################################################
     
    $sw.Stop() # Timer stoppt
     
    Write-Host "Backup complete in " $sw.Elapsed.TotalSeconds "seconds" # Ausgabe des Timers über die Kommandozeile
     
     
    ############################ Skript Ende ############################
    

    Donnerstag, 12. Mai 2016 20:50

Antworten

  • Ja, da habe ich etwas verdreht. Aber das hättest du auch selber korrigieren können:

    if(-not $split){$linesperfile = [int32]::MaxValue}

    Freitag, 13. Mai 2016 11:38

Alle Antworten

  • Hallo,

    mein Vorschlag wäre, einfach bei $split=$true die $linesperfile auf einen unerreichbar hohen Wert zu setzen. Also

    if($split){$linesperfile = [int32]::MaxValue}

    Das käme z.B. unter deinen Parameterbereich. Dadurch würde der Split nur stattfinden, wenn eine Datei unerreichbar groß ist, also nie.

    Übrigens kannst du deinen TimeStamp viel einfacher generieren:

    (Get-Date).ToString("dd-MM-yyyy-HH-mm-ss")

    • Bearbeitet hpotsirhc Freitag, 13. Mai 2016 06:13
    Freitag, 13. Mai 2016 06:13
  • > bin gerade dabei aus ein Logrotationsskript zu basteln.
     
    Das hab ich doch heut schon woanders gesehen.
     
    • Als Antwort markiert Yannick Kohls Freitag, 13. Mai 2016 10:59
    • Tag als Antwort aufgehoben Yannick Kohls Freitag, 13. Mai 2016 10:59
    Freitag, 13. Mai 2016 10:01
  • Hallo,

    danke für die schnelle Antwort. Ich habe mit dem eingepflegten Parameter

    if($split){$linesperfile = [int32]::MaxValue}

    das Problem das er nun Splittet sobald in der call.ps1 -split = false  ist und da soll er ja tun wenn -split=$true übergeben wird. Also ist quasi ein "Dreher" enthalten.

    Freitag, 13. Mai 2016 10:37
  • Zufällig hier im MCSE-Board ? Wenn ja, dann ist dieser Post ebenfalls meiner ;)
    Freitag, 13. Mai 2016 10:58
  • Ja, da habe ich etwas verdreht. Aber das hättest du auch selber korrigieren können:

    if(-not $split){$linesperfile = [int32]::MaxValue}

    Freitag, 13. Mai 2016 11:38