baselog
is a Python module intended to simplify and standardize logging in our Python applications, particularly Dockerized applications. It is simply a thin wrapper around the stdlib logging module.
Many of our codebases are containerized and have the following operational requirements:
- Log messages get logged to the standard error (in agreement with the 12 factor design principles)
- If a
log_dir
path is supplied, a new log file is also created in that directory for every run of the app - All uncaught exceptions are logged as described above
- Standard timezone-aware formats for log messages and timestamps
In the main file in an application, BaseLog
is used to initialize both the console and file loggers.
#!/usr/bin/env python3
from baselog import BaseLog
from .util import otherfunc
logger = BaseLog(
__package__,
log_dir="/logs",
console_log_level="DEBUG",
file_log_level="DEBUG",
)
def main():
logger.info("starting a thing")
otherfunc()
if __name__ == '__main__':
main()
In other files of the project you just import the standard python logging module and get a logger.
#!/usr/bin/env python3
import logging
logger = logging.getLogger(__name__)
def otherfunc():
logger.warning("Log 'em'!")
A sys.excepthook
is set by BaseLog
, so in the case of an uncaught exception, the exception and traceback are logged to the console and log files:
2023-04-11T20:06:59+0000 - logdemo - INFO - starting a thing
2023-04-11T20:06:59+0000 - logdemo.util - WARNING - Things may be happening
2023-04-11T20:06:59+0000 - logdemo.other.funcs - INFO - Things aren't happening yet
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - uncaught exception: RuntimeError; What the heck?!
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-000: Traceback (most recent call last):
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-001: File "<frozen runpy>", line 198, in _run_module_as_main
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-002: File "<frozen runpy>", line 88, in _run_code
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-003: File "/app/logdemo/__main__.py", line 21, in <module>
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-004: main()
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-005: File "/app/logdemo/__main__.py", line 17, in main
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-006: whatsit()
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-007: File "/app/logdemo/other/funcs.py", line 10, in whatsit
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-008: raise RuntimeError("What the heck?!")
2023-04-11T20:06:59+0000 - logdemo - CRITICAL - traceback-009: RuntimeError: What the heck?!