1、基本使用
1 import logging 2 3 logging.info("info") 4 logging.warning("warning") 5 logging.error('error')
上述代码仅会在控制台输出:
WARNING:root:warning
ERROR:root:error
因为默认仅输出WARNING及以上级别的日志。常用的级别由高到低有:CRITICAL、ERROR、WARNING、INFO、DEBUG;
输出的格式默认为:
%(levelname)s:%(name)s:%(message)s
-levelname:级别名称;
-name:日志收集器的名称,默认为root;
-message:日志内容;
要想输出其他等级的日志,需要改变输出级别,如下介绍两种方法;
2、改变输出的级别
2.1 使用basicConfig()方法
如果logger没有指定处理器,则会默认使用basicConfig,在里面可以对日志进行一些设置。该方法传关键字参数,看下常用的参数:
- filename:文件名;新建一个文件处理器FileHandler。并且把日志输出到该文件,此时日志不再在控制台输出;
- filemode:打开文件的方式;如果指定了filename,则可以指定该参数;默认a,表示追加;w,表示覆盖;
- format:指定日志输出的字符串格式;例如:format='%(levelname)s-%(name)s-%(asctime)s: %(message)s'
- datefmt:指定输出的时间格式;例如:datefmt='%Y-%m-%d'
- level:指定最低输出日志的等级;例如:level='INFO' 则INFO及以上级别的日志均能被输出
- stream:用例初始化一个StreamHandler;如果filename存在,则程序忽略stream;
- encoding:指定filname时,可以通过该参数设置编码;
使用示例:
1 logging.basicConfig(filename='logout.txt', 2 filemode='a', 3 format='%(levelname)s-%(name)s-%(asctime)s: %(message)s', 4 level='INFO', 5 datefmt='%Y-%m-%d') 6 # 在logout.txt文件输出结果: 7 # INFO-root-2022-06-09: info 8 # WARNING-root-2022-06-09: warning 9 # ERROR-root-2022-06-09: error
2.2 创建日志收集器和设置输出渠道
(一)创建日志收集器
logging.getLogger('py') py即收集器的名称,会在文件/控制台输出;如果不传名称,则默认使用RootLogger;
(二)设置输出渠道
- FileHandler:文件输出;
- 需要指定filename;模式默认是a(追加),模式同open函数;
- setLevel指定输出的等级;
- StreamHandler:控制台输出;
- setLevel指定输出的等级;
1 #1、创建日志收集器 2 my_log = logging.getLogger('py') 3 my_log.setLevel('DEBUG') #设置采集等级 4 #2、 设置输出渠道 5 # 2-1 可以同时设置两个输出渠道 6 sh = logging.StreamHandler() #2-1-1控制台输出,设置输出等级 7 sh.setLevel('DEBUG') 8 fh = logging.FileHandler("logout.txt") #2-1-2文件输入 9 fh.setLevel('DEBUG') 10 # 2-2 设置日志字符串格式 11 format = logging.Formatter("%(levelname)s-%(name)s-%(asctime)s: %(message)s") 12 # 2-2-1 两种输出渠道都设置format格式 13 sh.setFormatter(format) 14 fh.setFormatter(format) 15 # 2-3 给日志收集器设置输出渠道 16 my_log.addHandler(sh) 17 my_log.addHandler(fh) 18 19 #使用日志收集器采集日志 20 my_log.debug('debug') 21 my_log.info('info') 22 my_log.warning('warning') 23 my_log.error('error')
3、封装成类
最后,把logger封装成一个类方便调用:
1 import logging 2 3 4 class MyLog(): 5 6 def __init__(self,filepath=None):#测试用例中setup中初始化一个实例 7 #1、创建日志收集器 8 self.my_log = logging.getLogger('py') 9 self.my_log.setLevel('DEBUG') #设置采集等级 10 #2、 设置输出渠道 11 # 2-1 可以同时设置两个输出渠道 12 self.sh = logging.StreamHandler() #2-1-1控制台输出,设置输出等级 13 self.sh.setLevel('DEBUG') 14 self.fh = logging.FileHandler("logout.txt") #2-1-2文件输入 15 self.fh.setLevel('DEBUG') 16 # 2-2 设置日志字符串格式 17 format = logging.Formatter("%(levelname)s-%(name)s-%(asctime)s: %(message)s") 18 # 2-2-1 两种输出渠道都设置format格式 19 self.sh.setFormatter(format) 20 self.fh.setFormatter(format) 21 # 2-3 给日志收集器设置输出渠道 22 self.my_log.addHandler(self.sh) 23 self.my_log.addHandler(self.fh) 24 25 # self.sh.close() #把输出渠道写在构造函数里暂时没找到合适的位置关闭处理器 26 # self.fh.close() #把输出渠道写在构造函数里暂时没找到合适的位置关闭处理器 27 28 def info(self,msg): 29 self.my_log.info(msg) 30 31 def warning(self,msg): 32 self.my_log.warning(msg) 33 34 def error(self,msg): 35 self.my_log.error(msg) 36 37 def close(self): #测试用例中teardown中调用,否则会出现重复日志 38 self.sh.close() 39 self.fh.close() 40 self.my_log.removeHandler(self.sh) 41 self.my_log.removeHandler(self.fh) 42 43 # 使用 44 log = MyLog() 45 log.info('info') 46 log.warning('warning') 47 log.error('error')
注意:一定要removehandler,否则会产生重复日志!(因为每次实例化都会去添加一个handler)
End.