У меня есть журнал, в котором есть такие биты:
[2012-04-16 15:16:43,827: DEBUG/PoolWorker-2] {'feed': {}, 'bozo': 1, 'bozo_exception': URLError(error(110, 'Connection timed out'),), 'entries': []}
[2012-04-16 15:16:43,827: ERROR/PoolWorker-2] get_entries
Traceback (most recent call last):
File "/opt/myapp/app.py", line 491, in get_entries
logging.getLogger(__name__).debug("Title: %s" % doc.title)
File "build/bdist.linux-x86_64/egg/feedparser.py", line 423, in __getattr__
raise AttributeError, "object has no attribute '%s'" % key
AttributeError: object has no attribute 'title'
[2012-04-16 15:16:43,828: INFO/MainProcess] Task myapp.do_task[4fe968ff-e069-4cfe-9a81-aece0d97c289] succeeded in 21.0481028557s: None
Я хотел бы извлечь из него следующие разделы:
Я почти уверен, что это слишком много для Grep, так как это сделать?
(Хорошо, вместо того, чтобы полениться, я разобрался - опубликую свое решение.)
Это сработало для меня - не совсем так, как описано выше, но достаточно близко:
awk '/ERROR|WARN/,/DEBUG|INFO/ { if ($0 !~ /(DEBUG|INFO)/) { print } }' < logfile
Очень удобно, что awk поддерживает это: /startpattern/,/stoppattern/ { }
. К сожалению, если шаблон остановки совпадает с той же строкой, что и шаблон начала, он распечатывает только эту строку, следовательно, требуется другой шаблон остановки.
Попробуйте что-то вроде этого:
cat importantstuff.log | grep 'File .*, line .*, in .*' -B 1 -A 2
Точно не отвечает на вопрос, но, думаю, решает задачу.
В -A
и -B
флаги для контрольных строк контекста grep после или до вашего совпадения.
Это работает, потому что grep группирует смежные совпадения, поэтому вы получаете хорошо разделенные трассировки:
Traceback (most recent call last):
File "sfquest.py", line 9, in b
c()
File "sfquest.py", line 15, in c
d()
File "sfquest.py", line 20, in d
raise Exception('important information')
Exception: important information
--
Traceback (most recent call last):
File "sfquest.py", line 9, in b
c()
File "sfquest.py", line 15, in c
d()
File "sfquest.py", line 20, in d
raise Exception('important information')
Exception: important information
--
Traceback (most recent call last):
File "sfquest.py", line 9, in b
c()
File "sfquest.py", line 15, in c
d()
File "sfquest.py", line 20, in d
raise Exception('important information')
Exception: important information
Вот пример кода, который я использовал для создания примера трассировки:
import traceback
def a():
b()
def b():
for i in range(10):
try:
c()
except Exception, e:
print 'bad stuff'
print traceback.format_exc(e)
def c():
d()
def d():
for i in range(10):
print 'random junk'
raise Exception('important information')
a()