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!')
If you run this script you will see:
WARNING:root:Watch out!
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!')
Output will be:
INFO:__main__:Hello, World! WARNING:__main__:Watch out!
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')
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
Configuration via an INI file
This is the best approach for the meajority of cases;
Crate a file name logging.ini
in 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,)
Or curl
it:
$ curl -o logging.ini https://gist.githubusercontent.com/SerhatTeker/13d31a2159cd88c31a8cd464df115789/raw/81d9bbe850799e71b6095a6a43fa65dc1cf0e33c/logging.ini
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')
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
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
All done.
Top comments (0)