logging via SocketHandler and TCPserver
larry.bates at websafe.com`
Sun Jul 13 22:25:32 CEST 2008
Every time I look at the logging module (up until now) I've given up and
continue to use my home-grown logger that I've been using for years. I'm not
giving up this time ;-)
I find that I REALLY need to be able to monitor LOTS of running
programs/processes and thought it would be nice to have them use SocketHandler
logging and then I would write TCPServer to accept the log messages for
real-time monitoring. I Googled (is that now a verb?) for several hours and
came up with some code that I've turned in to something that works, but I can't
figure out how to disconnect the server once it is connected The goal is to be
able to start TCPServer, monitor the log messages sent via SocketHandler logger,
disconnect, and move to the next application. Eventually I would like to wrap a
GUI around all of this for monitoring a complex web application.
Everything works, it just appears that I get into the while loop in
LogRecordStreamHandler.handle and it never breaks out (until I kill the client).
I can't seem to do anything with the LogRecordSocketReceiver.abort attribute to
make it quit.
I'm sure it is something simple (stupid?), but I've spent about 4 hours and I'm
not getting anywhere.
Thanks in advance for any assistance.
Below is my code:
if sys.argv == 'client':
logger = logging.getLogger("VESconsole")
elif sys.argv == 'server':
"""Handler for a streaming logging request.
This basically logs the record using whatever logging policy is
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format. Logs the record
according to whatever policy is configured locally.
chunk = self.connection.recv(4)
if len(chunk) < 4:
slen = struct.unpack(">L", chunk)
chunk = self.connection.recv(slen)
while len(chunk) < slen:
chunk = chunk + self.connection.recv(slen - len(chunk))
obj = self.unPickle(chunk)
record = logging.makeLogRecord(obj)
def unPickle(self, data):
def handleLogRecord(self, record):
t = time.strftime('%a, %d %b %y %H:%M:%S',
print "%s %s" % (t, record.getMessage())
"""simple TCP socket-based logging receiver suitable for testing.
allow_reuse_address = 1
def __init__(self, host='localhost',
self.abort = 0
self.timeout = 1
self.logname = None
abort = 0
while not abort:
rd, wr, ex = select.select([self.socket.fileno()],
abort = self.abort
print "serve_until_stopped exiting"
# Start ThreadingTCPServer instance to accept SocketHandler log
# messages from client.
tcpserver = LogRecordSocketReceiver()
print "Starting ThreadingTCPServer..."
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
More information about the Python-list