Python | Logging实现日志输出到文件

记录下Python中使用Logging实现日志输出到文件,实例如下:

# -*- coding: UTF-8 -*- 
#!/usr/bin/python 

import logging 
from logging import handlers
 
# 创建一个logger并设置日志等级
logger = logging.getLogger()
logger.setLevel(logging.INFO) 

# 定义日志文件
logFile = './sdkup.log'

# 创建一个FileHandler,并将日志写入指定的日志文件中
fileHandler = logging.FileHandler(logFile, mode='a')
fileHandler.setLevel(logging.INFO) 
 
 # 或者创建一个StreamHandler,将日志输出到控制台
streamHandler = logging.StreamHandler()
streamHandler.setLevel(logging.INFO)

# 定义Handler的日志输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileHandler.setFormatter(formatter)
 
# 定义日志滚动条件,这里按日期-天保留日志
timedRotatingFileHandler = handlers.TimedRotatingFileHandler(filename=logFile, when='D')
timedRotatingFileHandler.setLevel(logging.INFO)
timedRotatingFileHandler.setFormatter(formatter)

# 添加Handler
logger.addHandler(fileHandler)
logger.addHandler(streamHandler)
logger.addHandler(timedRotatingFileHandler)

if __name__ == '__main__':
    logger.debug('Debug')
    logger.info('Info')
    logger.critical('Critical')

其中Formatter是给handler设置的,因为handler是负责把日志输出到哪里,所以是给它设置格式,而不是给logger;

那为什么level需要设置两次呢?

给logger设置是告诉它要记录哪些级别的日志,给handler设是告诉它要输出哪些级别的日志,相当于进行两次过滤。

这样的好处在于,当有多个日志去向时,比如既保存到文件,又输出到控制台,就可以分别给它们设置不同的级别;

logger 的级别是先过滤的,所以被 logger 过滤的日志 handler 也是无法记录的,这样就可以只改 logger 的级别而影响所有输出。

两者结合可以更方便地管理日志记录的级别。

而Formatter可以指定输出的内容和格式,其内置的参数如下:

%(name)s:Logger的名字
%(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:打印日志信息

另外python在自动分割日志文件方面提供了两个处理器,如下:


handlers.RotatingFileHandler -> 按照大小自动分割日志文件,一旦达到指定的大小重新生成文件
handlers.TimedRotatingFileHandler -> 按照时间自动分割日志文件

更多实例参照敬请右转学习:  https://www.cnblogs.com/nancyzhu/p/8551506.html

发布了44 篇原创文章 · 获赞 11 · 访问量 5437

猜你喜欢

转载自blog.csdn.net/Sampson_Hugo/article/details/103631385