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

Код:

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


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

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
)

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

licensed under cc by-sa 3.0 with attribution.