On 24/04/13 03:10, Zbigniew Jędrzejewski-Szmek wrote:
Arbitrary fields can be attached at the level of the handler,
and they'll be sent with all messages from this handler.

This facility is used to attach SYSLOG_IDENTIFIER to all messages,
since otherwise journald attaches SYSLOG_IDENTIFIER=python or
something similar, which is completely useless.
---
This is part (a) in my email. I think it can go in as is,
independently of other potential improvements.

Zbyszek

Like it. I'm particularly keen to see (c) implemented as well, so I went and had a stab at it. I can now see your point Marti about the python logging module not being the easiest to work with without getting ugly very quickly :)

I thought I'd share my hacking about for interest. Works by:
    import logging, sys
    from systemd import journal
    logging.setLoggerClass(journal.JournalLogger)

    log = logging.getLogger("mylogger")
    log.addHandler(journal.JournalHandler(TEST_FIELD="Default"))
    log.addHandler(logging.StreamHandler(sys.stdout))

    log.warn("Message1")
    log.warn("Message2", systemd_fields={"TEST_FIELD2": "Value"})
    log.warn("Message3", systemd_fields={"TEST_FIELD": "Not Default"})

diff --git a/src/python-systemd/journal.py b/src/python-systemd/journal.py
index 7d42525..6a3ad36 100644
--- a/src/python-systemd/journal.py
+++ b/src/python-systemd/journal.py
@@ -437,6 +437,17 @@ def stream(identifier, priority=LOG_DEBUG, level_prefix=False):
         fd = stream_fd(identifier, priority, level_prefix)
         return _os.fdopen(fd, 'w', 1)

+class JournalLogger(_logging.Logger):
+
+    def _log(self, *args, **kwargs):
+        self._systemd_fields = kwargs.pop("systemd_fields", dict())
+        super(JournalLogger, self)._log(*args, **kwargs)
+
+    def makeRecord(self, *args, **kwargs):
+        rv = super(JournalLogger, self).makeRecord(*args, **kwargs)
+        rv.__dict__["systemd-fields"] = self._systemd_fields
+        return rv
+
 class JournalHandler(_logging.Handler):
         """Journal handler class for the Python logging framework.

@@ -508,6 +519,8 @@ class JournalHandler(_logging.Handler):
                         msg = self.format(record)
                         pri = self.mapPriority(record.levelno)
                         mid = getattr(record, 'MESSAGE_ID', None)
+                        extra = self._extra.copy()
+ extra.update(getattr(record, 'systemd-fields', dict()))
                         send(msg,
                              MESSAGE_ID=mid,
                              PRIORITY=format(pri),
@@ -516,7 +529,7 @@ class JournalHandler(_logging.Handler):
                              CODE_FILE=record.pathname,
                              CODE_LINE=record.lineno,
                              CODE_FUNC=record.funcName,
-                             **self._extra)
+                             **extra)
                 except Exception:
                         self.handleError(record)


--
Steven Hiscocks
_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to