2011-01-02 3 views
3

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

До:

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

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

После:

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

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

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

Оба:

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

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

Спасибо.

ответ

5

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

2

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

0

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

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

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

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

0

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

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

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

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

+0

Я предлагаю не делать этого. Что делать, если вы хотите добавить журнал в 'operation()'? Кроме того, 'print' добавляет новую строку. Я знаю, что это просто псевдокод, но это будет непросто реализовать с любой библиотекой протоколирования. – Falmarri

+0

Это правда, вы наверняка столкнетесь с проблемами гнездования. Что касается 'print', AIUI добавляет запятую в конец, подавляет новую строку. – Jander

0

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

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 и узнать, удалось ли выполнить операцию. Лучший выбор.

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

Я надеюсь, что это поможет.