Como configuro o IIS para girar logs?

21

Eu uso o Apache há anos e tenho como certo que ele lida com a rotação de logs para mim. Venho pesquisando a configuração do IIS e pesquisando no Google, mas não consigo encontrar uma opção para o IIS ativar a rotação de logs.

Qual é a maneira preferida de configurar o IIS para excluir logs além de um determinado limite? Existem produtos por aí que fazem isso por você? O que as lojas Windows empreendedoras fazem?

Configuração: IIS 6.0 / Windows Server 2003 de 32 bits

Elijah
fonte
Uma pergunta muito boa. O IIS tem rotação, mas não lida com a remoção nem o arquivamento. Não entendo por que um produto, tão maduro em outras áreas, estaria carecendo de um recurso tão básico. Com a configuração padrão, o IIS comete suicídio preenchendo a unidade raiz com logs. (Eu acho que o mesmo pode ser dito para SQL e seus logs de transação.)
Nathan Hartley

Respostas:

11

Não há mecanismo incorporado para lidar com a rotação ou arquivamento de logs. Pode haver produtos de terceiros para lidar com essa tarefa ou você pode criar um script e configurar uma tarefa agendada. Eu tenho apenas um punhado de servidores IIS, então acabei de configurar uma Tarefa recorrente no Outlook para me lembrar mensalmente de excluir arquivos de log do IIS com mais de 30 dias.

joeqwerty
fonte
5
Isso parece doloroso. Tente agendar isso ... Get-ChildItem E: \ log * -Include ex * .log -Recurse | Onde-objeto {$ _. LastWriteTime -lt (Get-Date) .AddDays (-30)} | Remove-Item
Nathan Hartley
5

Dê uma olhada na ferramenta IIS Logs ( http://www.iislogs.com/ ). Existem algumas maneiras diferentes de instalar isso e executa um trabalho muito eficaz no gerenciamento do IIS e de outros arquivos de log (comprima arquivos no formato .zip, mova-os para diferentes locais, exclua arquivos após uma determinada data etc.).

Roubar
fonte
1

Configure uma tarefa agendada para usar robocopy para copiar os arquivos em um subdiretório chamado "antigo". Possui uma opção / minage: x que você pode definir para 30,60 ou o que você sentir. Em seguida, exclua tudo nesse diretório. Estou fazendo isso dessa maneira em algumas dezenas de servidores, e parece funcionar.

Chris
fonte
0

As outras respostas são boas e oferecem uma solução mais robusta para esse problema. Se você precisar apenas de uma solução rápida, pode configurar o CCleaner para limpar automaticamente sua pasta de logs sempre que fizer login ou em uma programação.

Porém, lembre-se de que isso exclui todos os logs, não apenas os arquivos antigos.

Segui estas instruções, mas acrescentei que queria que ele fosse executado mesmo quando o usuário estava desconectado, como é o caso normal de um servidor.

Michael Haren
fonte
0

Recentemente, fiz essa mesma pergunta no fórum do Powershell.org . Em seguida, acabei postando um hack de um recurso de script para a configuração de estado desejado, que usarei para resolver minha necessidade de uma rotina de limpeza de log. Talvez parte desse código seja útil para outras pessoas.

# 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
fonte
0

O IIS 7 apresenta uma configuração para excluir periodicamente os arquivos de log. Para mais informações, consulte periodos seguintes links:

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

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

fernacolo
fonte
1
Acho que esse recurso não exclui arquivos de log, mas especifica apenas o período para a criação de um novo arquivo de log, como diariamente, por hora, etc. O documento vinculado define período como "Especifica com que frequência o arquivo de log atual é fechado e um novo arquivo de log é iniciado. " Não há menção de exclusão.
Somantra 10/04
0

Você pode fazer isso com uma tarefa agendada e um arquivo em lotes.

forfiles -p "C:\Path\To\Log\Files" -m *.* /D -30 /C "cmd /c del @path"
Davin Studer
fonte