Python日志记录有时会将消息写入文件而不是格式化

时间:2015-02-12 21:40:43

标签: python logging

记录器在没有格式的情况下写下关于每一行的新问题,只有消息。

我的代码:

import logging
from logging.handlers import RotatingFileHandler

# Set up logging
LOG_FILE = argv[0][:-3] + '.log'
logging.basicConfig(
    filename=LOG_FILE,
    filemode='a',
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
handler = RotatingFileHandler(LOG_FILE,maxBytes=1000000)
logger.addHandler(handler)

def main():
    target, command, notify_address, wait = get_args(argv)
    logger.info('Checking status of %s every %d minutes.' % (target, wait))
    logger.info('Running %s and sending output to %s when online.' % (command, notify_address))

从get_args()返回的变量都是字符串,即使wait是一个数字。

请注意,我在IDE或运行时没有收到任何错误。

我在日志文件中输出的输出:

2015-02-12 16:26:27,483 - INFO - Checking status of <ip address> every 30 minutes.
Running <arbitrary bash command string> and sending output to <my email address> when online.
2015-02-12 16:26:27,483 - INFO - Running <arbitrary bash command string> and sending output to <my email address> when online.

是什么导致第二个logger.info()打印两次,并且只能正确格式化一次?

我有另一个完美记录的脚本,不知道我在这里做了什么。 (复制/粘贴日志设置部分是安全的)

1 个答案:

答案 0 :(得分:1)

您是否在代码的不同级别使用记录器?听起来好像日志消息可能向上传播。尝试添加

logger.propagate = False
添加处理程序后

。您可以查看python文档以获取更详细的解释here,但下面的相关文字听起来与您所看到的完全相同。

  

注意如果将处理程序附加到记录器及其一个或多个祖先,它可能会多次发出相同的记录。通常,您不需要将处理程序附加到多个记录器 - 如果您只是将其附加到记录器层次结构中最高的相应记录器,那么它将看到所有后代记录器记录的所有事件,前提是它们的传播设置左侧设置为True。一种常见的情况是仅将处理程序附加到根记录器,并让传播处理其余部分。