Запись в лог исключений Python

Скрипты, в том числе на Python хороши тем, что можно, написав две-три строчки получить массу полезных эффектов. При ошибках скрипты на Python выдают в поток ошибок информацию, по которой легко можно определить место и причину ошибки. А если скрипт запускается не из консоли?

Проблема

В самом деле, при отладке скрипты как правило запускаются из консоли. А вот в рабочем режиме далеко не всегда.

Сразу напрашивается решение писать в файл. Однако что, и как писать?

Напрашивается простое решение, в местах возможных исключений перехватить их, обработать и записать в файл. Это классическое решение.

Однако такое решение на мой взгляд имеет два серьезных недостатка, которые во многом сводят на нет вкусности писания на скриптовом языке.

  1. Теряется краткость и прозрачность программы. Для некоторых программ количество строк может возрасти в два-три раза.
  2. Нет никаких гарантий, что мы предусмотрели все места, в которых возможны ошибки. В случае ошибки в непредусмотренном месте, случится самое неприятное, произойдет сбой, а никакой информации о ней у нас не будет.

Предлагаемое решение

А давайте решим задачу "бандитским приемом". Исключений обрабатывать не будем. А информацию получим так: наш скрипт запускать будем не напрямую, а напишем скрипт-обертку на bash, который будет запускать наш скрипт, а в случае ошибки, запишет поток ошибок в лог.

Фрагмент запускаемого скрипта на Python:

1 # Get session_id
2 session_id = get_next_session_id()
3 dbg.wr("session_id = " + str(session_id))
4 # Print to stdout for wrapper
5 print "session_id = ",session_id,"\n"

Текст cкрипта обертки:

 1 #! /bin/bash
 2 # Copyright Evgeny Kazanov 2011
 3 
 4 ERROR_FILE="/tmp/python_script.err"
 5 export LANG=ru_RU.UTF-8
 6 RESULT=`(cat | python_script.py "$@" 2>&1) `
 7 
 8 if echo "$RESULT"|grep  -v -q '^session_id[ ]*=[ ]*[0-9][0-9]*[ ]*$' 
 9 then
10     echo '----------------------' >> $ERROR_FILE
11     echo $RESULT >> $ERROR_FILE
12     exit 1
13 fi
14 
15 exit 0

Комментарии к скрипту:

  1. session_id В решаемой задаче, скрипт запускается неоднократно, с разными входными данными (обрабатывал входящую почту). При работе скрипт пишет много сообщений в лог. Для того, чтобы можно бы было поставить в соответствие записи в логе и в логе ошибок, применена переменная session_id. Эта переменная увеличивается на единицу для каждого следующего запуска скрипта. Записи в лог начинаются с session_id. Так же при старте скрипта, session_id печатается на стандартный выход. В случае ошибки session_id печатается в лог ошибок.
  2. В качестве временного решения, скрипт пишет напрямую в /tmp/python_script.err. По нормальному надо писать через системный интерфейс логгирования.
  3. Остальное вроде понятно из текста.

В процессе работы описанный подход показался мне эффективным и очень удобным.

Опубликовано: June 26, 2011

Комментарии:


Комментировать:

Имя:

Комментарий: