python-logging

 

一、Logging概念总结:

Logger是一个树形层级结构,Logger可以包含一个或多个Handler和Filter,即Logger与Handler或Fitler是一对多的关系;
一个Logger实例可以新增多个Handler,一个Handler可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

 

 

 二、logging工作流程

 

 

 

三、logging配置文件支持以下三种方式加载

1)、通过logging.conf配置文件加载;logging.config.fileconfig('logging.conf') 

# 1、记录器logger

#定义记录器
[loggers]
keys=root
#定义根记录器
[logger_root]
level=DEBUG
handlers=streamhandler,filehandler
#---------------------------------------------------------------------------------
# 2、 处理器handler
#定义所有处理器
[handlers]
keys=filehandler,streamhandler

#定义子处理器
[handler_streamhandler]
class=StreamHandler
level=DEBUG
formatter=streamformatter
args=(sys.stdout,)

#定义子处理器
[handler_filehandler]
class=FileHandler
level=ERROR
formatter=fileformatter
args=('file.log','a')
#---------------------------------------------------------------------------------
# 3、 格式化器formatter
#定义所有格式化器
[formatters]
keys=fileformatter,streamformatter

[formatter_fileformatter]
format=%(asctime)s - %(name)s - %(levelname)s - PID:%(process)s - %(message)s

[formatter_streamformatter]
format=%(asctime)s - %(name)s - %(levelname)s - PID:%(process)s - %(message)s
logging.conf配置文件
import logging
import logging.config

logging.config.fileConfig("logging.conf")
logger = logging.getLogger("example01")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')
import logging
import logging.config

logging.config.fileConfig("logging.conf")
logger = logging.getLogger("example02")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

 

[loggers]
keys=root
 
[handlers]
keys=consoleHandler,fileHandler
 
[formatters]
keys=formatter
 
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
 
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stdout,)
 
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=formatter
args=('logs/test.log', 'D', 1, 30)
 
[formatter_formatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

 

2)、通过logging.json配置文件加载; 

{
    "version":1,
    "disable_existing_loggers":false,
    "formatters":{
        "simple":{
            "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        }
    },
    "handlers":{
        "console":{
            "class":"logging.StreamHandler",
            "level":"DEBUG",
            "formatter":"simple",
            "stream":"ext://sys.stdout"
        },
        "info_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"INFO",
            "formatter":"simple",
            "filename":"info.log",
            "maxBytes":"10485760",
            "backupCount":20,
            "encoding":"utf8"
        },
        "error_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"ERROR",
            "formatter":"simple",
            "filename":"errors.log",
            "maxBytes":10485760,
            "backupCount":20,
            "encoding":"utf8"
        }
    },
    "loggers":{
        "my_module":{
            "level":"ERROR",
            "handlers":["info_file_handler"],
            "propagate":"no"
        }
    },
    "root":{
        "level":"INFO",
        "handlers":["console","info_file_handler","error_file_handler"]
    }
}
logging.json配置文件

3)、通过logging.yaml配置文件加载;

version: 1
disable_existing_loggers: False
formatters:
        simple:
            format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
    console:
            class: logging.StreamHandler
            level: DEBUG
            formatter: simple
            stream: ext://sys.stdout
    info_file_handler:
            class: logging.handlers.RotatingFileHandler
            level: INFO
            formatter: simple
            filename: info.log
            maxBytes: 10485760
            backupCount: 20
            encoding: utf8
    error_file_handler:
            class: logging.handlers.RotatingFileHandler
            level: ERROR
            formatter: simple
            filename: errors.log
            maxBytes: 10485760
            backupCount: 20
            encoding: utf8
loggers:
    my_module:
            level: ERROR
            handlers: [info_file_handler]
            propagate: no
root:
    level: INFO
    handlers: [console,info_file_handler,error_file_handler]
logging.yaml配置文件

 

 StreamHandler

创建方法: sh = logging.StreamHandler(stream=None)

FileHandler

创建方法: fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)

NullHandler

NullHandler类位于核心logging包,不做任何的格式化或者输出。
本质上它是个“什么都不做”的handler,由库开发者使用。

Formatter 格式化器

使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。

创建方法: formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。

Filter 过滤器

Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。Filter基类只允许特定Logger层次以下的事件。

例如用‘A.B’初始化的Filter允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串来初始化,所有的事件都接受。

创建方法: filter = logging.Filter(name='')

四、名词解释

Logging.Formatter:这个类配置了日志的格式,在里面自定义设置日期和时间,输出日志的时候将会按照设置的格式显示内容。
Logging.Logger:Logger是Logging模块的主体,进行以下三项工作:
1. 为程序提供记录日志的接口
2. 判断日志所处级别,并判断是否要过滤
3. 根据其日志级别将该条日志分发给不同handler
常用函数有:
Logger.setLevel() 设置日志级别
Logger.addHandler() 和 Logger.removeHandler() 添加和删除一个Handler
Logger.addFilter() 添加一个Filter,过滤作用
Logging.Handler:Handler基于日志级别对日志进行分发,如设置为WARNING级别的Handler只会处理WARNING及以上级别的日志。
常用函数有:
setLevel() 设置级别
setFormatter() 设置Formatter

五、Formatter格式器

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: 打印日志信息

六、handler处理器

 

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET""POST"远程输出到HTTP服务器

示例1: 基于时间切割日志文件

# 基于时间回滚日志文件
import logging
from logging.handlers import TimedRotatingFileHandler
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
"""
filename:日志文件名的prefix;
when:是一个字符串,用于描述滚动周期的基本单位,字符串的值及意义如下:
“S”: Seconds    “M”: Minutes                  “H”: Hours
“D”: Days       “W”: Week day (0=Monday)      “midnight”: Roll over at midnight
interval: 滚动周期,单位有when指定,比如:when=’D’,interval=1,表示每天产生一个日志文件
backupCount: 表示日志文件的保留个数
"""
#每隔5秒钟切割一份日志文件,日志总文件数量保存20份。
# time_rotaing_filehandler = TimedRotatingFileHandler(filename='AA-AA-00-', when='S', interval=5, backupCount=20,encoding='utf-8')

#每分钟切换1份日志文件,日志总文件数量保存20份。
# time_rotaing_filehandler = TimedRotatingFileHandler(filename='AA-AA-00-', when='M', interval=1, backupCount=20,encoding='utf-8')

每天晚上12:00切换1份日志文件,日志总文件数量保存30份,即保留30天日志文件。
time_rotaing_filehandler = TimedRotatingFileHandler(filename='AA-AA-00-', when='midnight', interval=1, backupCount=30,encoding='utf-8')
time_rotaing_filehandler.suffix = "%F-%r.log"
time_rotaing_filehandler.setLevel(logging.INFO)
time_rotaing_filehandler.setFormatter(formatter)
logger.addHandler(time_rotaing_filehandler)
基于时间切割日志文件

 实例2: 基于日志文件大小回滚日志文件

import logging
from logging.handlers import RotatingFileHandler

#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)

Rthandler.setLevel(logging.INFO)

formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')

Rthandler.setFormatter(formatter)

logging.getLogger('').addHandler(Rthandler)
基于日志文件大小回滚日志

 

 参考:https://www.cnblogs.com/mq0036/p/12846216.html

 

 

 

 

 

 

 

 

 

 

posted @ 2023-08-09 15:26  vmsysjack  阅读(41)  评论(0编辑  收藏  举报