Radek Novacek 375cedb
commit af7d47978d6e141ca01e925fce02aa73a14baf69
Radek Novacek 375cedb
Author: Radek Novacek <rnovacek@redhat.com>
Radek Novacek 375cedb
Date:   Tue Nov 27 12:35:33 2012 +0100
Radek Novacek 375cedb
Radek Novacek 375cedb
    Use journal for logging when available
Radek Novacek 375cedb
Radek Novacek 375cedb
diff --git a/log.py b/log.py
Radek Novacek 375cedb
index e415001..bc85544 100644
Radek Novacek 375cedb
--- a/log.py
Radek Novacek 375cedb
+++ b/log.py
Radek Novacek 375cedb
@@ -24,6 +24,40 @@ import logging.handlers
Radek Novacek 375cedb
 import os
Radek Novacek 375cedb
 import sys
Radek Novacek 375cedb
 
Radek Novacek 375cedb
+journalEnabled = False
Radek Novacek 375cedb
+try:
Radek Novacek 375cedb
+    from systemd import journal
Radek Novacek 375cedb
+    journalEnabled = True
Radek Novacek 375cedb
+except ImportError:
Radek Novacek 375cedb
+    pass
Radek Novacek 375cedb
+
Radek Novacek 375cedb
+class NoExceptionFormatter(logging.Formatter):
Radek Novacek 375cedb
+    def format(self, record):
Radek Novacek 375cedb
+        if record.exc_info is not None:
Radek Novacek 375cedb
+            record.exc_text = "\t" + str(record.exc_info[1])
Radek Novacek 375cedb
+        return logging.Formatter.format(self, record)
Radek Novacek 375cedb
+
Radek Novacek 375cedb
+class JournalHandler(logging.Handler):
Radek Novacek 375cedb
+    def __init__(self, level=logging.NOTSET):
Radek Novacek 375cedb
+        logging.Handler.__init__(self, level)
Radek Novacek 375cedb
+
Radek Novacek 375cedb
+    def emit(self, record):
Radek Novacek 375cedb
+        if journalEnabled:
Radek Novacek 375cedb
+            try:
Radek Novacek 375cedb
+                msg = self.format(record)
Radek Novacek 375cedb
+                args = ['MESSAGE=' + record.message,
Radek Novacek 375cedb
+                        'LOGGER=' + record.name,
Radek Novacek 375cedb
+                        'THREAD_NAME=' + record.threadName,
Radek Novacek 375cedb
+                        'CODE_FILE=' + record.pathname,
Radek Novacek 375cedb
+                        'CODE_LINE=%d' % record.lineno,
Radek Novacek 375cedb
+                        'CODE_FUNC=' + record.funcName]
Radek Novacek 375cedb
+
Radek Novacek 375cedb
+                journal.sendv(*args)
Radek Novacek 375cedb
+            except (KeyboardInterrupt, SystemExit):
Radek Novacek 375cedb
+                raise
Radek Novacek 375cedb
+            except:
Radek Novacek 375cedb
+                self.handleError(record)
Radek Novacek 375cedb
+
Radek Novacek 375cedb
 def getLogger(debug, background):
Radek Novacek 375cedb
     logger = logging.getLogger("rhsm-app")
Radek Novacek 375cedb
     logger.setLevel(logging.DEBUG)
Radek Novacek 375cedb
@@ -56,10 +90,21 @@ def getLogger(debug, background):
Radek Novacek 375cedb
             streamHandler.setLevel(logging.WARNING)
Radek Novacek 375cedb
 
Radek Novacek 375cedb
             # Don't print exceptions to stdout in non-debug mode
Radek Novacek 375cedb
-            f = logging.Filter()
Radek Novacek 375cedb
-            f.filter = lambda record: record.exc_info is None
Radek Novacek 375cedb
-            streamHandler.addFilter(f)
Radek Novacek 375cedb
+            streamHandler.setFormatter(NoExceptionFormatter())
Radek Novacek 375cedb
+
Radek Novacek 375cedb
 
Radek Novacek 375cedb
         logger.addHandler(streamHandler)
Radek Novacek 375cedb
 
Radek Novacek 375cedb
+    if os.getppid() == 1:
Radek Novacek 375cedb
+        # Also log to journal if available
Radek Novacek 375cedb
+        journalHandler = JournalHandler()
Radek Novacek 375cedb
+        if debug:
Radek Novacek 375cedb
+            journalHandler.setLevel(logging.DEBUG)
Radek Novacek 375cedb
+        else:
Radek Novacek 375cedb
+            journalHandler.setLevel(logging.WARNING)
Radek Novacek 375cedb
+
Radek Novacek 375cedb
+            # Don't print exceptions to journal in non-debug mode
Radek Novacek 375cedb
+            journalHandler.setFormatter(NoExceptionFormatter())
Radek Novacek 375cedb
+
Radek Novacek 375cedb
+        logger.addHandler(journalHandler)
Radek Novacek 375cedb
     return logger