Introduction
In this article, we are going to learn about how to use the logging module in Python? Following are the points we are going to cover in this article,
- Why do we need logging?
- How to use the logging module in Python?
- Logging levels or severity
- How to configure logging?
- How do format the logs or display messages?
- How to log errors or exceptions to file?
- Examples
Why do we need logging?
It's very hard to find out the issue or breaking changes in the application without logging. The logging tracks the events and flows when the application runs, also helps the developers to easily find the breaking changes, easily debug and fix them.
How to use the logging module in Python?
The logging module is the part of Python standard library so you don't need to install it separately. This module supports logging with the help of logging, logging.config, and logging.handlers modules. It is a very powerful module, easy to configure and use. Following are the methods we can use to log:
- print(): To display the output to the console.
- info(msg, *args, **kwargs), debug(msg, *args, **kwargs): To log the events or the details output about the application.
- warning(msg, *args, **kwargs): To log a warning to the user about the event or flow in the application.
- error(msg, *args, **kwargs), exception(msg, *args, **kwargs): To log the bugs in code, syntax error, or the exceptions in the application.
- critical(msg, *args, **kwargs): To log the error which stops the application to run.
Note
In the above logging methods, there are three parameters - The first parameter is the 'msg' which is nothing but the message we want to log or show. The second parameter '*args' is nothing but the run time we can pass to the message using the string formatting operator. The third parameter '**kwargs', there are four keyword arguments we can pass which are 'exc_info, stack_info, stacklevel, and extra'.
exc_info - The default value is 'False', if it is set to 'True' then it adds the exception information into the log message.
stack_info - The default value is 'False', if it is set to 'True' then it adds stack information into the log message.
stacklevel - The default value is 1, if it is greater than 1 then the number of stack frames will be skipped when logging the event.
extra - It is used to logging the user-defined attributes, incorporated with the messages.
Logging levels or severity
There are few predefined levels or severity, based on this the logging function names are defined. Following are the levels with their numeric value and description:
- CRITICAL(50) - A major error because of that application stop working.
- ERROR(40) - Due to some error or exception some functionality of an application won't work.
- WARNING(30) - To indicate to the user that some code will get errors in the feature but the application doesn't stop.
- INFO(20) - To indicate to the user that the application working as expected.
- DEBUG(10) - Gives detailed information, when we debug the application.
Note
The default logging level is set to 'WARNING' which means the log will get this level and above. If you want to log all the events then in the configuration we need to set level 'DEBUG' then you will see all the levels log. Please see the below example, you will only get the log about the 'WARNING' level in the output.
Simple example
import logging
logging.info('Info message goes here')
logging.warning('Warning message goes here')
Output
How to configure logging?
In the previous section, we saw that the 'INFO' logging does not log the message. To overcome that, the logging module provided the method 'basicConfig(**kwargs)'. With the help of this method, we can do the basic configuration about the logging. Following are the commonly used list of arguments we can pass to it more info please check here,
- filename - To specify the file name.
- filemode - To specify the file open mode, defaults to
'a'(append)
.
- format - To specify the format of logs, defaults to attributes
levelname
, name
and message
separated by colons.
- datefmt - To specify the date/time format, as accepted by 'time.strftime()'.
- style - To specify the styling of the format string, defaults to '%'.
- level - To specify the logger level here, the default is 'WARNING'.
Simple example
The above example shows how to configure the logger configuration, we had used the same example just added the configuration line with logger level set to 'INFO' so in the output you will see both the logs.
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Info message goes here')
logging.warning('Warning message goes here')
Output
How do format the logs or display the messages?
To format the logs or display messages, we need to set the 'format' parameter in 'basicConfig(**kwargs)' method as in below example. Following are the three supported style string formats:
printf - ‘%(name)s:%(message)s’
str.format() - ‘{name}:{message}’
str.template - ‘$name:$message’
Simple example
In the below example we have passed the parameter 'format' with values 'name, levelname and message'.
import logging
logging.basicConfig(level=logging.INFO, format='%(name)s - %(levelname)s - %(message)s')
logging.info('Info message goes here')
logging.warning('Warning message goes here')
Console Output
Once you execute the above code you will get the formatted console output as below,
How to log errors or exceptions to file?
In day-to-day development, developers use the console output to check the issues, bugs, or errors in code but in the case of deployed applications how we are going to check? In that situation, we have to write a log or record the errors in a file. Using the same 'logging' module we can achieve that, with the help of file parameters in the 'basicConfig(**kwargs)' method as below example.
Simple example
In the below example we have passed the two parameters first is 'filename=app.log' and the second is 'filemode='w''.
import logging
logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s', filename='app.log', filemode='w')
logging.info('Info message goes here')
logging.warning('Warning message goes here')
File Output
When you open the 'app.log' file as we mentioned the name in the example you will see an output as below,
Examples
Customize the output message by passing run time data.
import logging
logging.basicConfig(format='%(levelname)s - %(message)s')
logging.warning('%s it, %s it!', 'Learn', 'Share')
Output: WARNING - Learn it, Share it!
Show DateTime in the message by using the 'asctime' format value and configuration parameter 'datefmt'.
import logging
logging.basicConfig(format='%(levelname)s - %(asctime)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('%s it, %s it!', 'Learn', 'Share')
Output
WARNING - 09/03/2021 08:52:34 AM - Learn it, Share it!
Show the exception or stack trace using the 'logging.error' log message. In the below example we have used the 'exc_info=True' in the 'error' function, 'exc_info' default value is false then will get only the message in the output, here we have set it to true so will get the stack trace in output.
import logging
logging.basicConfig(format='%(levelname)s - %(asctime)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
arr = []
try:
result = arr[0]
except Exception as e:
logging.error("Exception occurred", exc_info=True)
Output
In the output, you can see the message with the stack trace information.
ERROR - 09/03/2021 09:03:07 AM - Exception occurred
Traceback (most recent call last):
File "D:\Demos\py\test.py", line 7, in <module>
result = arr[0]
IndexError: list index out of range
Show the exception or stack trace using the 'logging.exception' log message.
import logging
logging.basicConfig(format='%(levelname)s - %(asctime)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
arr = []
try:
result = arr[0]
except Exception as e:
logging.exception("Exception occurred")
Output
In the output, you can see the message with the stack trace information.
ERROR - 09/03/2021 09:13:57 AM - Exception occurred
Traceback (most recent call last):
File "D:\Demos\py\test.py", line 7, in <module>
result = arr[0]
IndexError: list index out of range
Conclusion
In this article, we learned about how to use, configure, write the logs to the file using the logging module in Python and simple examples. If you have any suggestions or queries regarding this article, please leave a comment.
“Learn it. Share it.”