How to Customize the time format for Python logging?

PythonDatetimeLoggingFormatting

Python Problem Overview


I am new to Python's logging package and plan to use it for my project. I would like to customize the time format to my taste. Here is a short code I copied from a tutorial:

import logging

# create logger
logger = logging.getLogger("logging_tryout2")
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

# add formatter to ch
ch.setFormatter(formatter)

# add ch to logger
logger.addHandler(ch)

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")

And here is the output:

2010-07-10 10:46:28,811;DEBUG;debug message
2010-07-10 10:46:28,812;INFO;info message
2010-07-10 10:46:28,812;WARNING;warn message
2010-07-10 10:46:28,812;ERROR;error message
2010-07-10 10:46:28,813;CRITICAL;critical message

I would like to shorten the time format to just: '2010-07-10 10:46:28', dropping the mili-second suffix. I looked at the Formatter.formatTime, but confused. I appreciate your help to achieve my goal. Thank you.

Python Solutions


Solution 1 - Python

From the official documentation regarding the Formatter class:

> The constructor takes two optional arguments: a message format string and a date format string.

So change

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s")

to

# create formatter
formatter = logging.Formatter("%(asctime)s;%(levelname)s;%(message)s",
                              "%Y-%m-%d %H:%M:%S")

Solution 2 - Python

Using logging.basicConfig, the following example works for me:

logging.basicConfig(
    filename='HISTORYlistener.log',
    level=logging.DEBUG,
    format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
)

This allows you to format & config all in one line. A resulting log record looks as follows:

2014-05-26 12:22:52.376 CRITICAL historylistener - main: History log failed to start

Solution 3 - Python

To add to the other answers, here are the variable list from Python Documentation.

Directive	Meaning	Notes

%a	Locale’s abbreviated weekday name.	 
%A	Locale’s full weekday name.	 
%b	Locale’s abbreviated month name.	 
%B	Locale’s full month name.	 
%c	Locale’s appropriate date and time representation.	 
%d	Day of the month as a decimal number [01,31].	 
%H	Hour (24-hour clock) as a decimal number [00,23].	 
%I	Hour (12-hour clock) as a decimal number [01,12].	 
%j	Day of the year as a decimal number [001,366].	 
%m	Month as a decimal number [01,12].	 
%M	Minute as a decimal number [00,59].	 
%p	Locale’s equivalent of either AM or PM.	(1)
%S	Second as a decimal number [00,61].	(2)
%U	Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0.	(3)
%w	Weekday as a decimal number [0(Sunday),6].	 
%W	Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.	(3)
%x	Locale’s appropriate date representation.	 
%X	Locale’s appropriate time representation.	 
%y	Year without century as a decimal number [00,99].	 
%Y	Year with century as a decimal number.	 
%z	Time zone offset indicating a positive or negative time difference from UTC/GMT of the form +HHMM or -HHMM, where H represents decimal hour digits and M represents decimal minute digits [-23:59, +23:59].	 
%Z	Time zone name (no characters if no time zone exists).	 
%%	A literal '%' character.	 

Solution 4 - Python

if using logging.config.fileConfig with a configuration file use something like:

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

Solution 5 - Python

Try These Formats:

Format 1:

'formatters': {
        'standard': {
            'format' : '%(asctime)s |:| LEVEL: %(levelname)s |:| FILE PATH: %(pathname)s |:| FUNCTION/METHOD: %(funcName)s %(message)s |:| LINE NO.: %(lineno)d |:| PROCESS ID: %(process)d |:| THREAD ID: %(thread)d',
            'datefmt' : "%y/%b/%Y %H:%M:%S"
                    },
              }

Output of Format 1:

enter image description here



Format 2:

'formatters': {
        'standard': {
            'format' : '%(asctime)s |:| LEVEL: %(levelname)s |:| FILE PATH: %(pathname)s |:| FUNCTION/METHOD: %(funcName)s %(message)s |:| LINE NO.: %(lineno)d |:| PROCESS ID: %(process)d |:| THREAD ID: %(thread)d',
            'datefmt' : "%Y-%m-%d %H:%M:%S"
                    },
              }

Output of Format 2:

enter image description here

Solution 6 - Python

In order to customize time format while logging we can create a logger object and and a fileHandler to it.

        import logging
        from datetime import datetime

        logger = logging.getLogger("OSA")

        logger.setLevel(logging.DEBUG)

        filename = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ".log"
        fileHandler = logging.FileHandler(filename, mode="a")#'a' for append you can use 'w' for write

        formatter = logging.Formatter(
            "%(asctime)s : %(levelname)s : [%(filename)s:%(lineno)s - %(funcName)s()] : %(message)s",
            "%Y-%m-%d %H:%M:%S")

        fileHandler.setFormatter(formatter)
        logger.addHandler(fileHandler)
        

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHai VuView Question on Stackoverflow
Solution 1 - PythonMetalsharkView Answer on Stackoverflow
Solution 2 - PythonBenView Answer on Stackoverflow
Solution 3 - PythonIacchusView Answer on Stackoverflow
Solution 4 - PythoncriptonView Answer on Stackoverflow
Solution 5 - PythonAmar KumarView Answer on Stackoverflow
Solution 6 - PythonUdesh RanjanView Answer on Stackoverflow