commit d27ec26c8f6bac53db63a9345db15872fb8a9d30
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Fri Oct 12 12:51:08 2012 +0200
LoggingHandler: add a new handler
This patch adds a new handler that is used for storing logged messages
so that they can be retrieved later.
It also replases the ServerHandler that was used by the slave machines
to send logs to the controller.
For now the Server handler can stay as I don't know if it might come in
handy later.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
Common/LoggingHandler.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++
Common/Logs.py | 10 ++++++--
2 files changed, 58 insertions(+), 3 deletions(-)
---
diff --git a/Common/LoggingHandler.py b/Common/LoggingHandler.py
index 9b08f9d..cfcacb3 100644
--- a/Common/LoggingHandler.py
+++ b/Common/LoggingHandler.py
@@ -1,4 +1,11 @@
"""
+Custom logging handlers we use.
+
+LogBuffer
+Handler used solely for temporarily storing messages so that they can be
+retrieved later.
+
+ServerHandler
Server-like logging handler.
Stores logged messages in a buffer. Every time a new message is emitted it
checks for incoming connections. If a connection is established it flushes the
@@ -15,9 +22,53 @@ olichtne(a)redhat.com (Ondrej Lichtner)
import socket, struct, pickle
import logging
+import xmlrpclib
DEFAULT_LOG_PORT = 9998
+class LogBuffer(logging.Handler):
+ """
+ Handler used for buffering log messages. Compared to the BufferingHandler
+ defined in Python it doesn't have a capacity. It is intended to be used
+ solely as a temporary storage of logged messages so that they can be later
+ retrieved.
+ """
+ def __init__(self):
+ logging.Handler.__init__(self)
+ self.buffer = []
+
+ def makePickle(self, record):
+ """
+ Pickles the record in binary format with a length prefix, and
+ returns it ready for transmission across the socket.
+
+ Function taken from class SocketHandler from standard python
+ library logging.handlers
+ """
+ d = dict(record.__dict__)
+ d['msg'] = record.getMessage()
+ d['args'] = None
+ d['exc_info'] = None
+ s = pickle.dumps(d, 1)
+ return xmlrpclib.Binary(s)
+
+ def emit(self, record):
+ s = self.makePickle(record)
+ self.buffer.append(s)
+
+ def flush(self):
+ self.acquire()
+
+ buf = list(self.buffer)
+ self.buffer = []
+
+ self.release()
+ return buf
+
+ def close(self):
+ self.flush()
+ logging.Handler.close(self)
+
class ServerHandler(logging.Handler):
def __init__(self, port=DEFAULT_LOG_PORT):
logging.Handler.__init__(self)
diff --git a/Common/Logs.py b/Common/Logs.py
index 85099d4..0badfe5 100644
--- a/Common/Logs.py
+++ b/Common/Logs.py
@@ -13,7 +13,7 @@ import os, sys, shutil, datetime
from logging import Formatter
import logging.handlers
import traceback
-from Common.LoggingHandler import ServerHandler
+from Common.LoggingHandler import ServerHandler, LogBuffer
LOCAL_IP = "(127.0.0.1)"
@@ -267,6 +267,9 @@ class Logs:
def get_logging_root_path(cls):
return cls.root_path
+ @classmethod
+ def get_buffer(cls):
+ return cls.buffer
@classmethod
def prepare_logging(cls, debug=0, waitForNet=False,
@@ -290,8 +293,9 @@ class Logs:
root_logger.addHandler(display)
if waitForNet:
- server_handler = ServerHandler()
- root_logger.addHandler(server_handler)
+ handler = LogBuffer()
+ cls.buffer = handler
+ root_logger.addHandler(handler)
log_root_folder = cls.set_logging_root_path(recipe_path)
Show replies by thread