方式一:封装代码
import logging, logging.handlers, time, os
class Log(object):
'''
logging的初始化操作,以类封装的形式进行
'''
def __init__(self):
# 定义对应的程序模块名name,默认为root
self.logger = logging.getLogger()
# 设置输出的等级
LEVELS = {'NOSET': logging.NOTSET,
'DEBUG': logging.DEBUG,
'INFO': logging.INFO,
'WARNING': logging.WARNING,
'ERROR': logging.ERROR,
'CRITICAL': logging.CRITICAL}
# log_path是存放日志的路径
timestr = time.strftime('%Y_%m_%d', time.localtime(time.time()))
lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../logs'))
# 如果不存在这个logs文件夹,就自动创建一个
if not os.path.exists(lib_path):
os.mkdir(lib_path)
# 日志文件的地址
self.logname = lib_path + '/' + timestr + '.log'
# 必须设置,这里如果不显示设置,默认过滤掉warning之前的所有级别的信息
self.logger.setLevel(logging.INFO)
# 日志输出格式
self.formatter = logging.Formatter(
'[%(asctime)s] [%(filename)s] [%(levelname)s]: %(message)s') # [2019-05-15 14:48:52,947] - test.py] - ERROR: this is error
# 创建一个FileHandler, 向文件logname输出日志信息
# fh = logging.FileHandler(self.logname, 'a', encoding='utf-8')
fh = logging.handlers.RotatingFileHandler(filename=self.logname,
maxBytes=1024 * 1024 * 50,
backupCount=5)
# 设置日志等级
fh.setLevel(logging.INFO)
# 设置handler的格式对象
fh.setFormatter(self.formatter)
# 将handler增加到logger中
self.logger.addHandler(fh)
# 创建一个StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)
# # 关闭打开的文件
fh.close()
def info(self, message):
self.logger.info(message)
def debug(self, message):
self.logger.debug(message)
def warning(self, message):
self.logger.warning(message)
def error(self, message):
self.logger.error(message)
def critical(self, message):
self.logger.critical(message)
if __name__ == "__main__":
logger = Log()
logger.info("this is info")
logger.debug("this is debug")
logger.error("this is error")
logger.warning("this is warning")
logger.critical("critical")
方式二:配置文件
#coding: utf-8
#logging配置文件
#定义logger模块,root是父类,必须存在,其他的自定义
#logging.getLogger(name) 相当于向loggging模块注册了一种日志打印
#如果name为loggers里面keys的值,则调用对应的配置,如果name没有则调用默认(root)的配置
#name 中用点 . 表示继承关系
#可以有多个,以逗号隔开
#####################################################################################################
#实现logger对应的配置信息
# 必须是 logger_name name为loggers中key的值
#level 日志级别,级别有 DEBUG,INFO,WARNING,ERROR,CRITICAL
#handlers 日志处理器,可以有多个 以逗号隔开
#qualname logger的名称,通过logging.getLogger(name)获取,这里的name便是qualname
# 如果获取的logger 名称不存在,则调用默认(root)logger
#propagate 是否继承符类的配置信息,0:否 1:是
#如果这个属性是True也就是1,那么这个logger的输出会朝着上一级logger传播;会产生两个记录
#所以需要把其他logger的propagate属性设置为False
[loggers]
keys=root,console,file
[logger_root]
level=DEBUG
handlers=rootHandler
formatter=pretty
[logger_console]
level=DEBUG
handlers=consoleHandler
formatter=pretty
qualname=console
[logger_file]
level=DEBUG
handlers=fileHandler
formatter=pretty
qualname=file
#######################################################################
#handlers的具体配置实现
#必须是 handler_name name为handlers中key的值
#class为logging包里面的handler处理器
#formatter 日志输入格式
#args handler相关参数
[handlers]
keys=rootHandler,consoleHandler,fileHandler
[handler_rootHandler]
class=StreamHandler
level=DEBUG
formatter=pretty
args=(sys.stdout,)
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=pretty
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=pretty
args=("./log.log","a")
#######################################################################
#日志输出格式化实现
#datefmt 日期格式 对应asctime
[formatters]
keys=pretty
[formatter_pretty]
format=[%(asctime)s][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s
datefmt=%a, %d %b %Y %H:%M:%S
引用
import logging.config
if __name__ == '__main__':
logconf=open('./log.conf',encoding='UTF-8')
logging.config.fileConfig(logconf)
logconf.close()
logger = logging.getLogger('file')
logger.debug("debug message")
logger.info("info message")
logger.warning("warning message")
logger.critical("critical message")