Scripts de compression et suppression des logs IIS avec des outils natifs / Compression and removal scripts for IIS logs with built-in tools
[MAJ 23/06/2016] IIS n'inclut pas de script ou de mécanisme de rotation de ses logs et par expérience je sais que peu de clients implémentent un tel mécanisme. Je vais vous montrer au travers de cet article qu'il est très facile et en peu de lignes de mettre en place un tel mécanisme. Pour cela je m'appuierai sur deux scripts n'utilisant que des ressources présentes nativement sous Windows:
- CompressIISLogFilesOlderThan10Days.cmd : Comme son nom l'indique ce script compressera tous les fichiers *.log dont la date de modification est supérieure à 10 jours.
- RemoveIISLogFilesOlderThan30Days.cmd : Comme son nom l'indique ce script supprimera tous les fichiers dont la date de modification est supérieure à 30 jours.
Et vous vous dites en PowerShell ça doit pouvoir se faire ... la réponse est là
[Updated 06/23/2016] IIS doesn't include scripts or mechanism for the IIS logs rotation and I know by par experience that only few customer implement a such mechanism. I'll show you through this article that it is very easy and in few lines to set up such a mechanism. For this I will build on two scripts using only these Windows built-in resources:
- CompressIISLogFilesOlderThan10Days.cmd : As its name suggests this script will compress all *.log files whose modification time is greater than 10 days.
- RemoveIISLogFilesOlderThan30Days.cmd : As its name suggests this script will remove all files whose modification time is greater than 30 days.
And you say to yourself in PowerShell it should be easy ... the answer is here.
@ECHO OFF
CLS
SETLOCAL
SET COMPRESSION_TOOL=makecab
SET CURRENT_DIR=%~dp0
SET CURRENT_DIR=%CURRENT_DIR:~0,-1%
SET LOG_FILE=%~dpn0.log
SET ERROR_FILE=%~dpn0.err
SET TIMESTAMP=%DATE:~-10%_%TIME%
SET TIMESTAMP=%TIMESTAMP:/=_%
SET TIMESTAMP=%TIMESTAMP::=_%
SET TIMESTAMP=%TIMESTAMP:.=_%
SET TIMESTAMP=%TIMESTAMP: =_%
SET TIMESTAMP=%TIMESTAMP:,=_%
REM Getting the site id for every website
FOR /F "delims=" %%i IN ('%WINDIR%\system32\inetsrv\appcmd list site /text:id') DO (
REM Getting the log folder for every website got by the id
FOR /F "delims=" %%j IN ('%WINDIR%\system32\inetsrv\appcmd.exe list site /id:%%i /text:logfile.directory') DO (
ECHO [%TIMESTAMP%] Processing %%j\W3SVC%%i ... >> %LOG_FILE% 2>>%ERROR_FILE%
REM Compressing the UTF-8 log files older than 10 days by using makecab
FORFILES /p %%j\W3SVC%%i /s /m u_ex*.log /d -10 /c "cmd /c %COMPRESSION_TOOL% @path @fname.cab && echo Compressing @path ... && del @path" >> %LOG_FILE% 2>>%ERROR_FILE%
REM Compressing the ANSI log files older than 10 days by using makecab
FORFILES /p %%j\W3SVC%%i /s /m ex*.log /d -10 /c "cmd /c %COMPRESSION_TOOL% @path @fname.cab && echo Compressing @path ... && del @path" >> %LOG_FILE% 2>>%ERROR_FILE%
)
)
SET COMPRESSION_TOOL=
SET CURRENT_DIR=
SET LOG_FILE=
SET ERROR_FILE=
SET TIMESTAMP=
@ECHO OFF
CLS
SETLOCAL
SET CURRENT_DIR=%~dp0
SET CURRENT_DIR=%CURRENT_DIR:~0,-1%
SET LOG_FILE=%~dpn0.log
SET ERROR_FILE=%~dpn0.err
SET TIMESTAMP=%DATE:~-10%_%TIME%
SET TIMESTAMP=%TIMESTAMP:/=_%
SET TIMESTAMP=%TIMESTAMP::=_%
SET TIMESTAMP=%TIMESTAMP:.=_%
SET TIMESTAMP=%TIMESTAMP: =_%
SET TIMESTAMP=%TIMESTAMP:,=_%
REM Getting the site id for every website
FOR /F "delims=" %%i IN ('%WINDIR%\system32\inetsrv\appcmd list site /text:id') DO (
REM Getting the log folder for every website got by the id
FOR /F "delims=" %%j IN ('%WINDIR%\system32\inetsrv\appcmd.exe list site /id:%%i /text:logfile.directory') DO (
ECHO [%TIMESTAMP%] Processing %%j\W3SVC%%i ... >> %LOG_FILE% 2>>%ERROR_FILE%
REM Removing the UTF-8 log files older than 30 days
FORFILES /p %%j\W3SVC%%i /s /m u_ex*.* /d -30 /c "cmd /c echo Erasing @path ... && del @path /s" >> %LOG_FILE% 2>>%ERROR_FILE%
REM Removing the UTF-8 log files older than 30 days
FORFILES /p %%j\W3SVC%%i /s /m ex*.* /d -30 /c "cmd /c echo Erasing @path ... && del @path /s" >> %LOG_FILE% 2>>%ERROR_FILE%
)
)
SET CURRENT_DIR=
SET LOG_FILE=
SET ERROR_FILE=
SET TIMESTAMP=
Laurent.