我应该在手术前后进行记录吗?

时间:2011-01-02 06:08:50

标签: python logging coding-style

我正在考虑在操作周围写入日志记录的位置。这是两种不同的风格。第一个,在操作之前写日志。

在:

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 个答案:

答案 0 :(得分:10)

我通常使用两种不同的log levels

第一个我放在“调试”级别,第二个放在“信息”级别。这样,典型的生产机器只会记录正在进行的操作,但是我可以打开调试日志记录,看看它在出错之前尝试做什么。

答案 1 :(得分:2)

这完全取决于您要记录的内容。如果您对代码感兴趣,那就要进行操作了。如果要确保操作成功,请在之后执行。如果你想要两者,那就做两件事。

答案 2 :(得分:0)

后一种形式:

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

因为它提供了最多的信息。

您可以明显降低日志记录级别,因此在正常操作条件下不会过于冗长。

答案 3 :(得分:0)

也许你可以使用像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的详细程度,并了解操作是否成功。最好的选择。

哦,你得到一个钩子点,你可以添加一些代码,以便在发生故障时执行。

我希望它有所帮助。

答案 4 :(得分:-2)

我在Linux启动脚本和strace中看到了另一种风格。它具有您的组合风格和较少冗长的优点,但您必须确保您的日志记录工具没有进行任何缓冲。我不知道log.info,所以这是print的一个粗略示例:

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

(因为在大多数情况下print使用缓冲,使用此示例逐字不会正常工作。在看到“完成”之前,您不会看到“正在执行XXX”。但是您可以得到一般的想法。 )

这种风格的另一个缺点是,如果有多个线程写入同一个日志,事情可能会混淆。