python - 为什么 RotatingFileHandler 附加到旧文件?

标签 python logging

我有一个很好的日志记录设置,可以在文件中创建详细的调试日志,同时将干净的信息日志记录显示到标准输出。我想将旋转日志混合在一起,所以我查看了这个建议: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 - 根 - 信息 - 新日志!

编辑:由约翰·安德森指导修复:

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!')

最佳答案

约翰·安德森(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!')

关于python - 为什么 RotatingFileHandler 附加到旧文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873439/

相关文章:

haskell - 难以通过 UTF8Builder 为 RIO.Logger 编写日志消息

ruby-on-rails - 在 Ruby 中,如何配置使用 Logger 轮换日志时使用的后缀?

python - 类型错误 : 'encoding' is an invalid keyword argument for this function

python - 在 python 2.3 上,Windows 执行具有多个参数和路径空格的程序(如 ghostscript)的最佳方法是什么?

python - 如何将嵌套列表作为输入?

python - Pandas 范围内的频率表

python - Plotly - 在 createtd 跟踪后更新子图标题

.net - 记录所有使用的 DLL 的版本

java - Apache Tomcat 日志记录默认权限

java - Log4J:我可以在运行时启用/禁用类的日志记录吗?