Python的logging
库是否提供将两个(或更多)独立的Python进程记录到同一文件中的序列化日志记录?从文档中并不清楚(我已阅读过)。
如果可以,那么在完全不同的机器上呢(共享日志文件存在于可以被两者访问的NFS导出中)。
Python的logging
库是否提供将两个(或更多)独立的Python进程记录到同一文件中的序列化日志记录?从文档中并不清楚(我已阅读过)。
如果可以,那么在完全不同的机器上呢(共享日志文件存在于可以被两者访问的NFS导出中)。
不支持同时从多个进程向同一文件写入日志。根据Python的logging cookbook:
虽然日志记录是线程安全的,并且在单个进程中从多个线程向单个文件记录日志是受支持的,但不支持从多个进程向单个文件记录日志,因为在Python中没有标准的方法来序列化跨多个进程对单个文件的访问。
之后,该手册建议使用一个单独的套接字服务器进程来处理日志,其他进程将日志消息发送到该进程。在Sending and Receiving logging events across a network部分中有一个可行的示例。
解决这个问题的一个糟糕方法是创建一个日志记录进程,该进程在单个线程上侦听套接字,并输出其接收到的任何内容。
关键在于利用套接字队列作为仲裁机制。
#! /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
任何给定进程的每个日志条目都将被原子地发出。将其添加到标准日志系统中不应该太难。使用套接字意味着多台机器也可以针对托管在专用机器上的单个日志。