Python:单独的进程记录到同一个文件?

时间:2013-02-26 18:03:14

标签: python multithreading logging nfs

Python的logging库是否为两个(或更多)单独的python进程记录到同一个文件提供了序列化日志记录?从文档中可以看出这一点(我已经阅读过)。

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

3 个答案:

答案 0 :(得分:14)

不,不支持。来自python logging cookbook

  

虽然日志记录是线程安全的,但是从日志记录到单个文件   支持单个进程中的多个线程,记录到单个进程   不支持来自多个进程的文件,因为没有   跨多个序列化对单个文件的访问的标准方法   Python中的流程。

之后,该手册建议使用单个套接字服务器进程来处理日志,其他进程向其发送日志消息。 这个应用程序的一个工作示例在Sending and Receiving logging events across a network部分。

答案 1 :(得分:1)

这个问题的一个棘手的解决方案是创建一个日志进程,它在单个线程上侦听套接字,只输出它接收到的任何东西

重点是将套接字队列劫持为仲裁机制。

#! /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

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

答案 2 :(得分:0)

最简单的方法是使用自定义处理程序进行日志记录,该处理程序会将带有队列的所有日志从子进程传递到主进程,并在那里进行日志记录。以这种方式,例如在您具有主UI线程和辅助线程的客户端应用程序上工作登录。

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