Должен ли я войти до или после операции? - PullRequest
6 голосов
/ 02 января 2011

Я думаю о том, где написать запись журнала вокруг операции.Вот два разных стиля.Первый, запись журнала перед операцией.

До:

log.info("Perform operation XXX")
operation()

А вот другой стиль, запись журнала после операции.

После:

operation()
log.info("Operation XXX is done.")

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

Конечно, мы можем смешать эти два стиля вместе

Оба:

log.info("Perform operation XXX")
operation()
log.info("Operation XXX is done.")

Но я чувствуюэто довольно многословно, он делает двойные записи в журнале.Итак, вот мой вопрос - каков хороший стиль ведения журнала?Я хотел бы знать, как вы думаете.

Ответы [ 5 ]

10 голосов
/ 02 января 2011

Я бы обычно использовал два разных уровня лога .

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

2 голосов
/ 02 января 2011

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

0 голосов
/ 02 января 2011

Может быть, вы могли бы использовать что-то вроде try catch?Вот пример наивного Python:

try :
    operation()
    log.info("Operation XXX is done.")
except Exception:
    log.info("Operation xxx Failed")
    raise Exception() # optional : if you want to propagate failure to another try catch statement and/or crash eventually. 

Операция будет запущена.Если это не сработало (исключение не возникло), вы получите сообщение об успешном завершении в журналах.

Если это не удастся (вызвав исключение. Например, диск заполнен или все, что вы пытаетесь сделать), возникает исключениеи вы получите сообщение об ошибке.

Журнал более полон.Вы можете сохранить многословие в oneliner и узнать, если операция прошла успешно.Лучший из всех вариантов.

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

Надеюсь, это поможет.

0 голосов
/ 02 января 2011

Есть еще один стиль, который я видел в скриптах загрузки Linux и в strace. В нем есть преимущества вашего комбинированного стиля с меньшим количеством деталей, но вы должны убедиться, что ваше средство регистрации не выполняет буферизацию. Я не знаю log.info, поэтому вот пример с print:

print "Doing XXX... ",  # Note lack of newline :)
operation()
print "Done."

(Поскольку в большинстве случаев print использует буферизацию, использование этого примера дословно не будет работать. Вы не увидите «Выполнение XXX», пока не увидите «Готово». Но вы получите общее представление.)

Другим недостатком этого стиля является то, что все может запутаться, если у вас несколько потоков, пишущих в один и тот же журнал.

0 голосов
/ 02 января 2011

Последняя форма:

log.info("Start XXX") 
operation() 
log.info("End XXX") 

, поскольку он предоставляет наибольшую информацию.

Вы можете уменьшить уровень регистрации, очевидно, так что при нормальных условиях работы он не будет слишком многословным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...