Custom log method to write python log
Using logging.config.fileConfig() to read the configuration file, although it provides a flexible and convenient channel, the purpose can be achieved only by modifying the configuration, but it is obviously not enough for students who need to customize the log.
Look at how to write a custom log. The following code implements the function of creating a corresponding directory and log file according to different modules. The log file is named: module_log.log.
1. Create log.py
import logging
import logging.handlers
import os
import datetime
LOG_PATH_BASE="/log/"
DEFAULT_LOGNAME="app.log"
class log():
def __init__(self, module_name="test",log_level=logging.DEBUG):
self.__module_name = module_name
self.__log_level = log_level
#output log to console
def get_console_logger(self):
def _gen_file_logger_handler():
_handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s - %(filename)s[line:%(lineno)d][%(levelname)s]: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
_handler.setLevel(logging.DEBUG)
_handler.setFormatter(formatter)
return _handler
def _gen_console_logger():
_console_logger = logging.getLogger("console_logger")
_console_logger.addHandler(handler)
return _console_logger
handler = _gen_file_logger_handler()
console_logger = _gen_console_logger()
return console_logger
#output log to module log file
def get_file_logger(self):
#
def _get_log_file_name():
#
if __name__ == "__main__":
caller_log_name = DEFAULT_LOGNAME
else:
nowTime = datetime.datetime.now().strftime('%Y-%m-%d')
caller_log_name = self.__module_name + "_" + nowTime + ".log"
return caller_log_name
#
def _gen_file_logger_handler(log_name = DEFAULT_LOGNAME):
log_file_dir = LOG_PATH_BASE + self.__module_name + "/"
if not os.path.isdir(log_file_dir):
os.makedirs(log_file_dir)
file_path = f'{log_file_dir}/{log_name}'
formatter = logging.Formatter(
"%(asctime)s - %(filename)s[line:%(lineno)d][%(levelname)s]: %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
_handler = logging.handlers.TimedRotatingFileHandler(
filename=file_path,
when='D',
interval=1,
backupCount=31,
encoding='utf-8',
)
_handler.setLevel(self.__log_level)
_handler.setFormatter(formatter)
return _handler
#
def _gen_file_logger():
_file_logger = logging.getLogger(self.__module_name)
_file_logger.addHandler(handler)
_file_logger.setLevel(self.__log_level)
return _file_logger
log_file_name = _get_log_file_name()
handler = _gen_file_logger_handler(log_file_name)
file_logger = _gen_file_logger()
return file_logger
if __name__ == "__main__":
#args is module name
logger = log("test").get_file_logger()
logger.debug('print by debug')
logger.info('print by info')
logger.warning('print by warning')
logger.error("print by error")
logger.critical("print by critical")
2. Calling other modules
Create test_log.py
from log import log
if __name__ == "__main__":
#
logger = log("celery").get_file_logger()
logger.debug('print by debug')
logger.info('print by info')
logger.warning('print by warning')
logger.error("print by error")
logger.critical("print by critical")