<p>解决这个问题的一个糟糕的解决方案是创建一个日志进程,它监听一个套接字,监听一个线程,只输出它接收到的任何内容</p>
<p>关键是劫持套接字队列作为仲裁机制。</p>
<pre><code>#! /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()
</code></pre>
<p>为了测试它:</p>
<pre><code>#! /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()
</code></pre>
<p>然后像这样使用:</p>
<pre><code>stdbuf -o L ./logger.py -b 10 -s 4096 >>logger.log 2>&1 &
</code></pre>
<p>并通过以下方式监视最近的活动:</p>
<pre><code>tail -f logger.log
</code></pre>
<p>任何给定进程中的每个日志条目都将以原子方式发出。将其添加到标准日志系统中不应该太难。使用套接字意味着多台计算机还可以针对一个日志,该日志托管在专用计算机上。</p>