您的位置:首页 > 编程语言 > Python开发

Python logging模块

2017-12-18 19:56 357 查看
logger是一个树结构,默认有个根root,其他logger都是其上的枝桠

一、简单使用

import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')

屏幕上打印:
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message


默认情况下,logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),默认的日志格式为日志级别:Logger名称:用户输出消息。

二、通过logging.basicConfig函数对日志的输出格式及方式做相关配置

import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='D:/test.log',
filemode='w')
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

查看D:/test.log的内容为:
Mon, 18 Dec 2017 18:51:18 test.py[line:8] INFO info message
Mon, 18 Dec 2017 18:51:18 test.py[line:9] WARNING warning message
Mon, 18 Dec 2017 18:51:18 test.py[line:10] ERROR error message
Mon, 18 Dec 2017 18:51:18 test.py[line:11] CRITICAL critical message


logging.basicConfig函数各参数:

filename: 指定日志文件名

filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’

format: 指定输出的格式和内容,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: 打印日志信息

datefmt: 指定时间格式,同time.strftime()

level: 设置日志级别,默认为logging.WARNING

stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

三、handler 将日志同时输出到指定位置

1、将日志输出到屏幕

import logging
logger = logging.getLogger('test')
logger.addHandler(logging.StreamHandler())  # 添加StreamHandler
logger.setLevel(logging.INFO)  # 输出所有大于INFO级别的log
logger.info('info message message.')
logger.debug('debug message.')  # 不输出

屏幕上打印:
info message message.


2、将日志输出到文件

import logging
logger = logging.getLogger('test')
logger.addHandler(logging.StreamHandler())
logger.addHandler(logging.FileHandler('D:/test1.log'))  # 再添一个FileHandler
logger.setLevel(logging.INFO)  # 输出所有大于INFO级别的log
logger.info('info  message.')
logger.debug('debug message.')  # 不输出

把日志同时输出到屏幕和日志文件中:
info  message.


3、设定日志输出级别

import logging
logger = logging.getLogger('test')
logger.setLevel(logging.INFO)  # 输出所有大于INFO级别的log
fmt = logging.Formatter('%(name)s - %(levelname)s - %(asctime)s - %(message)s')
# 添加StreamHandler,并设置级别为WARNING
stream_hdl = logging.StreamHandler()
stream_hdl.setLevel(logging.WARNING)
stream_hdl.setFormatter(fmt)
logger.addHandler(stream_hdl)
# 添加FileHandler,并设置级别为DEBUG
file_hdl = logging.FileHandler('D:/test2.log')
file_hdl.setLevel(logging.DEBUG)
file_hdl.setFormatter(fmt)
logger.addHandler(file_hdl)

logger.info('info  message.')
logger.debug('debug message.')

屏幕不输出日志
日志文件test2输出日志:
test - INFO - 2017-12-18 19:30:17,813 - info  message.


StreamHandler级别(WARNING)>log级别(info),在屏幕只输出>=WARNING日志

FileHandler级别(DEBUG)< log级别(info),在日志文件只输出>=INFO的日志

四、日志备份

import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('test')
logger.setLevel(logging.INFO)  # 输出所有大于INFO级别的log
fmt = logging.Formatter('%(name)s - %(levelname)s - %(asctime)s - %(message)s')
file_hdl = RotatingFileHandler('D:/test3.log', maxBytes=10*1024*1024,backupCount=5) #最多备份5个日志文件,每个日志文件最大10M
file_hdl.setLevel(logging.DEBUG)
file_hdl.setFormatter(fmt)
logger.addHandler(file_hdl)

logger.info('info  message.')
logger.debug('debug message.')


五、通过logging.config模块配置日志

logging.config配置文件如下:

[loggers]
keys=root,simpleExample

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=


程序读取配置文件:

import logging
import logging.config

logging.config.fileConfig("D:/logging.conf")  # 采用配置文件

# create logger
logger = logging.getLogger("simpleExample")

# "application" code
logger.debug("debug message")
logger.info("info message")
logger.warning("warn message")
logger.error("error message")
logger.critical("critical message")

在屏幕输出:
2017-12-18 19:52:44,533 - simpleExample - DEBUG - debug message
2017-12-18 19:52:44,534 - simpleExample - INFO - info message
2017-12-18 19:52:44,534 - simpleExample - WARNING - warn message
2017-12-18 19:52:44,534 - simpleExample - ERROR - error message
2017-12-18 19:52:44,534 - simpleExample - CRITICAL - critical message
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: