DEV Community

Serhat Teker
Serhat Teker

Posted on • Originally published at tech.serhatteker.com on

Python Logging Configuration

No, please don't debug your program with print.

Python comes with a logging module in the standard library that provides a flexible framework for emitting log messages for Python programs.

The module provides some ways for applications to configure different log handlers and a way of routing log messages to these handlers. This allows for a highly flexible configuration that can deal with a lot of different use cases.

The logging functions are named after the level or severity of the events they are used to track. The standard levels and their applicability are described below:

Level Level Code When used
DEBUG 10 Detailed information, typically of interest only when diagnosing problems.
INFO 20 Confirmation that things are working as expected.
WARNING 30 An indication that something unexpected happened. The software is still working as expected.
ERROR 40 Due to a more serious problem, the software has not been able to perform some function.
CRITICAL 50 A serious error, indicating that the program itself may be unable to continue running.

For more details : Python Foundation How To Logging

Basic Logging

A very simple example for logging is:

import logging logging.info("Hello, World!") logging.warning('Watch out!') 
Enter fullscreen mode Exit fullscreen mode

If you run this script you will see:

WARNING:root:Watch out! 
Enter fullscreen mode Exit fullscreen mode

The INFO message doesn’t appear because the default level is WARNING.

Logging From Modules

However better approach will be using __name__ with DEBUG logging level. Since __name__ contains the full name of the current module, so this will simply work in any module.

import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) logger.info("Hello, World!") logger.warning('Watch out!') 
Enter fullscreen mode Exit fullscreen mode

Output will be:

INFO:__main__:Hello, World! WARNING:__main__:Watch out! 
Enter fullscreen mode Exit fullscreen mode

Logging to a File

A very common situation is that of recording logging events in a file.

import logging logging.basicConfig(filename='example.log', level=logging.DEBUG) logger = logging.getLogger(__name__) logger.debug('This message should go to the log file') logger.info('So should this') logger.warning('And this, too') 
Enter fullscreen mode Exit fullscreen mode

If we open the file— "example.log", we should find the log messages:

DEBUG:__main__:This message should go to the log file INFO:__main__:So should this WARNING:__main__:And this, too 
Enter fullscreen mode Exit fullscreen mode

Configuration via an INI file

This is the best approach for the meajority of cases;

Crate a file name logging.iniin the project root directory as below:

[loggers] keys=root [logger_root] level=DEBUG handlers=screen,file [formatters] keys=simple,verbose [formatter_simple] format=%(asctime)s [%(levelname)s] %(name)s: %(message)s [formatter_verbose] format=[%(asctime)s] %(levelname)s [%(filename)s %(name)s %(funcName)s (%(lineno)d)]: %(message)s [handlers] keys=file,screen [handler_file] class=handlers.TimedRotatingFileHandler interval=midnight backupCount=5 formatter=verbose level=DEBUG args=('debug.log',) [handler_screen] class=StreamHandler formatter=simple level=DEBUG args=(sys.stdout,) 
Enter fullscreen mode Exit fullscreen mode

Or curl it:

$ curl -o logging.ini https://gist.githubusercontent.com/SerhatTeker/13d31a2159cd88c31a8cd464df115789/raw/81d9bbe850799e71b6095a6a43fa65dc1cf0e33c/logging.ini 
Enter fullscreen mode Exit fullscreen mode

Then configure it as below;

#!/usr/bin/env python3 # -*- coding: utf-8 -*-  import logging from logging.config import fileConfig fileConfig('logging.ini') logger = logging.getLogger(__name__) name = "YourName" logger.info(f"Hello {name}") logger.debug('This message should go to the log file') logger.info('So should this') logger.warning('And this, too') 
Enter fullscreen mode Exit fullscreen mode

If you run the script, the sysout will be:

2019-07-14 18:15:13,161 [INFO] __main__: Hello YourName 2019-07-14 18:15:13,161 [DEBUG] __main__: This message should go to the log file 2019-07-14 18:15:13,161 [INFO] __main__: So should this 2019-07-14 18:15:13,161 [WARNING] __main__: And this, too 
Enter fullscreen mode Exit fullscreen mode

And debug.log file should contain:

[2019-07-14 18:12:58,910] INFO [logging_ini.py __main__ <module> (14)]: Hello YourName [2019-07-14 18:12:58,910] DEBUG [logging_ini.py __main__ <module> (15)]: This message should go to the log file [2019-07-14 18:12:58,910] INFO [logging_ini.py __main__ <module> (16)]: So should this [2019-07-14 18:12:58,910] WARNING [logging_ini.py __main__ <module> (17)]: And this, too 
Enter fullscreen mode Exit fullscreen mode

All done.

Top comments (0)