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
This commit is contained in:
Benjamin Reichel 2020-04-09 15:02:20 +02:00
parent d5589a7366
commit 19fd9a2e2a
4 changed files with 29 additions and 8 deletions

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:

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)

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,))

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)