To my knowledge dictConfig(), as mentioned in the update by @Vinay Sajip, is the best way to go.
Here is a working example in Python 3.8:
import logging
from logging.config import dictConfig
FI_PATH_CONSUMERS_LOG = "/project/test_log.log"
LOG_FORMAT = "%(asctime)s %(levelname)-8s [%(name)s] %(message)s"
LOG_LEVEL = "INFO"
LOG_DATEFMT = "%Y-%m-%d %H:%M:%S"
logging.basicConfig(
filename=FI_PATH_CONSUMERS_LOG,
format=LOG_FORMAT,
level=getattr(logging, LOG_LEVEL),
datefmt=LOG_DATEFMT,
)
def create_new_format(format_additions: str=""):
"""
This adjusts both loggers, but you can
also make changes specific to each.
"""
alt_new_formats = {
"event_format": {
"format": LOG_FORMAT + format_additions,
"datefmt": LOG_DATEFMT,
},
}
changed_setting = {
"version": 1,
"formatters": alt_new_formats,
"handlers": {
"to_file": {
"class": "logging.FileHandler",
"filename": FI_PATH_CONSUMERS_LOG,
"formatter": "event_format",
"level": LOG_LEVEL,
},
},
"loggers": {
"": {
"handlers": ["to_file"],
},
},
"disable_existing_loggers": False,
}
return changed_setting
Which you can run like so:
logger = logging.getLogger() # root logger
logger_2 = logging.getLogger("logger 2") # child logger with name "logger 2"
msg_test = "Testing message."
logger.info(msg_test)
logger_2.info(msg_test)
dictConfig(create_new_format(" [Adjust formatting]"))
logger.info(msg_test)
logger_2.info(msg_test)
dictConfig(create_new_format())
logger.info(msg_test)
logger_2.info(msg_test)
And which will give you the following output:
2021-09-16 14:47:48 INFO [root] Testing message.
2021-09-16 14:47:48 INFO [logger 2] Testing message.
2021-09-16 14:47:48 INFO [root] Testing message. [Adjust formatting]
2021-09-16 14:47:48 INFO [logger 2] Testing message. [Adjust formatting]
2021-09-16 14:47:48 INFO [root] Testing message.
2021-09-16 14:47:48 INFO [logger 2] Testing message.
package1.module2
) to add some module-specific contextual information, I would want to do this for all the logger's handlers. Enumerating all the handlers which may well be used by all other loggers, temporarily changing the format, then changing it back so as not to break the other loggers is not a solution. – Paramagnetic