1、日志级别
日志一共分为5个等级,从低到高分别是:
DEBUG
INFO
WARNING
ERROR
CRITICAL
说明:
- DEBUG(调试):详细的信息,通常只出现在诊断问题上
- INFO(信息):确认一切按预期运行
- WARNING(警告):一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。
- ERROR(错误):更严重的问题,软件没能执行一些功能
- CRITICAL(严重的):一个严重的错误,这表明程序本身可能无法继续运行
这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,当在WARNING或之上时才被跟踪。
2、日志格式说明
logging.basicConfig函数中,可以指定日志的输出格式format,这个参数可以输出很多有用的信息
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
3.日志输出
有两种方式记录跟踪,一种输出控制台,另外一种是记录到文件中,如日志文件
3.1、将日志输出到控制台
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s : %(message)s')
#开始使用log功能
logging.debug('这是 logging debug message')
logging.info('这是 logging info message')
logging.warning('这是 logging warning message')
logging.error('这是 logging error message')
logging.critical('这是 logging critical message')
运行效果:
2019-01-16 01:39:32,218 - rizhi.py[line:5] - INFO : 这是 logging info message
2019-01-16 01:39:32,218 - rizhi.py[line:7] - WARNING : 这是 logging warning message
2019-01-16 01:39:32,219 - rizhi.py[line:8] - ERROR : 这是 logging error message
2019-01-16 01:39:32,220 - rizhi.py[line:9] - CRITICAL : 这是 logging critical message
2.2、将日志输出到文件
我们还可以将日志输出到文件,只需要在logging.basicConfig函数中设置好输出文件的文件名和写文件的模式。
import logging
logging.basicConfig(level=logging.WARNING,
filename='./log.txt',
filemode='w',
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# use logging
logging.info('这是 loggging info message')
logging.debug('这是 loggging debug message')
logging.warning('这是 loggging a warning message')
logging.error('这是 an loggging error message')
logging.critical('这是 loggging critical message')
3.3、既要把日志输出到控制台, 还要写入日志文件
这就需要一个叫作Logger 的对象来帮忙,下面将对他进行详细介绍,现在这里先学习怎么实现把日志既要输出到控制台又要输出到文件的功能。
import logging
#第一步,创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.INFO) #Logging等级总开关
#第二步,创建一个handler,用于写入日志文件
fh = logging.FileHandler('./log.txt',mode='a')
fh.setLevel(logging.DEBUG) #输出到文件的log等级的开关
#第三步,在创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) #输出到控制台的log等级的开关
#第四步,定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
#第五步,将logger添加到handler里面
logger.addHandler(fh)
logger.addHandler(ch)
#日志
logger.debug('这是 logger debug message')
logger.info('这是 logger info message')
logger.warning('这是 logger warning message')
logger.error('这是 logger error message')
logger.critical('这是 logger critical message')
运行时终端的输出结果:
2017-11-06 23:14:04,731 - log3.py[line:28] - WARNING: 这是 logger warning message
2017-11-06 23:14:04,731 - log3.py[line:29] - ERROR: 这是 logger error message
2017-11-06 23:14:04,731 - log3.py[line:30] - CRITICAL: 这是 logger critical message
在log.txt中,有如下数据:
2017-11-06 23:14:04,731 - log3.py[line:27] - INFO: 这是 logger info message
2017-11-06 23:14:04,731 - log3.py[line:28] - WARNING: 这是 logger warning message
2017-11-06 23:14:04,731 - log3.py[line:29] - ERROR: 这是 logger error message
2017-11-06 23:14:04,731 - log3.py[line:30] - CRITICAL: 这是 logger critical message
日志类
import logging
class MyLog:
def my_log(self,msg,msg_level):
logger=logging.getLogger()
logger.setLevel('DEBUG')#日志收集器的级别
#输出渠道 相对路径
#保存文件
fh=logging.FileHandler('./log.txt',encoding='UTF-8')
#打印
sh=logging.StreamHandler()
#输出渠道的级别
fh.setLevel('DEBUG')
sh.setLevel('DEBUG')
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: [日志信息]: %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)
#对接日志收集器 以及输出渠道
logger.addHandler(sh)
logger.addHandler(fh)
if msg_level=='DEBUG':
logger.debug(msg)
elif msg_level=='INFO':
logger.info(msg)
elif msg_level=='WARNING':
logger.warning(msg)
elif msg_level=='ERROR':
logger.error(msg)
elif msg_level=='CRITICAL':
logger.critical(msg)
#使用完成后要记得移除handler
logger.removeHandler(fh)
logger.removeHandler(sh)
def debug(self,msg):
self.my_log(msg,'DEBUG')
def info(self,msg):
self.my_log(msg,'INFO')
def warning(self,msg):
self.my_log(msg,'WARNING')
def error(self,msg):
self.my_log(msg,'ERROR')
def critical(self,msg):
self.my_log(msg,'CRITICAL')
if __name__ == '__main__':
MyLog().info('INFO日志')