Применение счетчика в журнале

Код:

@echo off

for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set "dt=%%a"

set "YY=%dt:~2,2%"
set "MM=%dt:~4,2%"
set "DD=%dt:~6,2%"

set "today=%YY%%MM%%DD%"

findstr /i /c:"The_database_has_been_locked." "C:\admin\logs\*%today%.log" >> "C:\records\Error.txt"

Описание проблемы:

У меня есть несколько файлов журналов по пути C:\admin\logs\, которые создаются каждый день, имея в своих именах дату этого дня.

Я хочу найти определенное сообщение об ошибке только во всех файлах, созданных сегодня. И как только сообщение об ошибке будет найдено, немедленно добавить полную строку с сообщением об ошибке в текстовый файл с именем Error.txt.

Я запланировал запуск этого скрипта каждый день каждые 10 минут.

Проблема, с которой я сталкиваюсь здесь, заключается в том, что добавление указанного сообщения об ошибке возникало в определенный момент времени несколько раз. Я имею в виду, что при каждом запуске он также добавляет ранее проанализированные сообщения об ошибках, чего я не хочу.

Я хочу добавить сообщение об ошибке только один раз в Error.txt для определенного экземпляра времени возникновения ошибки на текущую дату.

Не могли бы вы помочь мне здесь?

EDIT:фрагмент журнала

Фрагмент журнала:

2013-12-06 16:29:31 10.35.44.195 GET /perform/all/per_cubes.asp - 80 - 172.23.45.72 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+Trident/4.0;+NGD_build;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E;+InfoPath.3;+MS-RTC+LM+8) 200 0 0 328
2013-12-06 16:29:33 10.35.44.195 GET /perform/all/per_cubes.asp |62|80004005|[Microsoft][ODBC_Microsoft_Access_Driver]_The_database_has_been_locked. 80 - 62.239.225.222 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729;+.NET4.0C;+.NET4.0E;+SLCC2) 500 0 0 468
2013-12-06 16:29:44 10.35.44.195 GET /perform/all/per_cubes.asp |62|80004005|Unspecified_error 80 - 10.225.206.76 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+Trident/4.0;+NGD_build;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E;+InfoPath.3;+MS-RTC+LM+8) 500 0 0 93

Добавление сообщения об ошибке в Error.txt, как показано ниже (только один раз в определенное время текущей даты):

2013-12-06 16:29:33 10.35.44.195 GET /perform/all/per_cubes.asp |62|80004005|[Microsoft][ODBC_Microsoft_Access_Driver]_The_database_has_been_locked. 80 - 62.239.225.222 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+.NET+CLR+3.5.30729;+.NET4.0C;+.NET4.0E;+SLCC2) 500 0 0 468

person Sunny    schedule 07.01.2014    source источник
comment
Итак, вы запускаете этот скрипт несколько раз в течение дня, и поэтому он получает повторяющиеся записи в Error.txt?   -  person unclemeat    schedule 08.01.2014
comment
Можете ли вы дать репрезентативный фрагмент одного из ваших файлов журнала и. И опишите нужный результат.   -  person SachaDee    schedule 08.01.2014
comment
@unclemeat.. да, ты прав! Я запланировал запуск этого скрипта каждый день каждые 10 минут.   -  person Sunny    schedule 08.01.2014
comment
@sachadee.. Я загрузил фрагмент журнала и необходимые выходные данные.   -  person Sunny    schedule 08.01.2014


Ответы (2)


@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
SET "destdir=c:\destdir"

:: Need to put YOUR setting of %TODAY% in here - I'm using constants for testing

SET today=20140109

FOR %%a IN ("%sourcedir%"\beenprocessed*.txt) DO IF /i NOT "%%a"=="%sourcedir%\beenprocessed%today%.txt" DEL "%%a"
IF NOT EXIST "%sourcedir%\*%today%.log" GOTO :eof

ECHO dummy>>"%sourcedir%\beenprocessed%today%.txt"
findstr /i /c:"The_database_has_been_locked." "%sourcedir%\*%today%.log" >"%sourcedir%\beINGprocessednow.txt"
FINDSTR /i /v /b /e /g:"%sourcedir%\beenprocessed%today%.txt" "%sourcedir%\beINGprocessednow.txt" >>"%destdir%\Error.txt"
type "%sourcedir%\beINGprocessednow.txt" >> "%sourcedir%\beenprocessed%today%.txt" 
GOTO :EOF

Вам нужно будет вставить свою настройку %today% - я просто использовал константу. Кроме того, я задал исходный и конечный каталоги как переменные. Просто вопрос внесения изменений.

Меня не волнует, находятся ли файлы ...beenprocessed... и ...beingprocessednow... в %sourcedir%, %destdir%, %temp% или %someotherdir%. Выбор за программистом.

Принцип таков:

добавить фиктивную строку в beenprocessed.... Это либо создает файл, либо добавляет к нему строку, которая просто не будет представлять интереса (она не проходит фильтр '...database_has_been...').

Найдите все целевые записи в журналах и поместите их в файл beingprocessednow.

Найдите все строки в beingprocessednow, которых нет в beenprocessed, т.е. новые строки и добавьте их в файл error.txt.

Добавьте все содержимое beingprocessednow к beenprocessed, включая новые данные.

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

dummy нужно добавить к "словам для исключения", потому что findstr ../g требует наличия хотя бы одной строки в файле. dummy не может быть допустимым словом, занимающим ровно одну строку (/b /e), потому что все интересующие строки содержат целевую строку.

person Magoo    schedule 08.01.2014
comment
@Magoo... Работает просто отлично..!! благодарю вас..! :-) - person Sunny; 09.01.2014

Предположительно все записи журнала в некотором роде уникальны.

setLocal enableDelayedExpansion
set searchString=The_database_has_been_locked.
set sourceFile=C:\admin\logs\*%today%.log

for /f "delims=~!" %%a in ('findstr /i /c:"%searchString%" "%sourceFile%"') do (
    set skip=0
    for /f "delims=~!" %%b in ('findstr /i /c:"%%a" "Error.txt"') do set skip=1
    if !skip!==0 echo %%a & echo %%a >> Error.txt
)

Внутренний цикл for сможет установить переменную skip только в том случае, если он найдет %%a в Error.txt. Поэтому, если пропуск не определен, дублирующейся записи не будет, и вы можете добавить ошибку к Error.txt.

person unclemeat    schedule 07.01.2014
comment
@unclement ... Он работает только тогда, когда новые записи добавляются в фактический файл журнала вверху, но, как мы знаем, этого никогда не произойдет, потому что новая запись всегда добавляется в последнюю очередь (никогда не вверху) по умолчанию. Не могли бы вы изменить его для такой работы? - person Sunny; 09.01.2014