Показать полную графическую версию : Батник для подсчета информации из логов
vision-d
13-12-2013, 16:44
Добрый день!
Помогите написать батник для подсчета информации из логфайла. Нужно чтобы он подсчитал сколько раз открывалсись эти документы из приведенных в логе и общее число открытых документов за период. Строки лога выглядит так:
2013-08-12 15:11:31.373 rl1002772826 30 1,2,166,167,168,169,170,171,172,173,174,175,176,175,176,177,178,179,180,181,182,183,182,183,184,185, 186,187,188,2 ЕВГЕНИЙ АБАКМОВ 10.710.40.92
2013-08-06 15:24:31.537 rl1005019694 5 1,2,1,11,13 ЮЛИЯ АНШИНА 107.4.0.25
2013-08-07 19:11:13.037 rl1003313852 2 1,2 ИРИНА ИЛЬИНА 107.7.44.97
Структура предоставленных данных:
- дата и время
- номер документа
- количество страниц документа, которые были просмотрены
- перечень номеров страниц, которые были открыты
- Имя пользователя
- Фамилия пользователя
- IP адрес
Укажите, где здесь:
2013-08-12 15:11:31.373 rsl1@002772826 30 …
именно номер, и где здесь время.
Укажите, каким образом из приведённого фрагмента можно определить, сколько раз открывался документ, и общее число.
vision-d
14-12-2013, 12:22
Номер: rsl1@002772826
Время: 15:11:31.373
Это не полный лог, я взял три строки из него для примера. Определить я думаю можно количеством повторений каждого из номера в логе.
Очень надо, помогите пожалуйста разобраться!
Вот болванка кода:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=E:\Песочница\0336\0002.txt
set sFromDateTime=2013-08-05
set sToDateTime=2013-08-09
set sDocumentID=rsl1@005019694
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Field3 AS [Document ID], COUNT([Document ID]) AS [Total] USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Field2), 'yyyy-MM-dd hh:mm:ss.ll') AS Date INTO DATAGRID FROM '%sSourceFile%' WHERE [Document ID] = '%sDocumentID%' AND TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-dd') <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date GROUP BY [Document ID]" -i:TSV -iSeparator:space -headerRow:OFF -iCodepage:1251 -stats:OFF -rtp:-1
endlocal
exit /b 0
для Log Parser 2.2 (http://technet.microsoft.com/ru-ru/scriptcenter/dd919274.aspx). Разумеется, все параметры можно хоть вводить, хоть передавать в командной строке; вывод направлять не в GUI, а на консоль или в файл и т.п. Настраивайте так, как Вам будет удобнее.
vision-d
14-12-2013, 20:59
Никогда с подобным не сталкивался, подскажите
Я так понял в строку set sSourceFile указывать путь к моему лог файлу.
set sFromDateTime - начало
set sToDateTime - конец
set sDocumentID - это что за параметр???
У меня выдает ошибку:
C:\Users\DigitalWAVE>@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=C:\Users\DigitalWAVE\Desktop\12.txt
set sFromDateTime=2013-08-05
set sToDateTime=2013-08-09
set sDocumentID=rsl1@005019694
"ProgramFiles\Log Parser 2.2\LogParser.exe" "SELECT Field3 AS [Document ID], COU
NT([Document ID]) AS [Total] USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Fiel
d2), 'yyyy-MM-dd hh:mm:ss.ll') AS Date INTO DATAGRID FROM '%sSourceFile%' WHERE
[Document ID] = '%sDocumentID%' AND TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-dd'
) <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date GROUP BY [Docu
ment ID]" -i:TSV -iSeparator:space -headerRow:OFF -iCodepage:1251 -stats:OFF -rt
p:-1
Системе не удается найти указанный путь.
endlocal
exit /b 0
set sDocumentID - это что за параметр??? »
Номер документа.
У меня выдает ошибку: …Системе не удается найти указанный путь. »
Вы загрузили и установили Log Parser 2.2 (http://technet.microsoft.com/ru-ru/scriptcenter/dd919274.aspx)?
vision-d
15-12-2013, 19:41
Да, установил.
Если вставляю код в log parser то получаю следующее:
C:\Program Files (x86)\Log Parser 2.2>@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=C:\Users\DigitalWAVE\Desktop\12.txt
set sFromDateTime=2013-08-05
set sToDateTime=2013-08-09
set sDocumentID=rsl1@005019694
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Field3 AS [Document ID], C
OUNT([Document ID]) AS [Total] USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Fi
eld2), 'yyyy-MM-dd hh:mm:ss.ll') AS Date INTO DATAGRID FROM '%sSourceFile%' WHER
E [Document ID] = '%sDocumentID%' AND TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-d
d') <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date GROUP BY [Do
cument ID]" -i:TSV -iSeparator:space -headerRow:OFF -iCodepage:1251 -stats:OFF -
rtp:-1
Error: SELECT clause: Syntax Error: unknown field 'Field3'.
The closest match for input format 'TSV' is 'Field1'.
To see valid fields for the TSV input format type:
LogParser -h -i:TSV
endlocal
exit /b 0
Error: SELECT clause: Syntax Error: unknown field 'Field3'.
The closest match for input format 'TSV' is 'Field1'. »
Делать нечего — vision-d, выложите реальный лог-файл, упаковав его в архив под паролем, на RGhost. Ссылку на выложенный архив и пароль — отправьте мне в личку. Постарайтесь выбрать лог-файл поменьше размером.
vision-d, письмо получил, архив забрал. Первое, что вижу — у нас в файле наличествует Tab, а не Space в качестве разделителя; кодировка файла не ANSI/1251, а UTF-8 ;). Смотрю.
Итак, сначала исправленный пример для выложенного лог-файла:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=E:\Песочница\0336\StatDocsView3kv.txt
set sFromDateTime=2013-08-05
set sToDateTime=2013-08-15
set sDocumentID=rsl1@004665301
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Field2 AS [Document ID], COUNT([Document ID]) AS [Total] USING Field1 AS Date INTO DATAGRID FROM '%sSourceFile%' WHERE [Document ID] = '%sDocumentID%' AND TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-dd') <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date GROUP BY [Document ID]" -i:TSV -iSeparator:tab -headerRow:OFF -iTsFormat:"yyyy-MM-dd hh:mm:ss.ll" -iCodepage:65001 -stats:OFF -rtp:-1
endlocal
exit /b 0
Теперь по поводу вопроса из PM:
И ещё вопрос, можно сделать так чтобы скрипт составлял список какие файлы были открыты и сколько раз, а не искал кол-во повторений по отдельности для каждого документа...
Можно (полагаю, даты интервала при этом остаются в силе?). Достаточно просто убрать условие для отбора документа. Ну, и ещё можно добавить сортировку, скажем, по количеству:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=E:\Песочница\0336\StatDocsView3kv.txt
set sFromDateTime=2013-08-05
set sToDateTime=2013-08-15
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Field2 AS [Document ID], COUNT([Document ID]) AS [Total] USING Field1 AS Date INTO DATAGRID FROM '%sSourceFile%' WHERE TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-dd') <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date GROUP BY [Document ID] ORDER BY Total DESC" -i:TSV -iSeparator:tab -headerRow:OFF -iTsFormat:"yyyy-MM-dd hh:mm:ss.ll" -iCodepage:65001 -stats:OFF -rtp:-1
endlocal
exit /b 0
Вот результат:
http://img46.imageshack.us/img46/8589/vesi.png
Ежели потребно что-то ещё, або как-то иначе — пишите.
Из очередного письма в PM:
Можно ли ещё сделать чтобы он выдавал кол-во открытых страниц за период, подсчитывал кол-во уникальных документов за период и документов открытых вообще за период...
Поскольку Вам требуется выполнять ряд разных запросов на одном и том же источнике данных, есть смысл вынести текст запросов в отдельные файлы.
Пакетный файл примет следующий вид:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=E:\Песочница\0336\StatDocsView3kv.txt
set sFromDateTime=2013-08-05
set sToDateTime=2013-08-15
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Pages count by interval.sql"?SourceFile=%sSourceFile%+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:tab -headerRow:OFF -iTsFormat:"yyyy-MM-dd hh:mm:ss.ll" -iCodepage:65001 -stats:OFF -rtp:-1
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Unique documents count by interval.sql"?SourceFile=%sSourceFile%+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:tab -headerRow:OFF -iTsFormat:"yyyy-MM-dd hh:mm:ss.ll" -iCodepage:65001 -stats:OFF -rtp:-1
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Documents count by interval.sql"?SourceFile=%sSourceFile%+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:tab -headerRow:OFF -iTsFormat:"yyyy-MM-dd hh:mm:ss.ll" -iCodepage:65001 -stats:OFF -rtp:-1
endlocal
exit /b 0
1. Общее количество открытых страниц за период — «Query - Pages count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
SUM(Field3) AS [Total pages]
USING Field1 AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
2. Количество уникальных документов за период — «Query - Unique documents count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
COUNT(DISTINCT Field2) AS [Total unique documents]
USING Field1 AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
3. Общее количество документов за период — «Query - Documents count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
COUNT(Field2) AS [Total documents]
USING Field1 AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
Надеюсь, ничего не напутал.
vision-d
18-12-2013, 11:49
Ура, Работает!!!
Огромное спасибо!
vision-d
19-12-2013, 14:02
Помогите ещё сделать тоже самое с вот таким логом: http://yadi.sk/d/EIs3pqxcEaB4h
Нужно чтоб было
- Количество открытых документов - open
- Количество уникальных открытых документов - open, document
- Количество просмотренных страниц - view
- Количество распечатанных страниц - print
С выбором временных интервалов по дате
Спасибо.
Насколько я понимаю, здесь совсем другая логика, и в «page» показывается номер страницы, а не количество.
Пакетный файл:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=C:\Песочница\036\new 2.txt
set sFromDateTime=2013-12-05
set sToDateTime=2013-12-15
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Opened documents count by interval.sql"?SourceFile="%sSourceFile%"+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:space -headerRow:OFF -nSkipLines:2 -iCodepage:1251 -stats:OFF -rtp:-1
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Unique opened documents count by interval.sql"?SourceFile="%sSourceFile%"+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:space -headerRow:OFF -nSkipLines:2 -iCodepage:1251 -stats:OFF -rtp:-1
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Viewed pages count by interval.sql"?SourceFile="%sSourceFile%"+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:space -headerRow:OFF -nSkipLines:2 -iCodepage:1251 -stats:OFF -rtp:-1
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" file:"Query - Printed pages count by interval.sql"?SourceFile="%sSourceFile%"+FromDateTime=%sFromDateTime%+ToDateTime=%sToDateTime% -i:TSV -iSeparator:space -headerRow:OFF -nSkipLines:2 -iCodepage:1251 -stats:OFF -rtp:-1
endlocal
exit /b 0
1. «Query - Opened documents count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
COUNT(Field4) AS [Total opened documents]
USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Field2),'yyyy-MM-dd hh:mm:ss.ll') AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Field3 = 'open' AND Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
2. «Query - Unique opened documents count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
COUNT(DISTINCT Field4) AS [Total opened unique documents]
USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Field2),'yyyy-MM-dd hh:mm:ss.ll') AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Field3 = 'open' AND Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
3. «Query - Viewed pages count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
COUNT(Field4) AS [Total viewed pages]
USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Field2),'yyyy-MM-dd hh:mm:ss.ll') AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Field3 = 'view' AND Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
4. «Query - Printed pages count by interval.sql»:
SELECT
'%FromDateTime%' AS [From date],
'%ToDateTime%' AS [To date],
COUNT(Field4) AS [Total printed pages]
USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Field2),'yyyy-MM-dd hh:mm:ss.ll') AS Date
INTO DATAGRID
FROM '%SourceFile%'
WHERE Field3 = 'print' AND Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')
vision-d
20-12-2013, 11:17
Да, именно так. Все в норме, работает!
Можно ещё сделать чтобы скрипт как для первого лога составлял список какие файлы были открыты и сколько раз с интервалом дат.
Спасибо за помощь!
Если не трудно посоветуйте литературу по созданию таких скриптов..
Можно ещё сделать чтобы скрипт как для первого лога составлял список какие файлы были открыты и сколько раз с интервалом дат. »
Подумаем.
Если не трудно посоветуйте литературу по созданию таких скриптов.. »
В документации — «%ProgramFiles%\Log Parser 2.2\LogParser.chm». По составлению же самих запросов SQL сгодится любой приличный учебник по Microsoft SQL Server объёмом от 1200-1400 страниц и выше (в LogParser используется урезанный вариант SQL).
vision-d
23-12-2013, 09:55
Подумаем »
Салют!
Удалось что-нибудь придумать?
vision-d, руки пока не дошли.
vision-d
23-12-2013, 13:29
Спасибо за помощь, разобрался...
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=C:\Users\nadeykinDA\Desktop\document_statistics.txt
set sFromDateTime=2013-05-05
set sToDateTime=2013-12-15
set sDocumentID=
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Field4 AS [Document ID], COUNT([Document ID]) AS [Total] USING TO_TIMESTAMP(STRCAT(STRCAT(Field1, ' '), Field2),'yyyy-MM-dd hh:mm:ss.ll') AS Date INTO DATAGRID FROM '%sSourceFile%' WHERE Field3 = 'open' AND TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-dd') <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date GROUP BY [Document ID] ORDER BY Total DESC" -i:TSV -iSeparator:space -headerRow:OFF -nSkipLines:2 -iTsFormat:"yyyy-MM-dd hh:mm:ss.ll" -iCodepage:1251 -stats:OFF -rtp:-1
endlocal
exit /b 0
vision-d, да, примерно так. Можете ещё заменить в условии «TO_TIMESTAMP('%sFromDateTime%', 'yyyy-MM-dd') <= Date AND TO_TIMESTAMP('%sToDateTime%', 'yyyy-MM-dd') >= Date» на «Date BETWEEN TO_TIMESTAMP('%FromDateTime%', 'yyyy-MM-dd') AND TO_TIMESTAMP('%ToDateTime%', 'yyyy-MM-dd')» как в последних примерах.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.