none
Автоматическая очистка старых записей в лог-файле RRS feed

  • Вопрос

  • доброго времени суток!
    есть следующая ситуация. есть текстовый файл - лог.
    в нем содержаться строки следующего плана:

    14.11.2007 0:30:00 ---------------------- Запуск ------------------------------------------
    14.11.2007 0:30:00 CreateAllObjects: Запуск процедуры
    14.11.2007 0:30:00 CreateObj: Создан объект Wscript.Shell
    ........................................................................................................
    14.11.2007 0:31:39 Удален экземпляр класса V7Backup.InfBase
    14.11.2007 0:31:39 -------------------- Завершение ----------------------------------------
    15.11.2007 0:30:00 ---------------------- Запуск ------------------------------------------
    15.11.2007 0:30:00 CreateAllObjects: Запуск процедуры
    15.11.2007 0:30:00 CreateObj: Создан объект Wscript.Shell
    ........................................................................................................
    15.11.2007 0:31:49 Удален экземпляр класса V7Backup.InfBase
    15.11.2007 0:31:49 -------------------- Завершение ----------------------------------------



    так вот, не подсказал бы мне кто скриптик, который автоматически удалял бы записи которые начинаюсть с даты, к примеру, недельной давности (если сегодня 15.11.2007, то записи, которые начинаються с 8.11.2007 удалялись автоматом)
    15 ноября 2007 г. 9:45

Ответы

  • Держи. Теперь и в качестве параметра может принимать имя лога

     

     

     

    DelOldLogLines.vbs

    Const ForReading = 1, ForWriting = 2

     

    LogFileName = "MyLogFile.log"

     

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oArgs = WScript.Arguments

     

    If oArgs.Count > 0 then
       LogFileName = oArgs(0)
    end if

     

    if NOT oFSO.FileExists(LogFileName) then
       WScript.Echo "Log file " & LogFileName & " not exist"
       Wscript.Quit
    end if

     

    LogFileNameBak = LogFileName

     

    While oFSO.FileExists(LogFileNameBak)
          LogFileNameBak = LogFileNameBak & ".bak"
    Wend


    oFSO.MoveFile LogFileName , LogFileNameBak

    Set oLogFile= oFSO.OpenTextFile(LogFileNameBak, ForReading)

    Set oLogFileNew= oFSO.OpenTextFile(LogFileName, ForWriting, true)

     

    While NOT oLogFile.AtEndOfStream
        sLogLine = oLogFile.ReadLine
        LineDate = now
        if UBound(Split(sLogLine)) > 1 Then
           If IsDate(Split(sLogLine)(0)) then
              LineDate = CDate(Split(sLogLine)(0))
           end if
        end if
        if LineDate > DateAdd("d",-7,now) then
           oLogFileNew.WriteLine sLogLine
        end if
    Wend

     

    oLogFile.Close
    oLogFileNew.Close

     

    oFSO.DeleteFile  LogFileNameBak , True

     

     

    15 ноября 2007 г. 16:36

Все ответы

  • Лентяи :-) Пишется за 5 мин.

     

     

    DelOldLogLines.vbs

    Set oFSO = CreateObject("Scripting.FileSystemObject")

     

    Set oLogFile= oFSO.OpenTextFile("MyLogFile.log")

     

    While NOT oLogFile.AtEndOfStream
        sLogLine = oLogFile.ReadLine
        LineDate = now  ' для того что-бы строки с "не датой" были включены в результат
        if UBound(Split(sLogLine)) > 1 Then
           If IsDate(Split(sLogLine)(0)) then
              LineDate = CDate(Split(sLogLine)(0))
           end if
        end if
        if LineDate > DateAdd("d",-7,now) then
           WScript.Echo sLogLine   ' можно, конечно и в файл писать, но лениво :-)
        end if
    Wend

     

    oLogFile.Close

     

    ' можно, конечно понагородить "переименование лога в .bak" и удаление в случае успеха, но IMHO лучше это в коммандном файле сделать. Быстрее писАть :-)

     

    15 ноября 2007 г. 10:38
  •  КГБ написано:

    Лентяи :-) Пишется за 5 мин.

     

    спасибо конешно большое. но у меня почемуто этот скрипт кроме как вывода алертами строк лога (которые мне необходимо оставить) ничего не делат Sad

    я так понял там еще должна быть функция удаления? КГБ, если не сложно допиши плz скрипт полностью, а то я в vbs вообще не шарю :-[
    15 ноября 2007 г. 11:19
  • Вот тебе батник :

     

     

    MakeNewLog.cmd

    @echo off

    rem  Имя последнего файла должно совпадать с тем, что в VBS

    set LogFile=MyLogFile.log

    cscript //NoLogo //H:cscript DelOldLogLines.vbs >%LogFile%.new

    del %LogFile%

    ren %LogFile%.new %LogFile%

     

     

    Можно круче, но лень :-)

     

    15 ноября 2007 г. 13:51
  •  КГБ написано:

    Вот тебе батник :

     

     

    MakeNewLog.cmd

    @echo off

    rem  Имя последнего файла должно совпадать с тем, что в VBS

    set LogFile=MyLogFile.log

    cscript //NoLogo //H:cscript DelOldLogLines.vbs >%LogFile%.new

    del %LogFile%

    ren %LogFile%.new %LogFile%

     

     

    Можно круче, но лень :-)

     



    вроде как работает, но есть одна проблема: при первой прогонке лога скриптом кодировка моменялась на с ANSI на OEM, а при повторном - вообще каракули... лог стал нечитаем (цифры остались, а буквы - нет)
    15 ноября 2007 г. 14:23
  • Держи. Теперь и в качестве параметра может принимать имя лога

     

     

     

    DelOldLogLines.vbs

    Const ForReading = 1, ForWriting = 2

     

    LogFileName = "MyLogFile.log"

     

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oArgs = WScript.Arguments

     

    If oArgs.Count > 0 then
       LogFileName = oArgs(0)
    end if

     

    if NOT oFSO.FileExists(LogFileName) then
       WScript.Echo "Log file " & LogFileName & " not exist"
       Wscript.Quit
    end if

     

    LogFileNameBak = LogFileName

     

    While oFSO.FileExists(LogFileNameBak)
          LogFileNameBak = LogFileNameBak & ".bak"
    Wend


    oFSO.MoveFile LogFileName , LogFileNameBak

    Set oLogFile= oFSO.OpenTextFile(LogFileNameBak, ForReading)

    Set oLogFileNew= oFSO.OpenTextFile(LogFileName, ForWriting, true)

     

    While NOT oLogFile.AtEndOfStream
        sLogLine = oLogFile.ReadLine
        LineDate = now
        if UBound(Split(sLogLine)) > 1 Then
           If IsDate(Split(sLogLine)(0)) then
              LineDate = CDate(Split(sLogLine)(0))
           end if
        end if
        if LineDate > DateAdd("d",-7,now) then
           oLogFileNew.WriteLine sLogLine
        end if
    Wend

     

    oLogFile.Close
    oLogFileNew.Close

     

    oFSO.DeleteFile  LogFileNameBak , True

     

     

    15 ноября 2007 г. 16:36
  • во!.. премного благодарен!!! теперь вроде все работает как надо  Big Smile

    и на последок вопросик (правда немного не по теме топика):
    смотрю ты хорошо разбираешся в vbs, не посоветуеш ли где можно подискать информации по данному языку, может книжку какую посоветуешь? желательно только на рус, а то на инглыше с нуля тяжеловато будет вьезжать...

    16 ноября 2007 г. 6:23
  • VBS - уже становится неактальным :-)

    Если уж учить, то сразу .NET язык :-) Или PowerShell.

     

    Книжки? Поищи на books.ru, но искать надо не VBS, а его приложение в деле - WSH, ADSI, WMI.

    Или что-то типа "сценарии для администраторов". Сам учил по документации.

    16 ноября 2007 г. 12:47
  •  КГБ написано:

    Если уж учить, то сразу .NET язык :-) Или PowerShell.

     

    VBS не умирает. Он живет и будет жить - уж больно много в него вложено, а PowerShell пока еще младенец. Думаю, MS вынудят даже сделать раппер .Net для VBS.

    20 ноября 2007 г. 6:21
    Модератор