logging日志模块的使用以及多进程日志的改写 python

2021-03-11 14:56:08 浏览数 (1)

本文主要用于介绍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)

三 多进程日志的配置

上述日志只适用于单进程使用,一旦多进程使用,就会出现第二天的日志只会有一个进程的日志输出到最新文件中,其他的日志依旧在旧的日志文件中输出,无法跳转到新的日志文件中,所以就需要自定义新的多进程logging日志

具体代码就不详细讲解了,详见https://github.com/LingandKevin/logging

0 人点赞