Jump to content

Boolschen Parameter einem Logrotationsskript hinzufügen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Moin,

 
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 !
 
 
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.
 
Call.ps1 - Ruft die Powershell.ps1


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 ############################
bearbeitet von RedSmookey
Link zu diesem Kommentar


    [Parameter(Mandatory=$true,Position=5)]
    [bool]$split=$False #oder was Du gerne als Standard hättest.

            $linecount = 0 #immer auf Null setzen - wir wollen ja in der oberen Schleife weiter schreiben...
            if($reader.EndOfStream -ne $true -and $Split ) { #Also nur wenn $Split=$True das aktuelle File schließen und ein neues aufmachen
                "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++
            }

 

Link zu diesem Kommentar

Moin,

 

erstmal Danke für die schnellen Antworten. Die Änderungen habe ich soweit in das Skript eingepflegt, jedoch hat sich ein Fehler eingeschlichen. Vielleicht möchtet ihr nochmal rüberschauen. Ich denke mal das ich das $linecount falsch gesetzt habe.

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)]
    [switch]$split=$false
)

############################## 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 -and $split) {
                "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++
            
            }
        }
    } 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


####################### 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 ############################
bearbeitet von RedSmookey
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...