【问题标题】:Python logging:Python 日志记录:
【发布时间】:2017-01-06 09:26:39
【问题描述】:

在 Linux 上有一个 python tornado 程序运行。最近,我发现了一个错误(可能不是)。一些导入操作记录将被记录到名为“dagger.log”的文件中。

由于 logging.handler.RotatingFileHandler ,当日志文件的长度接近 maxBytes 时,系统会依次创建 与基本文件具有相同路径名的新文件,但附加了扩展名“.1”、“.2”等。例如,如果 backupCount 为 8,基本文件名为“app.log”,您将获得“dagger.log”、“dagger.log.1”、“dagger.log.2”、... 到“匕首.log.8”。

但我发现log file on Linux, picture

dagger.log.[1-8]dagger.log 于 1 月 4 日 13:11 创建,dagger.log.[1-8 ] 最后一次修改是在 1 月 4 日将近 13:31。这是不正常的。由于文件 dagger.log 未达到最大大小,因此不应创建 dagger.log.[1-8]。更重要的是,每个日志文件都是不同的。他们根本没有相同的记录。

困扰了我很长时间,我无法解决。有人可以帮助我吗? 原谅我糟糕的英语。我不知道你能理解我的问题吗?

【问题讨论】:

  • 您是否有理由需要自己处理日志文件(例如,在非常受限的环境中运行)?如果没有,您为什么不直接写入标准输出,使用 systemd 或 upstart 或其他东西运行您的服务,然后让他们处理写入日志。或者,您可以创建一个 logrotate 配置文件并让它轮换您的日志。
  • 非常感谢您的建议~

标签: python linux logging tornado


【解决方案1】:

您是否正在运行多个进程(使用tornado.process.fork_processes(8)tornado.httpserver.HTTPServer.start(8)?使用多个进程进行日志记录可能会很棘手。分叉的进程可能开始共享同一个日志文件,然后在轮换时每个进程都会轮换独立,创建 8 个新文件。

解决方案是在您启动子进程之前不配置日志记录,并为每个进程提供自己的日志文件名(或者,如 grepe 建议的那样,只需登录到 stdout/stderr 并让一些外部进程处理文件和旋转)。我建议为此使用外部进程管理器和负载平衡器,但如果您仍想从 Tornado 应用程序中分叉子进程,它看起来像这样(从 HTTPServer 初始化的"advanced multi-process" 变体开始):

sockets = tornado.netutil.bind_sockets(8888)
task_id = tornado.process.fork_processes(0)
configure_logging('dagger%d.log' % task_id)
server = HTTPServer(app)
server.add_sockets(sockets)
IOLoop.current().start()

【讨论】:

  • 非常感谢您的回答。我在 8 个端口上运行程序侦听。因此,当需要轮换时,每个进程将独立轮换,创建 8 个新文件。也许我需要自己处理日志文件。而现在让我感到困惑的是,所有的日志在五天前都写入了一个日志,但现在这些日志被写入了 8 个不同的日志文件。通常,它应该写入一个文件。这很棘手。可能也和多进程有关。
  • 大声笑~我解决了这个问题。重启服务器后,所有日志都写入一个文件。
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2017-06-04
  • 2011-10-23
  • 2013-06-12
相关资源
最近更新 更多