سؤال

أرغب في كتابة برنامج نصي/دفعة لتجميع سجلات IIS اليومية الخاصة بي وضغطها شهريًا.

ex080801.log وهو بتنسيق exyymmdd.سجل

ex080801.log - يتم ضغط ex080831.log وحذف ملفات السجل.

السبب وراء قيامنا بذلك هو أنه في المواقع الثقيلة، قد يتراوح حجم ملف السجل ليوم واحد من 500 ميجابايت إلى 1 جيجابايت، لذلك نقوم بضغطها مما يؤدي إلى ضغطها بنسبة 98% وتفريغ ملف السجل الحقيقي.نحن نستخدم webtrend لتحليل ملفات السجل وهو قادر على القراءة في ملف مضغوط.

هل لدى أي شخص أي أفكار حول كيفية كتابة هذا البرنامج النصي أو سيكون على استعداد لمشاركة بعض التعليمات البرمجية؟

هل كانت مفيدة؟

المحلول

ستحتاج إلى أداة سطر الأوامر لضغط الملفات.أوصي 7-الرمز البريدي وهو مجاني وسهل الاستخدام.يعد إصدار سطر الأوامر المستقل (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 أمر للبحث عن نص الإدخال باستخدام التعبيرات العادية.

نصائح أخرى

هذا هو البرنامج النصي الخاص بي الذي يتكيف بشكل أساسي مع برنامج David، ويقوم بضغط سجلات الشهر الماضي ونقلها وحذف ملفات السجل الأصلية.ويمكن تكييف هذا مع سجلات Apache أيضًا.المشكلة الوحيدة في ذلك هي أنك قد تحتاج إلى تحرير أوامر الاستبدال، إذا كانت وظيفة التاريخ في DOS لديك تُخرج تاريخ الأسبوع.ستحتاج أيضًا إلى تثبيت 7-zip.

يمكنك أيضًا تنزيل IISlogslite ولكنه يضغط ملف كل يوم في ملف مضغوط واحد لم أجده مفيدًا.يوجد 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

نحن نستخدم برنامج نصي مثل ما يلي.Gzip من مشروع cygwin.أنا متأكد من أنه يمكنك تعديل بناء الجملة لاستخدام أداة مضغوطة بدلاً من ذلك.الوسيطة "تخطي" هي عدد الملفات التي لا يجب أرشفتها - نحتفظ بـ 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

يمكنك الحصول على حزمة الأدوات المساعدة لسطر الأوامر من دوت نت زيب للحصول على أدوات لإنشاء ملفات مضغوطة من البرامج النصية.هناك أداة صغيرة لطيفة تسمى Zipit.exe تعمل على سطر الأوامر، وتضيف الملفات أو الدلائل إلى الملفات المضغوطة.إنه سريع وفعال.

قد يكون الخيار الأفضل هو إجراء الضغط من داخل 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()

وظيفة الرمز البريدي المقترضة من http://blogs.msdn.com/daiken/archive/2007/02/12/compress-files-with-windows-powershell-then-package-a-windows-vista-sidebar-gadget.aspx

إليك إجابة بوويرشيل التي تعمل العجائب:

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

نحن نستخدم هذا البرنامج النصي بوويرشيل: http://gallery.technet.microsoft.com/scriptcenter/31db73b4-746c-4d33-a0aa-7a79006317e6

يستخدم 7-zip ويتحقق من الملفات قبل حذفها

سوف يقوم Regex بالخدعة ...قم بإنشاء برنامج نصي Perl/python/php للقيام بهذه المهمة نيابةً عنك.
أنا متأكد تمامًا من أن ملف دفعات Windows لا يمكنه القيام بالتعبير العادي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top