я обнаружил, что комбинация grep
,cut
,sort
,uniq
,head
и tail
полезны для специальной, одноразовой проверки журнала.
проверить начало файла журнала
похоже, что каждая строка начинается с даты/времени.
$ head porter10.log
03/10/2011 12:14:25 -------- (Port Control [Version 5.2 (Milestone 4)]) --------
03/10/2011 12:14:25 -------- LOG BEGINS --------
03/10/2011 12:14:25 Common DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
03/10/2011 12:14:25 Message DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
удалить timestamp
я использую cut
команда, указывающая сохранить поля 3 и выше и использовать пробел в качестве разделителя.
$ cut -f3- -d' ' porter10.log | head
-------- (Port Control [Version 5.2 (Milestone 4)]) --------
-------- LOG BEGINS --------
Common DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
Message DLL [Version 5.2 (Milestone 4)] [Version Details: 5.2.4]
обрезать неизменяемую часть линия
у меня было предчувствие, что большинство лишних выходных строк будут иметь аналогичный текст, поэтому я обрезал вывод до первых 20 символов после метки времени.
$ cut -f3- -d' ' porter10.log | cut -b-20 | head
-------- (Port Cont
-------- LOG BEGINS
Common DLL [Version
Message DLL [Version
Protocol DLL [Versio
сортировать и найти наибольшее количество
затем я сортировал, подсчитывал и сортировал счетчики, чтобы найти, какие строки возникали чаще всего.
похоже, что моя наивная техника удаления временной метки обрезала некоторую полезную (не временную) информацию в нескольких строках, оставив меня с вместо этого некоторые голые цифры.
Тем не менее, похоже, что все они происходили с одинаковой частотой и на порядок чаще, чем что-либо еще, поэтому я нашел своих подозреваемых.
20-символьный диапазон-это догадка, а не жесткое правило. Возможно, вам придется выполнить этот шаг несколько раз, чтобы найти сладкое пятно, которое отделяет необычными линиями.
$ cut -f3- -d' ' porter10.log | cut -b-20 | sort | uniq -c | sort -n
13827 Error (266) to Remot
13842 Error decode for dev
17070 Error Writing to Ret
46506 **** Checkpoint ****
181820 (65)
181820 (67)
181821 (111)
181821 (1555)
181821 (55)
181821 (66)
181821 (77)
181980 (107)
поиск кандидатов в контексте
Итак, теперь у меня есть список потенциальные кандидаты, я могу искать их в контексте, используя grep
и -C#
опция строки контекста:
$ grep -C3 '(1555)' porter10.log | head
03/10/2011 12:14:25.455 looking for DLC devices / start
Decoding tbl_pao_lite.cpp (107)
Decoding tbl_base.cpp (111)
Decoding dev_single.cpp (1555)
Decoding dev_dlcbase.cpp (77)
Decoding tbl_carrier.cpp (55)
Decoding tbl_route.cpp (66)
--
Decoding tbl_loadprofile.cpp (67)
Decoding tbl_pao_lite.cpp (107)
подход Монте-Карло-осмотрите середину файла журнала
если вышеуказанный подход не работает, попробуйте посмотреть различные пятна в файле.
похоже, что в этом файле около 1,6 миллиона строк, поэтому я посмотрел на строку 800k.
Это подтвердило результаты моего сортировки и подсчета подход.
$ wc -l porter10.log
1638656 porter10.log
$ head -800000 porter10.log | tail
Decoding dev_dlcbase.cpp (77)
Decoding tbl_carrier.cpp (55)
Decoding tbl_route.cpp (66)
Decoding dev_carrier.cpp (65)
успехов!
в этом случае вывод был вызван избыточным ведением журнала отладки в наших файлах конфигурации.
вам нужно будет настроить этот подход в соответствии с вашим конкретным файлом журнала, но основные ключи:
- вырезать метки
- обрезать до некоторой части строки, которая, вероятно, будет неизменной
- сортировать и рассчитывать то, что осталось
- поиск по крупнейшей правонарушители в контексте