【问题标题】:Why RotatingFileHandler is appending to old file?为什么 RotatingFileHandler 附加到旧文件?
【发布时间】:2019-02-25 19:34:03
【问题描述】:

我有一个很好的日志记录设置,我在其中将详细的调试日志创建到文件中,同时将干净的信息记录显示到标准输出。我想获得 Rotating log in the mix,所以我查看了这个建议:stack post,(这正是我想要的)。问题是,我遇到了与other stack post 类似的问题。谁能回答为什么在我的代码调用“doRollover()”之后,日志仍然被写入 logtest.log.1?

#logtest
import sys, os, time, logging, logging.handlers

log_file = r'/logs/test/logtest.log'

needRoll = os.path.isfile(log_file)
rotater=logging.handlers.RotatingFileHandler(log_file, backupCount=5)

log = logging.getLogger()
logging.basicConfig(
    filename=log_file,
    level='DEBUG',
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    handlers=[rotater])
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.INFO)
log.addHandler(stdout_handler)

if needRoll:
    log.debug("Log closed on %s." %time.asctime())
    rotater.doRollover()

log.info('New Log!')

结果:

logtest.log = {空}

logtest.log.1 =
2019-02-25 14:15:01,372 - 根 - 调试 - 日志于 2019 年 2 月 25 日星期一 14:15:01 关闭。
2019-02-25 14:15:01,381 - 根 - 信息 - 新日志!

编辑:John Anderson 指导的修复:

log_file = r'/logs/test/logtest.log'
needRoll = os.path.isfile(log_file)

log = logging.getLogger()
log.setLevel(logging.DEBUG)

rotater=logging.handlers.RotatingFileHandler(log_file, backupCount=5)
rotater.setLevel(logging.DEBUG)
rotater.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
log.addHandler(rotater)

stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.INFO)
log.addHandler(stdout_handler)

if needRoll:
    log.debug("Log closed for next run on %s." %time.asctime())
    rotater.doRollover()

log.info('New Log!')

【问题讨论】:

  • 当我尝试运行你的代码时,我得到了ValueError: 'stream' or 'filename' should not be specified together with 'handlers'
  • 在删除 filename=log_file, 行并删除 log_file = r'/logs/test/logtest.log' 中的前导 / 之后,您的代码在 Ubuntu 18.04 上的 Python 3.6.7 上按预期工作。您使用的是什么版本的Python,您的OS 是什么版本?
  • 感谢 John Anderson 将我指向 filename=log_file。我在 linux docker 容器中使用 python 2.7。我在不使用 logging.basicConfig() 的情况下重写了记录器配置并得到了预期的结果。

标签: python logging


【解决方案1】:

John Anderson 通过向我展示在 basicConfig() 函数中设置文件名可能会导致问题,为我指明了正确的方向。我重写了没有它的日志记录,它工作正常。

log_file = r'/logs/test/logtest.log'
needRoll = os.path.isfile(log_file)

log = logging.getLogger()
log.setLevel(logging.DEBUG)

rotater=logging.handlers.RotatingFileHandler(log_file, backupCount=5)
rotater.setLevel(logging.DEBUG)
rotater.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
log.addHandler(rotater)

stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.INFO)
log.addHandler(stdout_handler)

if needRoll:
    log.debug("Log closed for next run on %s." %time.asctime())
    rotater.doRollover()

log.info('New Log!')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多