Python:记录到同一文件的不同进程?

2024-04-28 21:59:13 发布

您现在位置:Python中文网/ 问答频道 /正文

Python的logging库是否为两个(或更多)单独的Python进程日志记录到同一个文件提供序列化日志记录?从文件(我读过)上看不清楚。

如果是,那么在完全不同的机器上呢(共享日志文件将存在于两者都可访问的NFS导出上)。


Tags: 文件机器序列化进程logging记录nfs
3条回答

最简单的方法是使用自定义的日志处理程序,它将所有带有队列的日志从子进程传递到主进程,然后在主进程中记录它。例如,以这种方式在客户机应用程序上工作日志,其中有主UI线程和工作线程。

同样在POSIX系统上,您可以使用附加模式的日志记录。高达4kb将是原子的。

解决这个问题的一个糟糕的解决方案是创建一个日志进程,它监听一个套接字,监听一个线程,只输出它接收到的任何内容

关键是劫持套接字队列作为仲裁机制。

#! /usr/bin/env python

import sys
import socket
import argparse

p = argparse.ArgumentParser()
p.add_argument("-p", "--port", help="which port to listen on", type=int)
p.add_argument("-b", "--backlog", help="accept backlog size", type=int)
p.add_argument("-s", "--buffersize", help="recv buffer size", type=int)
args = p.parse_args()

port = args.port if args.port else 1339
backlog = args.backlog if args.backlog else 5
size = args.buffersize if args.buffersize else 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', port))
s.listen(backlog)
print "Listening on port ", port, 'backlog size', backlog, 'buffer size', size, '\n'
while 1:
    try:
        (client, address) = s.accept()
        data = client.recv(size)
        print data
    except:
        client.close()

为了测试它:

#! /usr/bin/env python

import sys
import socket
import argparse

p = argparse.ArgumentParser()
p.add_argument("-p", "--port", help="send port", action='store', default=1339, type=int)
p.add_argument("text", help="text to send")
args = p.parse_args()

if not args.quit and not args.text:
    p.print_help()
else:
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('', args.port))
        s.send(args.text)
    except:
        s.close()

然后像这样使用:

stdbuf -o L ./logger.py -b 10 -s 4096 >>logger.log 2>&1 &

并通过以下方式监视最近的活动:

tail -f logger.log

任何给定进程中的每个日志条目都将以原子方式发出。将其添加到标准日志系统中不应该太难。使用套接字意味着多台计算机还可以针对一个日志,该日志托管在专用计算机上。

不,不支持。来自pythonlogging cookbook

Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported, because there is no standard way to serialize access to a single file across multiple processes in Python.

之后,cookbook建议使用单个socket服务器进程来处理日志,而其他进程则向其发送日志消息。 在Sending and Receiving logging events across a network一节中有一个这种方法的工作示例。

相关问题 更多 >