python的logging模块详细介绍:python logging模块
'''
import os
import logging
import logging.handlers as handlers
from datetime import datetime
class logFilter(object):
def __init__(self, level):
self.__level = level
def filter(self, logRecord):
return logRecord.levelno <= self.__level
class CustomLogging(object):
def __init__(self, name):
self.logger = logging.getLogger(name)
self.logger.parent.setLevel(logging.DEBUG)
self.logger.root.setLevel(logging.DEBUG)
# log存放的目录
self.log_path = os.path.join(
os.getcwd(), "log", datetime.now().strftime("%Y-%m-%d"))
# log格式化输出
self.log_formatter = logging.Formatter(
'%(asctime)s-%(levelname)s : %(message)s', '%Y-%m-%d %H:%M:%S')
# 控制台输出
self.set_console_logger()
# 文件输出日志
self.set_file_logger()
def set_console_logger(self):
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(self.log_formatter)
self.logger.addHandler(console_handler)
def set_file_logger(self):
log_message_path = os.path.join(self.log_path, "message")
log_error_path = os.path.join(self.log_path, "error")
if not os.path.exists(log_message_path):
os.makedirs(log_message_path)
if not os.path.exists(log_error_path):
os.makedirs(log_error_path)
messageHandle = handlers.RotatingFileHandler(os.path.join(log_message_path, "access.log"),
maxBytes=1024*1024*30, backupCount=50, encoding="utf-8", delay=False)
messageHandle.setLevel(logging.INFO)
# messageHandle.addFilter(logFilter(logging.INFO))
messageHandle.setFormatter(self.log_formatter)
self.logger.addHandler(messageHandle)
errorHandle = handlers.RotatingFileHandler(os.path.join(log_error_path, "error.wf.log"),
maxBytes=1024*1024*30, backupCount=50, encoding="utf-8", delay=False)
errorHandle.setLevel(logging.ERROR)
# errorHandle.addFilter(logFilter(logging.ERROR))
errorHandle.setFormatter(self.log_formatter)
self.logger.addHandler(errorHandle)
def get_logger(self):
return self.logger
logger = CustomLogging(__name__).get_logger()
if __name__ == "__main__":
logger.info("Log Info...")
logger.error("Log Error...")
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息