Skip to content

Commit d4df83e

Browse files
feat: allow loggingHandler to use Formatters
1 parent cb637c2 commit d4df83e

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

influxdb_client/client/loggingHandler.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class InfluxLoggingHandler(logging.Handler):
1212
The raw input will be passed on to the influx write api.
1313
"""
1414

15-
DEFAULT_LOG_RECORD_KEYS = logging.makeLogRecord({}).__dict__.keys()
15+
DEFAULT_LOG_RECORD_KEYS = list(logging.makeLogRecord({}).__dict__.keys()) + ['message']
1616

1717
def __init__(self, *, url, token, org, bucket, client_args=None, write_api_args=None):
1818
"""
@@ -44,8 +44,9 @@ def close(self) -> None:
4444
def emit(self, record: logging.LogRecord) -> None:
4545
"""Emit a record via the influxDB WriteApi."""
4646
try:
47+
message = self.format(record)
4748
extra = self._get_extra_values(record)
48-
return self.write_api.write(record=record.msg, **extra)
49+
return self.write_api.write(record=message, **extra)
4950
except (KeyboardInterrupt, SystemExit):
5051
raise
5152
except (Exception,):
@@ -57,8 +58,7 @@ def _get_extra_values(self, record: logging.LogRecord) -> dict:
5758
5859
Example: `logging.debug(msg, extra={key: value, ...})`.
5960
"""
60-
extra = {key: value
61-
for key, value in record.__dict__.items() if key not in self.DEFAULT_LOG_RECORD_KEYS}
62-
if 'bucket' not in extra.keys():
63-
extra['bucket'] = self.bucket
61+
extra = {'bucket': self.bucket}
62+
extra.update({key: value for key, value in record.__dict__.items()
63+
if key not in self.DEFAULT_LOG_RECORD_KEYS})
6464
return extra

tests/test_loggingHandler.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def test_can_log_str(self):
9595
def test_can_log_points(self):
9696
point = Point("measurement").field("field_name", "field_value").time(333, WritePrecision.NS)
9797
self.logger.debug(point)
98-
self.mock_write_api.write.assert_called_once_with(bucket="my-bucket", record=point)
98+
self.mock_write_api.write.assert_called_once_with(bucket="my-bucket", record=str(point))
9999

100100
def test_catches_urllib_exceptions(self):
101101
self.mock_write_api.write.side_effect = urllib3.exceptions.HTTPError()
@@ -132,6 +132,18 @@ def test_can_pass_optional_params_on_log(self):
132132
write_precision=WritePrecision.S,
133133
arg3=3, arg2="two")
134134

135+
def test_formatter(self):
136+
class MyFormatter(logging.Formatter):
137+
def format(self, record: logging.LogRecord) -> str:
138+
time_ns = int(record.created * 1e9) * 0 + 123
139+
return f"{record.name},level={record.levelname} message=\"{record.msg}\" {time_ns}"
140+
141+
self.handler.setFormatter(MyFormatter())
142+
msg = "a debug message"
143+
self.logger.debug(msg)
144+
expected_record = f"test-logger,level=DEBUG message=\"{msg}\" 123"
145+
self.mock_write_api.write.assert_called_once_with(bucket="my-bucket", record=expected_record)
146+
135147

136148
if __name__ == "__main__":
137149
unittest.main()

0 commit comments

Comments
 (0)