Python 的logging
库是否为两个(或更多)单独的 python 进程记录到同一个文件提供序列化日志记录?从文档(我已阅读)中似乎不清楚。
如果是这样,那么在完全不同的机器上呢(共享日志文件将存在于两者都可以访问的 NFS 导出上)。
Python 的logging
库是否为两个(或更多)单独的 python 进程记录到同一个文件提供序列化日志记录?从文档(我已阅读)中似乎不清楚。
如果是这样,那么在完全不同的机器上呢(共享日志文件将存在于两者都可以访问的 NFS 导出上)。
不,不支持。从 python日志记录食谱:
虽然日志记录是线程安全的,并且支持在单个进程中从多个线程记录到单个文件,但不支持从多个进程记录到单个文件,因为没有标准方法可以跨多个进程序列化对单个文件的访问Python 中的进程。
之后,食谱建议使用单个套接字服务器进程来处理日志和向其发送日志消息的其他进程。在通过网络发送和接收日志事件部分中有一个这种方法的工作示例。
解决这个问题的一个糟糕的解决方案是创建一个日志进程,它在单个线程上侦听套接字,它只输出它接收到的任何内容
关键是劫持套接字队列作为仲裁机制。
#! /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
任何给定进程的每个日志条目都将自动发出。将其添加到标准日志记录系统中应该不会太难。使用套接字意味着多台机器也可以针对单个日志,托管在专用机器上。
最简单的方法是使用自定义处理程序进行日志记录,它将所有带有队列的日志从子进程传递到主进程,并在那里记录它。以这种方式,例如在您拥有主 UI 线程和工作线程的客户端应用程序上工作日志记录。
同样在 POSIX 系统上,您可以在附加模式下使用日志记录。最多 4kb 它将是原子的。