Jak skonfigurować IIS do obracania dzienników?

21

Używam Apache od lat i uważam za pewnik, że obsługuje on rotację logów. Przeglądałem konfigurację usług IIS i googlowałem, ale nie mogę znaleźć opcji włączania rotacji dzienników przez usługi IIS.

Jaki jest preferowany sposób skonfigurowania IIS do usuwania dzienników przekraczających określony próg? Czy są jakieś produkty, które to dla Ciebie robią? Co robią sklepy Windows Enterprisy?

Konfiguracja: IIS 6.0 / Windows Server 2003 32-bit

Eliasz
źródło
Bardzo dobre pytanie. Usługi IIS mają rotację, ale nie obsługują czyszczenia ani archiwizacji. Nie rozumiem, dlaczego produkt tak dojrzały w innych obszarach nie miałby tak podstawowej funkcji. Przy domyślnej konfiguracji IIS popełnia samobójstwo, wypełniając dysk główny dziennikami. (Myślę, że to samo można powiedzieć o SQL i dziennikach transakcji.)
Nathan Hartley

Odpowiedzi:

11

Nie ma wbudowanego mechanizmu do obsługi rotacji lub archiwizacji logów. Mogą istnieć produkty innych firm do obsługi tego zadania lub możesz napisać skrypt i skonfigurować zaplanowane zadanie. Mam tylko kilka serwerów IIS, więc właśnie skonfigurowałem cykliczne Zadanie w Outlooku, aby co miesiąc przypominało mi o usuwaniu plików dziennika IIS starszych niż 30 dni.

joeqwerty
źródło
5
Brzmi bolesnie. Spróbuj zaplanować to ... Get-ChildItem E: \ log * -Include ex * .log -Recurse | Where-Object {$ _. LastWriteTime -lt (Get-Date) .AddDays (-30)} | Usuń przedmiot
Nathan Hartley
5

Zobacz narzędzie Dzienniki IIS ( http://www.iislogs.com/ ). Istnieje kilka różnych sposobów instalacji tego i bardzo efektywne zarządzanie IIS i innymi plikami dziennika (kompresowanie plików do formatu .zip, przenoszenie ich do różnych lokalizacji, usuwanie plików po określonej dacie itp.).

Obrabować
źródło
1

Skonfiguruj zaplanowane zadanie, aby za pomocą robocopy skopiować pliki do podkatalogu o nazwie „stary”. Ma przełącznik / minage: x, który można ustawić na 30,60 lub cokolwiek innego. Następnie usuń wszystko z tego katalogu. Robię to w ten sposób na kilkudziesięciu serwerach i wydaje się, że to załatwia sprawę.

Chris
źródło
0

Inne odpowiedzi są dobre i oferują bardziej niezawodne rozwiązanie tego problemu. Jeśli potrzebujesz tylko szybkiej poprawki, możesz ustawić CCleaner, aby automatycznie czyścił folder logów przy każdym logowaniu lub zgodnie z harmonogramem.

Pamiętaj jednak, że powoduje to usunięcie wszystkich dzienników, a nie tylko przedawnienia plików.

Postępowałem zgodnie z tymi instrukcjami, ale dodałem, że chcę, aby działał nawet po wylogowaniu użytkownika, jak ma to zwykle miejsce na serwerze.

Michael Haren
źródło
0

Niedawno zadałem to samo pytanie na forum Powershell.org . Potem skończyłem pisać hack zasobu skryptu dla żądanego stanu konfiguracji, którego będę używał, aby rozwiązać moją potrzebę procedury czyszczenia dziennika. Być może część tego kodu przyda się innym.

# Requires an E: drive.

configuration LogDirectory
{
    param (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string[]]$Node
    )
    node $Node
    {
        Script LogDirectoryScript
        {
            GetScript = {
                $result = (Test-Path 'E:\log') -and (schtasks.exe /query /TN Purge_Log_Folder | Select-String Purge_Log_Folder -Quiet)
                return @{
                    GetScript = $GetScript
                    SetScript = $SetScript
                    TestScript = $TestScript
                    Result = $result
                }
            }

            SetScript = {
                Write-Verbose 'Creating log directory.'
                if ( -not (Test-Path 'E:\log')) { 
                    New-Item -ItemType Directory -Path 'E:\log'
                }

                Write-Verbose 'Changing permissions to log directory such that any user can write, but only an administrator can read or modify.'
                $acl = (Get-Item 'E:\log').GetAccessControl('Access')
                $acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule('Users','Write', 'Allow')))
                Set-Acl -Path 'E:\log' -AclObject $acl | Out-Host

                Write-Verbose 'Scheduling purge task.'
                $script = 'Get-ChildItem E:\log\* -Include ex*.log -Recurse  | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} | Remove-Item'
                Set-Content -Path C:\Windows\Purge_Log_Folder.ps1 -Value $script
                $task = 'Powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -File C:\Windows\Purge_Log_Folder.ps1'
                SCHTASKS /CREATE /TN Purge_Log_Folder /TR $task /SC DAILY /ST 23:59 /RU SYSTEM /F | Out-Host

                Write-Verbose 'Configuring IIS'
                # Default Log File Settings for Web Sites <logFile>
                # http://www.iis.net/configreference/system.applicationhost/sites/sitedefaults/logfile
                Import-Module WebAdministration
                Set-WebConfigurationProperty '/system.applicationHost/sites/siteDefaults' -name logFile -value @{
                    directory = 'E:\log'
                    localTimeRollover ='true'
                    period = 'Hourly'
                }
            }

            TestScript = {
                (Test-Path 'E:\log') -and (schtasks.exe /query /TN Purge_Log_Folder | Select-String Purge_Log_Folder -Quiet)
            }
        }
    }
} 
LogDirectory
Nathan Hartley
źródło
0

IIS 7 wprowadza konfigurację okresowego usuwania plików dziennika. Aby uzyskać więcej informacji, zobacz periodnastępujące linki:

http://www.iis.net/configreference/system.applicationhost/log/centralbinarylogfile

http://www.iis.net/configreference/system.applicationhost/log/centralw3clogfile

fernacolo
źródło
1
Nie sądzę, że ta funkcja usuwa pliki dziennika, określa jedynie okres tworzenia nowego pliku dziennika, tj. Dzienny, godzinny itp. Dokument, który łączysz, określa okres jako „Określa, jak często bieżący plik dziennika jest zamykany i uruchamiany jest nowy plik dziennika. ” Nie ma wzmianki o usunięciu.
Somantra
0

Możesz to zrobić za pomocą zaplanowanego zadania i pliku wsadowego.

forfiles -p "C:\Path\To\Log\Files" -m *.* /D -30 /C "cmd /c del @path"
Davin Studer
źródło