Skip to content

Commit

Permalink
feat: allow loggingHandler to use Formatters
Browse files Browse the repository at this point in the history
  • Loading branch information
strom-und-spiele committed Feb 17, 2022
1 parent cb637c2 commit d4df83e
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 7 deletions.
12 changes: 6 additions & 6 deletions influxdb_client/client/loggingHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class InfluxLoggingHandler(logging.Handler):
The raw input will be passed on to the influx write api.
"""

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

def __init__(self, *, url, token, org, bucket, client_args=None, write_api_args=None):
"""
Expand Down Expand Up @@ -44,8 +44,9 @@ def close(self) -> None:
def emit(self, record: logging.LogRecord) -> None:
"""Emit a record via the influxDB WriteApi."""
try:
message = self.format(record)
extra = self._get_extra_values(record)
return self.write_api.write(record=record.msg, **extra)
return self.write_api.write(record=message, **extra)
except (KeyboardInterrupt, SystemExit):
raise
except (Exception,):
Expand All @@ -57,8 +58,7 @@ def _get_extra_values(self, record: logging.LogRecord) -> dict:
Example: `logging.debug(msg, extra={key: value, ...})`.
"""
extra = {key: value
for key, value in record.__dict__.items() if key not in self.DEFAULT_LOG_RECORD_KEYS}
if 'bucket' not in extra.keys():
extra['bucket'] = self.bucket
extra = {'bucket': self.bucket}
extra.update({key: value for key, value in record.__dict__.items()
if key not in self.DEFAULT_LOG_RECORD_KEYS})
return extra
14 changes: 13 additions & 1 deletion tests/test_loggingHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def test_can_log_str(self):
def test_can_log_points(self):
point = Point("measurement").field("field_name", "field_value").time(333, WritePrecision.NS)
self.logger.debug(point)
self.mock_write_api.write.assert_called_once_with(bucket="my-bucket", record=point)
self.mock_write_api.write.assert_called_once_with(bucket="my-bucket", record=str(point))

def test_catches_urllib_exceptions(self):
self.mock_write_api.write.side_effect = urllib3.exceptions.HTTPError()
Expand Down Expand Up @@ -132,6 +132,18 @@ def test_can_pass_optional_params_on_log(self):
write_precision=WritePrecision.S,
arg3=3, arg2="two")

def test_formatter(self):
class MyFormatter(logging.Formatter):
def format(self, record: logging.LogRecord) -> str:
time_ns = int(record.created * 1e9) * 0 + 123
return f"{record.name},level={record.levelname} message=\"{record.msg}\" {time_ns}"

self.handler.setFormatter(MyFormatter())
msg = "a debug message"
self.logger.debug(msg)
expected_record = f"test-logger,level=DEBUG message=\"{msg}\" 123"
self.mock_write_api.write.assert_called_once_with(bucket="my-bucket", record=expected_record)


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

0 comments on commit d4df83e

Please sign in to comment.