LoggerAdapter, which helps you to propagate context information
Project description
LogExtraCtx
This small humble library is for making logging extra parameters in logging a bit easier.
Rationale
I have blognote about it.
Usage
(look also into docstrings of modules and classes)
Pure python
Use getLogger
from logextractx.logger
, and then create local logger with local
context:
from logextractx.logger import getLogger
logger = getLogger(__name__)
[...]
loclogger = logger.local(extra={'DATA_IN': 'CURRENT_CONTEXT'})
Eg:
from logextractx.logger import getLogger
logger = getLogger(__name__)
def send_message(environment: str, requester: str, recipient: str, text: str) -> bool:
""" Function send_message sends MSG to the specified recipient. """
# extra data to be indexed
loclogger = logger.local(extra={'ACTION_TYPE': 'SEND_MSG',
'requester': requester,
'recipient': recipient,
'user': str(request.user),
'environment': env_type})
try:
r = requests.post(settings.MSG_PROVIDER, json={'recipient': recipient, 'content': text},
... < other params > ....)
r.raise_for_status()
except requests.exceptions.RequestException as e:
loclogger.error('Sending MSG failed. Response text: "%s"', e)
loclogger.debug("headers=%r", r.result.headers)
return False
loclogger.info('Sending MSG success.')
return True
Django
To tie all log records with common request-id
and session-id
, do the following:
- append
logextractx.middleware.LogCtxDjangoMiddleware
to yourMIDDLEWARE
in settings:
MIDDLEWARE = [
[...]
'django.contrib.sessions.middleware.SessionMiddleware',
[...]
'logextractx.middleware.LogCtxDjangoMiddleware',
]
And instead of logextractx.logger
use logextractx.middleware
so:
from logextractx.logger import getLogger
logger = getLogger(__name__)
[...]
Also, you need to add filter into logging
'filters': {
'RidFilter': {
'()': 'logextractx.middleware.RidFilter'
}
}
And that's all. Now every log entry will contain request_id
and session_id
fields.
Django + DjHuey
If you want to also pass request/session-id
to working
Huey/DjHuey by such modifications:
Instead
from huey.contrib.djhuey import db_periodic_task, db_task, task
you should use
from logextractx.djhuey import db_periodic_task, db_task, task
If you do so, then all extra context, including request-id
and session-id
will be
passed to logger on the Djhuey side.
Flask
LogExtraCtx in Flask is quite similar to usage in Django:
from logextractx.flask import init_logctx
from logextractx.middleware import getLogger
[...]
app = flask.Flask(__name__)
app.secret_key = "don't tell anyone"
init_logctx(app)
[...]
logger = getLogger(__name__)
Extra Formatter
If you use plain logging format, you may be interested in using
logextractx.formatter.ExtraFormatter
. Just add following in your formatter definition (DictConfig):
'formatters': {
'simple': {
'()': 'logextractx.formatter.ExtraFormatter',
'fmt': '%(levelname)s %(asctime)s %(name)s: %(message)s [%(extras)s]'
}
}
And then you will have all extra in single log line.
License:
Licensed under the Apache License, Version 2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for logextractx-0.3.0rc4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f13c5291d1aa7db64002f1f636c1e4c785cc4685587dbb9714fb005fadb2ccf1 |
|
MD5 | 1e25bd91733402332d38f9df6660f058 |
|
BLAKE2b-256 | f2c765b2a2288ebe0cf8fed424a76a64ebd260fb446189bc0a17f4d5d959fbb2 |