2016-08-17 6 views
0

Я запланировал пакетное задание каждые 4 часа для получения последних записей из базы данных.Как удалить файл журнала через неделю?

Также я поддерживаю файл журнала, который будет обновляться при каждом запуске пакетного задания. Чтобы компенсировать память памяти, мне нужно каждую неделю удалять файл журнала.

Я пытался решить задачу с помощью Batch file to delete files older than N days.

В моем случае файлы журнала файлов будут обновляться каждые 4 часа.

+0

Итак, вы хотите удалить записи в журнале filw, которые старше 7 дней? – aschipfl

+0

Мне нужно удалить файл журнала. Или очистить данные журнала –

+0

Для удаления файлов журнала * в зависимости от даты их изменения используйте 'forfiles'; для удаления их в зависимости от даты создания, 'forfiles' не может быть использован, и поскольку пакетный скриптинг не способен выполнять правильные математические данные даты и времени, я рекомендую использовать другой язык (например, PowerShell). Удаление * содержимого * из файлов журналов является чем-то совершенно другим, и вам нужно было определить возраст записи с помощью какой-либо отметки времени; и вам нужно показать нам несколько образцов. В любом случае, возможно, вам может быть интересно: [Эквивалент LogRotate для Windows?] (Http://serverfault.com/q/358172) – aschipfl

ответ

1

Не рекомендуется удалять весь файл журнала, на котором строки добавляются регулярно, так как это приводит к потере всей информации за последние N дней в определенное время. Например, каждый раз, удаляя лог-файл, и обнаружив в понедельник утром, что что-то плохое произошло в последней резервной копии, и вы хотите узнать, что произошло, у вас действительно есть проблема, поскольку информация больше не доступна.

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

Итак, с моей точки зрения, гораздо лучше сосредоточиться на использовании размера хранилища журналом и резервными файлами, а затем на определенный период времени. Могут быть чаще всего резервные файлы с сохранением только некоторого MiB, чем большие резервные копии с несколькими GiB. Поэтому для небольших резервных копий количество резервных копий (= период резервного копирования) может быть больше, чем для небольших резервных копий. И для файлов журналов важно, сколько данных прилагается к каждому исполнению до того, как размер файла журнала станет критическим, чем количество резервных копий в течение периода времени, добавляя данные в файл журнала.

Так с фокусом на размер файла журнала, а не период времени я предлагаю следующее:

@echo off 
setlocal EnableExtensions 

rem Define file size limit for the log file with 4 MiB. 
set "SizeLimit=4194304" 
set "LogFile=C:\BackupFolder\Backup.log" 

for %%I in ("%LogFile%") do (
    if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI" 
) 

endlocal 

На каждом выполнении этого небольшого пакетного файла размер файла в указанный файл журнала сравнивается с пределом размера файла, определенного в пакетном файле.

Если размер файла журнала больше или равен установленному пределу размера файла, текущий файл журнала перемещается в тот же каталог с вставкой _old перед расширением файла, возможно, уже существующим _old. файл с тем же именем и расширением файла.

Другими словами, этот пакетный файл перемещаетC:\BackupFolder\Backup.log в C:\BackupFolder\Backup_old.log с перезаписью автоматически наиболее вероятно, уже существующий C:\BackupFolder\Backup_old.log всякий раз, когда файл журнала имеет 4 или более МиБ.

В результате существует как минимум 1 файл журнала, либо Backup.log, либо Backup_old.log с зарегистрированными сообщениями последних операций резервного копирования N.

И общий размер, необходимый для носителя данных для обоих файлов журнала, в худшем случае составляет около 8 MiB плюс некоторые KiB от последней операции резервного копирования.

Предел размера файла может быть определен в зависимости от того, сколько данных добавляется по умолчанию при каждой операции резервного копирования.Например, если типичная операция резервного копирования выполняется каждые 4 часа добавляет 96 KiB данных в файл журнала, формула для ограничения размера файла:

96 KiB x 6 backups per day x 7 days = 4032 KiB 

4032 KiB немного меньше, чем 4096 KiB (= 4 MiB). Таким образом, при следующей резервной копии достигается ограничение размера файла 4 MiB, и текущий файл журнала перемещается, заменяя старый файл журнала. Другими словами, при типичных резервных копиях каждый файл журнала содержит сообщения журнала за неделю до создания нового.

Этот простой командный файл может быть также определен для вызова из других пакетных файлов для различных файлов журналов с различными ограничениями размера файла, что позволяет использовать 1 пакетный файл для многих разных файлов журналов на сервере.

@echo off 
setlocal EnableExtensions 
if "%~1" == "" goto EndFileSizeCheck 
set "LogFile=%~1" 

rem Define default file size limit for the log file with 4 MiB. 
set "SizeLimit=4194304" 
if not "%~2" == "" set "SizeLimit=%~2" 

for %%I in ("%LogFile%") do (
    if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI" 
) 

:EndFileSizeCheck 
endlocal 

Для командного файла выше в качестве первого параметра требуется указать имя файла журнала. В качестве второго параметра ограничение размера файла может быть указано дополнительно. 4 MiB используется по умолчанию, если ограничение на размер файла не передается в пакетный файл.

ВАЖНО: Сравнение размеров файлов работает только для 2 GiB - 1 = 2^31 - 1 bytes = 2147483647 байт. Поэтому используйте ограничение на размер файла, для которого текущий размер файла журнала более или менее гарантирован, а не два гигабайта или более.

Вышеупомянутый пакетный код также может использоваться для всех * .log-файлов в каталоге. Но в этом случае важно переместить файл журнала в другой каталог или изменить расширение файла при перемещении или добавить дополнительный код, чтобы старый файл журнала не перемещался снова и снова и снова.

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 
if "%~1" == "" goto EndFileSizeCheck 
set "LogFile=%~1" 

rem Define default file size limit for the log file with 4 MiB. 
set "SizeLimit=4194304" 
if not "%~2" == "" set "SizeLimit=%~2" 

for %%I in ("%LogFile%") do (
    set "FileName=%%~nI" 
    if /I not "!FileName:~-4!" == "_old" (
     if %%~zI GEQ %SizeLimit% move /Y "%%I" "%%~dpnI_old%%~xI" 
    ) 
) 

:EndFileSizeCheck 
endlocal 

Пакетный файл вариант выше, может быть вызван из другого пакетного файла, например, с

call FileSizeCheck.bat "C:\BackupFolder\*.log" 16777216 

проверить каждый * .log файл в папке C:\BackupFolder на файл предельный размер 16 Мбайт с игнорированием уже существующие * _old.log в этом каталоге.

Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • call /? ... %~1 объясняет и %~2
  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • move /?
  • rem /?
  • set /?
  • setlocal /?

Команды setlocal EnableExtensions и endlocal не будет необходимости в первых двух пакетных файлов в качестве расширения команды включены по умолчанию в Windows. Но использование гарантирует, что переменные окружения вызывающих пакетных файлов никогда не изменяются размерным файлом, проверяющим размер файла и перемещая файл при достижении максимального размера файла.