【Python编程】Python_logging 模块
Python_logging 模块
一、日志的作用?
在每天运维人员的工作中,接触服务器还是很多的,比如:web服务器,有可能有一个服务宕了,我们都会去看它的日志,比如web服务Nginx为例:Nginx启动失败,首先我们会去它安装路径查找error.log这个日志,因为这个日志里面存放着内容:告诉你为什么nginx会启动失败,有很多原因,所以在这里日志起到了很大的作用,它不仅能为运维人员提供帮助,同时也可以给研发人员进行日志参考来调试代码,及时发现问题并快速定位、解决问题,补救损失。
1、日志的等级
在日志中有五个等级如下:
- debug:这是一个debug日志的级别,是一个详细信息日志。
- info:这是一个info日志的级别,证明事情按预期工作。 关键事件。
- warning:这是一个warning日志级别,是一个警告日志。
- error:这是一个error日志级别,是一个错误日志。
- critical:这是一个critical日志级别,是一个非常严重错误的日志(灾难)
在使用日志的时候,我们需要导入logging模块。 debug info等等日志级别就是logging里面的一些方法,后面加上需要输出的内容就可以了。
例如1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.debug("这是一个debug日志的级别,是一个详细信息日志")
logging.info("这是一个info日志的级别,是一个确认事情按预期工作的日志")
logging.warning("这是一个warning的日志级别,是一个警告的日志")
logging.error("这是一个error的日志级别,是一个错误的日志")
logging.critical("这是一个critical日志级别,是一个非常严重错误的日志")
# 以下为输出的结果
>>>
WARNING:root:这是一个warning的日志级别,是一个警告的日志
ERROR:root:这是一个error的日志级别,是一个错误的日志
CRITICAL:root:这是一个critical日志级别,是一个非常严重错误的日志
注意:在5个日志级别等级中,默认的等级是warning,所以默认输出warning等级以上的日志信息,如:warning error critical
2、配置日志的等级
在以上的例子中可以看出,默认输出的是warning以上的等级日志信息,更改等级配置可以通过logging.besicConfig方法来做一些日志等级的配置
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(level="DEBUG") # 我们可以使用basicConfig来配置日志的等级。
logging.debug("这是一个debug日志的级别,是一个详细信息日志")
logging.info("这是一个info日志的级别,是一个确认事情按预期工作的日志")
logging.warning("这是一个warning的日志级别,是一个警告的日志")
logging.error("这是一个error的日志级别,是一个错误的日志")
logging.critical("这是一个critical日志级别,是一个非常严重错误的日志")
# 以下为输出的结果:
DEBUG:root:这是一个debug日志的级别,是一个详细信息日志
INFO:root:这是一个info日志的级别,是一个确认事情按预期工作的日志
WARNING:root:这是一个warning的日志级别,是一个警告的日志
ERROR:root:这是一个error的日志级别,是一个错误的日志
CRITICAL:root:这是一个critical日志级别,是一个非常严重错误的日志
那么使用logging.basicConfig就可以对日志的等级进行配置 后面加:level="日志的等级"
3、配置日志的输出信息
有时候我们需要输出一些内容,比如access.log日志一样,有时间,网址,状态码,用户等等
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
# 同时还是使用basicConfig来配置,levelname就是日志等级的意思,message就是日志的内容。
>>>
DEBUG:这是一个debug日志的级别,是一个详细信息日志
INFO:这是一个info日志的级别,是一个确认事情按预期工作的日志
WARNING:这是一个warning的日志级别,是一个警告的日志
ERROR:这是一个error的日志级别,是一个错误的日志
CRITICAL:这是一个critical日志级别,是一个非常严重错误的日志
4、如何修改日志时间的格式?
logging.basicConfig(format="%(asctime)a:%(message)s",level="DEBUG")
>>>
2018-11-11 23:05:39,642:这是一个debug日志的级别,是一个详细信息日志
2018-11-11 23:05:39,642:这是一个info日志的级别,是一个确认事情按预期工作的日志
2018-11-11 23:05:39,642:这是一个warning的日志级别,是一个警告的日志
2018-11-11 23:05:39,643:这是一个error的日志级别,是一个错误的日志
2018-11-11 23:05:39,643:这是一个critical日志级别,是一个非常严重错误的日志
5、来点稍微复杂的格式?
提到复杂的格式,应该是在logging.baicConfig()括号里面加点其他的东西就可以了如下:
logging.basicConfig(format='%(lineno)d - %(filename)s - %(asctime)s - %(name)s - %(levelname)s - %(message)s',level="DEBUG")
logging.debug("这是一个debug日志的级别,是一个详细信息日志")
logging.info("这是一个info日志的级别,是一个确认事情按预期工作的日志")
logging.warning("这是一个warning的日志级别,是一个警告的日志")
logging.error("这是一个error的日志级别,是一个错误的日志")
logging.critical("这是一个critical日志级别,是一个非常严重错误的日志")
>>>
13 - loglog.py - 2018-11-11 23:15:54,000 - root - DEBUG - 这是一个debug日志的级别,是一个详细信息日志
14 - loglog.py - 2018-11-11 23:15:54,001 - root - INFO - 这是一个info日志的级别,是一个确认事情按预期工作的日志
15 - loglog.py - 2018-11-11 23:15:54,001 - root - WARNING - 这是一个warning的日志级别,是一个警告的日志
16 - loglog.py - 2018-11-11 23:15:54,001 - root - ERROR - 这是一个error的日志级别,是一个错误的日志
17 - loglog.py - 2018-11-11 23:15:54,001 - root - CRITICAL - 这是一个critical日志级别,是一个非常严重错误的日志
这时候输出的就有点专业了,解释如下:
- lineno:输出日志的行数
- filename:输出当前日志文件的名称
- asctime:输出当前的一个时间
- name: 输出当前用户名称
- levelname:输出当前的日志级别
- message:输出当前日志的内容
6、如何在工程中使用如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import logging
def yankerp(logger_name="YANKAI-LOG", log_file="yankai.log",level=logging.DEBUG):
# 创建logger对象
logger = logging.getLogger(logger_name)
logger.setLevel(level)
# 创建控制台
ch = logging.StreamHandler()
ch.setLevel(level)
# 创建文件
fh = logging.FileHandler(filename=log_file, encoding="utf-8")
# create formatter
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(name)s - [line:%(lineno)d]- %(levelname)s - %(message)s')
# 添加 formatter
ch.setFormatter(formatter)
fh.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(fh)
return logger
首先定义了一个函数yankerp 定义了logger_name log_file level参数。
1、首先创建logger对象,其实在这里logger只是一个变量而已,把logging.getLogger类实例化成一个logger对象
2、使用logger对象的其中的方法setLevel设置日志等级:(level)这里就是DEBUG
3、创建控制台,使用logging.StreamHandler() 方法,实例化生成对象ch
4、用过ch对象里面的setLevl方法来设置日志等级
5、创建文件,使用logging里面方法,FileHandler定义了file_name也就是yankai.log文件名称及 encoding:编码格式.
6、创建formatter定义了日志的输出格式实例化到formatter对象。
最后添加formatter 控制台/创建文件把formatter输出格式的对象添加到控制台/文件,最后使用刚开始实例化的logger对象把文件,控制台添加进入,最后返回logger对象。