Tool for easy logging with current context information
Project description
context_logging
Description
Tool for easy logging with current context information.
from context_logging import current_context
logging.info('before context')
# 2019-07-25 19:49:43 INFO before context
with Context('my_context'):
current_context['var'] = 1
logging.info('in context')
# 2019-07-25 19:49:43 INFO in context {'var': 1}
# 2019-07-25 19:49:43 INFO 'my_context: executed in 00:00:01 {'var': 1}'
logging.info('after context')
# 2019-07-25 19:49:43 INFO after context
Installation
pip install context_logging
Usage
Setup logging with context
import logging
from context_logging import current_context, setup_log_record
logging.basicConfig(
format='%(asctime)s %(levelname)s %(name)s %(message)s %(context)s',
level=logging.INFO,
)
setup_log_record()
current_context['var'] = 1
logging.info('message')
# 2019-07-25 19:49:43,892 INFO root message {'var': 1}
As contextmanager
from context_logging import Context, current_context
with Context(var=1):
assert current_context['var'] == 1
assert 'var' not in current_context
Any nesting of contexts is allowed
with Context(var=1):
assert current_context == {'var': 1}
with Context(val=2, var=2):
assert current_context == {'val': 2, 'var': 2}
assert current_context == {'var': 1}
assert 'var' not in current_context
As decorator
@Context(var=1)
def f():
assert current_context['var'] == 1
f()
assert 'var' not in current_context
With start/finish [DEPRECATED]
ctx = Context(var=1)
assert 'var' not in current_context
ctx.start()
assert current_context['var'] == 1
ctx.finish()
assert 'var' not in current_context
Add/remove values from current_context
with Context():
assert 'var' not in current_context
current_context['var'] = 1
assert current_context['var'] == 1
Explicit context name (else will be used path to the python module)
with Context('my_context'):
pass
Execution time logged on exit from context (it can be disabled with log_execution_time=False
argument)
with Context('my_context'):
time.sleep(1)
# INFO 'my_context: executed in 00:00:01',
Default value for log_execution_time param can be changed with env
export CONTEXT_LOGGING_LOG_EXECUTION_TIME_DEFAULT=0
Exceptions from context are populated with current_context (it can be disabled with fill_exception_context=False
argument)
try:
with Context(var=1):
raise Exception(1)
except Exception as exc:
assert exc.args = (1, {'var': 1})
Default value for fill_exception_context param can be changed with env
export CONTEXT_LOGGING_FILL_EXEPTIONS_DEFAULT=0
We can set data to root context that never will be closed
from context_logging import root_context
root_context['env'] = 'test'
If you want to pass context to other threads use ContextVarExecutor
from context_logging import ContextVarExecutor
with ContextVarExecutor() as executor:
executor.submit(...)
# OR
loop.set_default_executor(ContextVarExecutor()) # for asyncio loop
For developers
Create venv and install deps
make init
Install git precommit hook
make precommit_hook
Run linters, autoformat, tests etc.
make pretty lint test
Bump new version
make bump_major
make bump_minor
make bump_patch
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
context_logging-1.1.0.tar.gz
(6.1 kB
view hashes)
Built Distribution
Close
Hashes for context_logging-1.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6c667d21004d35fde6df72972933ee239dda9b012e60a5560bbdf7881a71b194 |
|
MD5 | fb9b96afe3516dff428cdb01c4696299 |
|
BLAKE2b-256 | bc0251207efeba07b30d6940402178d6948f9c9073fe7ae2944283e698540f85 |