【问题标题】:Handling logs in multiprocess tornado apps处理多进程龙卷风应用程序中的日志
【发布时间】:2022-06-16 00:01:01
【问题描述】:
### Start 4 subprocesses ###
server = tornado.httpserver.HTTPServer(app)
server.bind(8000)
server.start(4) # 4 subprocesses
 
### Logger using TimeRotatingFileHandler within each app ###
timefilehandler = logging.handlers.TimedRotatingFileHandler(
    filename=os.path.join(dirname, logname + '.log'),
    when='MIDNIGHT',
    interval=1,
    encoding='utf-8'
)

将 tornado 与多个子进程和记录器一起使用会导致多个记录文件的下标如下(如果使用文件名作为记录名称):

service_0.log
service_1.log
service_2.log
service_3.log

是否可以让所有子进程写入到龙卷风中的一个地方?或者如果使用一些日志聚合工具来处理麻烦,因为逐个检查日志非常不方便,有什么想法吗?提前致谢。

【问题讨论】:

  • 没有从多个进程记录到单个文件的标准方法。建议的解决方案是将日志条目发送到通过QueueHandler 写入文件的单个进程,或者设置一个服务器,该服务器从SocketHandler 获取原始套接字连接或通过HTTPHandler 获取http 请求。 docs.python.org/3/howto/logging-cookbook.html
  • 这不是您的情况的确切描述,但我认为这应该是一个很好的建议:"Deploying Web applications using Gunicorn and uWSGI"
  • @Aaron 谢谢,QueueHandler 是个好建议,我会调查的。我们没有在 wsgi 后面部署应用程序,因为我们可能需要提供一些异步功能 tornado。
  • 为 Gunicorn 和 uWSGI 提供的建议可以应用于任何网络服务器。它只是解释了使用简单的套接字服务器来接受来自SocketHandler 的日志记录。

标签: python logging multiprocessing tornado


【解决方案1】:

您不能让不同的(子)进程写入单个文件 - 如果您想解决这个问题,您应该使用日志聚合器,其中不同的龙卷风服务器记录到一个公共端点(在云中或本地)。如果您不倾向于使用第三方解决方案,您可以在 Tornado 中编写一个。

查看https://docs.python.org/3/library/logging.handlers.html,看看有没有你喜欢的。

或者您可以同时 grep 4 个文件。

附言不建议在生产环境中使用使用子进程的 IIRC,因此我建议您使用不同的端口运行 4 个进程,并在日志名称中也使用端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多