自定义日志方式书写python日志
使用logging.config.fileConfig(),读取配置文件的方式,虽然提供了灵活方便的渠道,仅仅可以通过修改配置即可达到目的,但是对于需要自定义日志的同学显然满足不了要求。
且看自定义日志该如何写作,以下代码实现了根据不同模块,创建相应目录,日志文件的功能,日志文件命名为:模块_日志.log。
废话少说,直接上代码,注意:以下log模块内容提供了两种日志输出形式,一是输出到控制台终端,二是输出到日志文件。
日志文件实现了按月定期删除,删除一个月前的日志。
1、创建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)
_handler.suffix = "%Y-%m-%d.log"
_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
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、其他模块调用
创建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")