2008-08-27 8 views
15

Я хотел бы написать сценарий/пакет, который свяжет мои ежедневные журналы IIS и застегивает их по месяцам.Автоматический скрипт для почтовых журналов IIS?

ex080801.log, который находится в формате экс ггммдд .log

ex080801.log - ex080831.log получает застежку и файлы журнала удаляются.

Причина, по которой мы это делаем, заключается в том, что на тяжелом сайте файл журнала за один день может быть от 500 до 1 гб, поэтому мы их застегиваем, что сжимает их на 98% и выгружает реальный файл журнала. Мы используем webtrend для анализа файлов журнала и возможность чтения в zip-файл.

Есть ли у кого-нибудь идеи о том, как это сделать, или хотели бы поделиться каким-то кодом?

ответ

12

Вам понадобится инструмент командной строки для архивирования файлов. Я рекомендую 7-Zip, который является бесплатным и простым в использовании. Самостоятельная версия командной строки (7za.exe) - самый портативный вариант.

Вот две строки пакетный файл, который будет заархивировать файлы журналов и удалить их впоследствии:

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

Первый параметр является 4 цифры года и месяца, а второй параметр это путь к каталог, содержащий ваши журналы. Например: ziplogs.bat 0808 c:\logs

Возможно получить более подробную информацию (например, поиск имен файлов, чтобы определить, какие месяцы нужно архивировать). Возможно, вы захотите проверить команду Windows FINDSTR для поиска текста ввода с регулярными выражениями.

0

Regex сделает трюк ... создайте скрипт perl/python/php, чтобы выполнить эту работу для вас.
Я уверен, что пакетный файл windows не может выполнять регулярное выражение.

2

Мы используем скрипт следующим образом. Gzip - это проект cygwin. Я уверен, что вы можете изменить синтаксис, чтобы вместо этого использовать zip-инструмент. Аргумент «пропустить» - это количество файлов, которые не архивируются - мы сохраняем 11 дней в «текущем» каталоге.

@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

Вот мой сценарий, который в основном приспосабливается Дэвида и застегивает журналы в прошлом месяце, перемещает их и удаляет исходные файлы журналов. это также можно адаптировать для журналов Apache. Единственная проблема с этим - вам может потребоваться отредактировать команды замены, если ваша функция даты DOS выводит дату недели. Вам также понадобится установить 7-zip.

Вы также можете скачать IISlogslite, но он сжимает каждый день файл в один ZIP-файл, который я не нашел полезным. В Интернете есть vbscript, который делает то же самое.

 
------------------------------------------------------------------------------------- 
@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

Я предполагаю формат даты просто изменился с более новыми версиями Windows, но чтобы корректно получить месяц и день в Windows 7, мне пришлось изменить эти строки на: set month =% DATE: ~ 4,2% set year =% DATE: ~ 12, 2% – 2010-05-01 21:44:43

1

Вы можете получить пакет утилит командной строки из DotNetZip, чтобы получить средства для создания молнии из сценариев. Там есть небольшой инструмент Zipit.exe, который запускается в командной строке, добавляет файлы или каталоги в zip-файлы. Это быстро, эффективно.

Лучшим вариантом может быть просто сделать zipping из 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

Заимствованные зип функция от http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx

Вот PowerShell ответ, который творит чудеса:

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) 
}