Browse Source

Add missing SYSLOG_FACILITY to JournalHandler

Without SYSLOG_FACILITY log messages from journald forwards the message
to kern.log. This seems to be default behaviour as it treats the message
as kernel message.

This option provides a proper facility to the log message and kern.log
will not be filled up anymore.

Cherry-picked from commit 5b12e66f62
Cherry-picked from commit 82751ce2a2
Cherry-picked from commit 911a45401c
Change-Id: I62a32ed46a400b62ead8c1e6e64acee658e2a769
Closes-Bug: #1871840
tags/3.42.4^0
Benjamin Reichel 4 months ago
parent
commit
19fd9a2e2a
4 changed files with 29 additions and 8 deletions
  1. +12
    -4
      oslo_log/handlers.py
  2. +4
    -2
      oslo_log/log.py
  3. +6
    -2
      oslo_log/tests/unit/test_log.py
  4. +7
    -0
      releasenotes/notes/add-facility-to-journal-e10bf7002cc19dd3.yaml

+ 12
- 4
oslo_log/handlers.py View File

@@ -107,13 +107,20 @@ class OSJournalHandler(logging.Handler):
'request_id',
)

def __init__(self):
# Do not use super() unless type(logging.Handler) is 'type'
# (i.e. >= Python 2.7).
def __init__(self, facility):
if not journal:
raise RuntimeError("Systemd bindings do not exist")

if not facility:
if not syslog:
raise RuntimeError("syslog is not available on this platform")
facility = syslog.LOG_USER

# Do not use super() unless type(logging.Handler) is 'type'
# (i.e. >= Python 2.7).
logging.Handler.__init__(self)
self.binary_name = _get_binary_name()
self.facility = facility

def emit(self, record):
priority = SYSLOG_MAP.get(record.levelname, 7)
@@ -128,7 +135,8 @@ class OSJournalHandler(logging.Handler):
'LOGGER_NAME': record.name,
'LOGGER_LEVEL': record.levelname,
'SYSLOG_IDENTIFIER': self.binary_name,
'PRIORITY': priority
'PRIORITY': priority,
'SYSLOG_FACILITY': self.facility,
}

if record.exc_info:


+ 4
- 2
oslo_log/log.py View File

@@ -388,7 +388,10 @@ def _setup_logging_from_conf(conf, project, version):
log_root.addHandler(streamlog)

if conf.use_journal:
journal = handlers.OSJournalHandler()
if syslog is None:
raise RuntimeError("syslog is not available on this platform")
facility = _find_facility(conf.syslog_log_facility)
journal = handlers.OSJournalHandler(facility=facility)
log_root.addHandler(journal)

if conf.use_eventlog:
@@ -413,7 +416,6 @@ def _setup_logging_from_conf(conf, project, version):
log_root.addHandler(handler)

if conf.use_syslog:
global syslog
if syslog is None:
raise RuntimeError("syslog is not available on this platform")
facility = _find_facility(conf.syslog_log_facility)


+ 6
- 2
oslo_log/tests/unit/test_log.py View File

@@ -403,6 +403,7 @@ class OSJournalHandlerTestCase(BaseTestCase):
mock.call(mock.ANY, CODE_FILE=mock.ANY, CODE_FUNC='test_emit',
CODE_LINE=mock.ANY, LOGGER_LEVEL='INFO',
LOGGER_NAME='nova-test.foo', PRIORITY=6,
SYSLOG_FACILITY=syslog.LOG_USER,
SYSLOG_IDENTIFIER=mock.ANY,
REQUEST_ID=mock.ANY,
PROJECT_NAME='mytenant',
@@ -415,7 +416,8 @@ class OSJournalHandlerTestCase(BaseTestCase):
self.assertIsInstance(args[0], six.string_types)
self.assertIsInstance(kwargs['CODE_LINE'], int)
self.assertIsInstance(kwargs['PRIORITY'], int)
del kwargs['CODE_LINE'], kwargs['PRIORITY']
self.assertIsInstance(kwargs['SYSLOG_FACILITY'], int)
del kwargs['CODE_LINE'], kwargs['PRIORITY'], kwargs['SYSLOG_FACILITY']
for key, arg in kwargs.items():
self.assertIsInstance(key, six.string_types)
self.assertIsInstance(arg, six.string_types + (six.binary_type,))
@@ -432,6 +434,7 @@ class OSJournalHandlerTestCase(BaseTestCase):
CODE_FUNC='test_emit_exception',
CODE_LINE=mock.ANY, LOGGER_LEVEL='ERROR',
LOGGER_NAME='nova-exception.foo', PRIORITY=3,
SYSLOG_FACILITY=syslog.LOG_USER,
SYSLOG_IDENTIFIER=mock.ANY,
REQUEST_ID=mock.ANY,
EXCEPTION_INFO=mock.ANY,
@@ -446,7 +449,8 @@ class OSJournalHandlerTestCase(BaseTestCase):
self.assertIsInstance(args[0], six.string_types)
self.assertIsInstance(kwargs['CODE_LINE'], int)
self.assertIsInstance(kwargs['PRIORITY'], int)
del kwargs['CODE_LINE'], kwargs['PRIORITY']
self.assertIsInstance(kwargs['SYSLOG_FACILITY'], int)
del kwargs['CODE_LINE'], kwargs['PRIORITY'], kwargs['SYSLOG_FACILITY']
for key, arg in kwargs.items():
self.assertIsInstance(key, six.string_types)
self.assertIsInstance(arg, six.string_types + (six.binary_type,))


+ 7
- 0
releasenotes/notes/add-facility-to-journal-e10bf7002cc19dd3.yaml View File

@@ -0,0 +1,7 @@
---
fixes:
- |
Using systemd journal handler, logs ending up in kern.log because
SYSLOG_FACILITY is missing. This fix uses the same facility configuration
option 'syslog-log-facility' as from syslog handler to provide the
missing value. (Bug #1871840)

Loading…
Cancel
Save