2008-08-27 23 views
15

me gustaría escribir un script/lotes que se amontonen mis registros de IIS diarias y les zip por mes.Secuencia de comandos automatizada para comprimir los registros de IIS?

ex080801.log que está en el formato del ex aammdd .log

ex080801.log - ex080831.log se subió la cremallera y los archivos de registro eliminado.

La razón por la que hacemos esto es porque en un sitio pesado un archivo de registro por un día podría ser de 500 MB hasta 1 GB, así que les cerrar la cremallera de los que los comprime en un 98% y volcar el archivo de registro real. Utilizamos webtrend para analizar los archivos de registro y es capaz de leer en un archivo zip.

¿Alguien tiene alguna idea de cómo la escritura tal o estarían dispuestos a compartir algo de código?

Respuesta

12

que necesitará una herramienta de línea de comandos para cerrar la cremallera de los archivos. Recomiendo 7-Zip, que es gratis y fácil de usar. La versión de línea de comando autónoma (7za.exe) es la opción más portátil.

Aquí hay un archivo por lotes de dos líneas que comprimir los archivos de registro y eliminarlos después:

7za.exe a -tzip ex%1-logs.zip %2\ex%1*.log 
del %2\ex%1*.log 

El primer parámetro es el 4 dígitos año y mes, y el segundo parámetro es el camino a el directorio que contiene tus registros. Por ejemplo: ziplogs.bat 0808 c:\logs

Es posible obtener más detalles (es decir, buscar en los nombres de los archivos para determinar qué meses se deben archivar). Es posible que desee comprobar el comando de Windows FINDSTR para buscar texto de entrada con expresiones regulares.

0

Regex hará el truco ... crear un script perl/python/php para hacer el trabajo por usted ..
Estoy bastante seguro de que el archivo de proceso por lotes de windows no puede hacer expresiones regulares.

2

se utiliza un script como el siguiente. Gzip es del proyecto cygwin. Estoy seguro de que podría modificar la sintaxis para usar una herramienta zip en su lugar. El argumento "omitir" es la cantidad de archivos que no se archivan: mantenemos 11 días en el directorio "actual".

@echo off 
setlocal 
For /f "skip=11 delims=/" %%a in ('Dir D:\logs\W3SVC1\*.log /B /O:-N /T:C')do move "D:\logs\W3SVC1\%%a" "D:\logs\W3SVC1\old\%%a" 
d: 
cd "\logs\W3SVC1\old" 
gzip -n *.log 
Endlocal 
exit 
6

Aquí está mi script que básicamente se adapta David, y las cremalleras de seguridad de registros del mes pasado, los mueve y elimina los archivos de registro originales. esto se puede adaptar para los registros de Apache también. El único problema con esto es que puede necesitar editar los comandos de reemplazo, si su función de fecha de DOS muestra la fecha de la semana. También necesitarás instalar 7-zip.

También puede descargar IISlogslite pero comprime el archivo de cada día en un único archivo zip, que no me parece útil. Hay un vbscript flotando sobre la web que hace lo mismo.

 
------------------------------------------------------------------------------------- 
@echo on 

:: Name - iislogzip.bat 
:: Description - Server Log File Manager 
:: 
:: History 
:: Date   Authory  Change 
:: 27-Aug-2008 David Crow Original (found on stack overflow) 
:: 15-Oct-2008 AIMackenzie Slimmed down commands 


:: ======================================================== 
:: setup variables and parameters 
:: ======================================================== 
:: generate date and time variables 

set month=%DATE:~3,2% 
set year=%DATE:~8,2% 

::Get last month and check edge conditions 

set /a lastmonth=%month%-1 
if %lastmonth% equ 0 set /a year=%year%-1 
if %lastmonth% equ 0 set lastmonth=12 
if %lastmonth% lss 10 set lastmonth=0%lastmonth% 

set yymm=%year%%lastmonth% 

set logpath="C:\WINDOWS\system32\LogFiles" 
set zippath="C:\Program Files\7-Zip\7z.exe" 
set arcpath="C:\WINDOWS\system32\LogFiles\WUDF" 


:: ======================================================== 
:: Change to log file path 
:: ======================================================== 
cd /D %logpath% 

:: ======================================================== 
:: zip last months IIS log files, move zipped file to archive 
:: then delete old logs 
:: ======================================================== 
%zippath% a -tzip ex%yymm%-logs.zip %logpath%\ex%yymm%*.log 
move "%logpath%\*.zip" "%arcpath%" 
del %logpath%\ex%yymm%*.log 
+2

Supongo que el formato de fecha acabo de cambiar con las versiones más nuevas de Windows, pero para obtener el mes y día correctamente en Windows 7 tuve que cambiar esas líneas a: establecer mes =% FECHA: ~ 4,2% establecer año =% FECHA: ~ 12, 2% –

+1

Creo que las configuraciones de fecha dependen del servidor/localidad, por lo que puede necesitar editarlas. Si alguien tiene una función de tiempo universal, ¡le estaría agradecido! – alimack

1

Usted puede agarrar el paquete de utilidades de línea de comandos de DotNetZip para obtener herramientas para crear secuencias de comandos de cremalleras. Hay una pequeña herramienta llamada Zipit.exe que se ejecuta en la línea de comandos, agrega archivos o directorios para comprimir archivos. Es rápido, eficiente.

Una mejor opción podría ser la de simplemente hacer lo comprimir desde dentro PowerShell.

function ZipUp-Files ($directory) 
{ 

    $children = get-childitem -path $directory 
    foreach ($o in $children) 
    { 
    if ($o.Name -ne "TestResults" -and 
     $o.Name -ne "obj" -and 
     $o.Name -ne "bin" -and 
     $o.Name -ne "tfs" -and 
     $o.Name -ne "notused" -and 
     $o.Name -ne "Release") 
    { 
     if ($o.PSIsContainer) 
     { 
     ZipUp-Files ($o.FullName) 
     } 
     else 
     { 
     if ($o.Name -ne ".tfs-ignore" -and 
      !$o.Name.EndsWith(".cache") -and 
      !$o.Name.EndsWith(".zip")) 
     { 
      Write-output $o.FullName 
      $e= $zipfile.AddFile($o.FullName) 
     } 
     } 
    } 
    } 
} 


[System.Reflection.Assembly]::LoadFrom("c:\\\bin\\Ionic.Zip.dll"); 

$zipfile = new-object Ionic.Zip.ZipFile("zipsrc.zip"); 

ZipUp-Files "DotNetZip" 

$zipfile.Save() 
1

función postal Tomado de http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx

Aquí está la respuesta PowerShell que funciona de maravilla:

param([string]$Path = $(read-host "Enter the path")) 
function New-Zip 
{ 
    param([string]$zipfilename) 
    set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    (dir $zipfilename).IsReadOnly = $false 
} 
function Add-Zip 
{ 
    param([string]$zipfilename) 

    if(-not (test-path($zipfilename))) 
    { 
     set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
     (dir $zipfilename).IsReadOnly = $false 
    } 

    $shellApplication = new-object -com shell.application 
    $zipPackage = $shellApplication.NameSpace($zipfilename) 

    foreach($file in $input) 
    { 
      $zipPackage.CopyHere($file.FullName) 
      Start-sleep -milliseconds 500 
    } 
} 
$FilesToZip = dir $Path -recurse -include *.log 
foreach ($file in $FilesToZip) { 
New-Zip $file.BaseName 
dir $($file.directoryname+"\"+$file.name) | Add-zip $($file.directoryname+"\$($file.basename).zip") 
del $($file.directoryname+"\"+$file.name) 
} 
Cuestiones relacionadas