2008-08-27 40 views
15

Tôi muốn viết một tập lệnh/đợt sẽ sắp xếp nhật ký IIS hàng ngày và nén chúng lên theo tháng.Tập lệnh tự động để nén nhật ký IIS?

ex080801.log mà là ở định dạng cũ YYMMDD .log

ex080801.log - ex080831.log được kéo khóa và các file bản ghi bị xóa.

Lý do chúng tôi làm điều này là vì trên một trang web nặng, tệp nhật ký trong một ngày có thể là 500mb đến 1gb nên chúng tôi nén chúng lên để nén chúng xuống 98% và đổ tệp nhật ký thực. Chúng tôi sử dụng webtrend để phân tích các tệp nhật ký và có khả năng đọc thành tệp zip.

Có ai có ý tưởng nào về cách viết mã này hoặc sẵn sàng chia sẻ một số mã không?

Trả lời

12

Bạn sẽ cần một công cụ dòng lệnh để nén các tệp. Tôi khuyên bạn nên sử dụng 7-Zip miễn phí và dễ sử dụng. Phiên bản dòng lệnh khép kín (7za.exe) là sự lựa chọn di động nhất.

Dưới đây là một tập tin batch hai dòng đó sẽ vụt các file log và xóa chúng sau:

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

Tham số đầu tiên là 4 chữ số năm và tháng, và tham số thứ hai là đường dẫn đến thư mục chứa nhật ký của bạn. Ví dụ: ziplogs.bat 0808 c:\logs

Có thể phức tạp hơn (ví dụ: tìm kiếm tên tệp để xác định tháng lưu trữ). Bạn có thể muốn kiểm tra lệnh Windows FINDSTR để tìm kiếm văn bản đầu vào bằng các cụm từ thông dụng.

0

Regex sẽ thực hiện thủ thuật ... tạo một tập lệnh perl/python/php để thực hiện công việc cho bạn ..
Tôi chắc chắn rằng tệp loạt cửa sổ không thể thực hiện regex.

2

Chúng tôi sử dụng tập lệnh như sau. Gzip là từ dự án Cygwin. Tôi chắc chắn bạn có thể sửa đổi cú pháp để sử dụng công cụ zip thay thế. Đối số "bỏ qua" là số lượng tệp không lưu trữ - chúng tôi giữ 11 ngày trong thư mục 'hiện tại'.

@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

Đây là kịch bản của tôi về cơ bản điều chỉnh của David và nén nhật ký của tháng trước, di chuyển chúng và xóa tệp nhật ký gốc. điều này cũng có thể được điều chỉnh cho các nhật ký Apache. Vấn đề duy nhất với điều này là bạn có thể cần phải chỉnh sửa các lệnh thay thế, nếu hàm ngày tháng DOS của bạn xuất hiện ngày trong tuần. Bạn cũng sẽ cần phải cài đặt 7-zip.

Bạn cũng có thể tải xuống IISlogslite nhưng nó nén tệp của mỗi ngày vào một tệp zip duy nhất mà tôi không thấy hữu ích. Có một vbscript nổi trên web mà làm điều tương tự.

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

Tôi đoán định dạng ngày chỉ thay đổi với các phiên bản Windows mới hơn, nhưng để có được tháng và ngày chính xác trong Windows 7, tôi phải thay đổi các dòng đó thành: set month =% DATE: ~ 4,2% set year =% DATE: ~ 12, 2% –

+1

Tôi nghĩ cài đặt ngày phụ thuộc vào máy chủ/miền địa phương, vì vậy bạn có thể cần chỉnh sửa chúng. Nếu ai có chức năng thời gian toàn cầu, tôi sẽ biết ơn! – alimack

1

Bạn có thể lấy gói tiện ích dòng lệnh từ DotNetZip để nhận các công cụ tạo khóa kéo từ tập lệnh. Có một công cụ nhỏ đẹp gọi là Zipit.exe chạy trên dòng lệnh, thêm tệp hoặc thư mục để nén tệp. Nó rất nhanh, hiệu quả.

Tùy chọn tốt hơn có thể là chỉ thực hiện thao tác nén từ trong 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

chức năng zip vay từ http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx

Dưới đây là câu trả lời PowerShell rằng công trình kỳ diệu:

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) 
} 
Các vấn đề liên quan