本文主要用于介绍python logging的基本使用
一 logging日志模块的介绍
1. logging是python的第三方模块, python logging官方文档
下面列出了模块定义的基本类及其功能。
- Loggers 记录器公开应用程序代码直接使用的接口。
- Handlers 处理程序将日志记录(由记录器创建)发送到适当的目标。
- Filters 过滤器提供了更精细的设施,用于确定要输出的日志记录。
- Formatters Formatters指定最终输出中日志记录的布局。
2.logging日志级别
所有的日志输出都需要指定级别,logging日志定义了以下级别
Level(级别) | Numeric value(对应的值) |
---|---|
NOTSET | 0 |
DEBUG | 10 |
INFO | 20 |
ERROE | 30 |
WARNING | 40 |
CRITICAL | 50 |
3.Formatters日志输出的格式
代码语言:javascript复制'%(asctime)s|%(processName)s|%(threadName)s|%(levelname)s|%(pathname)s|%(filename)s:%(lineno)d|%(funcName)s|%(message)s'
name | 格式 | 描述信息 |
---|---|---|
asctime | %(asctime)s | 日志显示时间,比如: 2019-05-13 22:12:11,337 |
processName | %(processName)s | 显示当前进程 |
threadName | %(threadName)s | 显示当前线程 |
levelname | %(levelname)s | 当前日志级别 |
filename | %(levelname)s | 当前所在的py文件名 |
lineno | %(lineno)d | 当前日志输出所在的行数 |
funcName | %(funcName)s | 当前所在的函数名字 |
message | %(message)s | 当前输出的信息 |
pathname | %(pathname)s | 当前py文件的完整路径 |
二 logging的简单配置
1.简单配置:定义日志级别和日志文件名
日志输出格式也简单 INFO:root:info message
代码语言:javascript复制# 导入logging 模块
import logging
# 设置logging的级别和日志文件名
logging.basicConfig(level=logging.INFO, filename='logger.log')
# 开始测试日志的输出
logging.info("logging info")
# 输出格式为INFO:root:info message
所以接下来我们需要完善日志的配置
2.自定义日志的格式
在上一段落中已经介绍了logging支持很多的输出格式
日志中输出显示: [2019-05_13 23:08:01]|MainProcess|MainThread|INFO|python.py:13|<module>|logging message
代码语言:javascript复制import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', # 日志输出格式
datefmt='[%Y-%m_%d %H:%M:%S]', # 日志显示的日期
filename='logger.log', # 日志文件名
filemode='a' # 日志读写模式
)
logging.info("logging message")
但是此方式日志只是显示在日志文件中,无法输出到控制台
3. 使用 handlers 模块同时将日志输出到控制台和日志文件中,同时设置日志为每天一个日志文件
输出文本:
代码语言:javascript复制2019-05-13 23:33:15,964|MainProcess|MainThread|INFO|E:/pythonSpider/loggingDefine/python.py|python.py:31|<module>|1111111
代码语言:javascript复制import logging
from logging import handlers
# 日志输出格式
strDefaultFormatter = '%(asctime)s|%(processName)s|%(threadName)s|%(levelname)s|%(pathname)s|%(filename)s:%(lineno)d|%(funcName)s|%(message)s'
# 设置日志文件以及设置日志按天进行输出日志文件
objRotatingHandler = handlers.TimedRotatingFileHandler(
"logger.log", # 日志文件
when='D', # 什么时候日志的切换
)
# 设置默认的日志输出格式
objFormatter = logging.Formatter(strDefaultFormatter)
objRotatingHandler.setFormatter(objFormatter)
logging.getLogger().addHandler(objRotatingHandler)
logging.getLogger().propagate = False
# 将日志同时输出控制台和日志文件中
objConsoleHandler = logging.StreamHandler()
objConsoleHandler.setFormatter(objFormatter)
logging.getLogger().addHandler(objConsoleHandler)
# 设置日志的级别
logging.getLogger().setLevel(logging.INFO)
# 设置requests模块请求是的日志级别
logging.getLogger("requests").setLevel(logging.NOTSET)
# 设置urllib3的日志级别
logging.getLogger("urllib3").setLevel(logging.NOTSET)
# 测试
logging.info(1111111)