日志级别:
Number Name
50 CRITICAL
40 ERROR
30 WARNING(默认)
20 INFO
10 DEBUG
**比设定的level低的level会被过滤掉,不打印
输出格式:
%(name)s 日志名称
%(asctime)s 日志时间
%(filename)s 文件名
%(pathname)s 文件的全路径名
%(funcName)s 函数名
%(levelname)s 日志等级
%(levelno)s 数字化日志等级
%(lineno)d 行数
%(module)s 模块名
%(msecs)d 时间中毫秒部分
%(process)d 进程ID
%(processName)s 进程名
%(thread)d 线程ID
%(threadName)s 线程名
一.基础basicConfig用法
import logging
logging.basicConfig(level = logging.INFO,format = ‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘)
logger=logging.getLogger(__file__) #如果不给定参数,默认参数为root
logger.info(‘this is a info message‘)
logger.debug(‘this is a debug message‘)
logger.error(‘this is a error message‘)
*补充*
basicConfig的参数:
level:设置日志级别
format:指定输出格式,如上面的输出格式
filename:创建FileHandler,当这个参数使用后,不再使用StreamHandler
filemode:文件写入方式,默认是a
datefmt:设定时间日期格式,这个格式会覆盖format里面的asctime的格式
stream:设定StreamHandler,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename参数同时指定时,stream会被忽略
二.FileHandler,StreamHandler日志输出到屏幕和console
import logging import time #create logger logger=logging.getLogger(__file__) logger.setLevel(logging.DEBUG) #create FileHandler filehandler=logging.FileHandler(‘a.log‘) filehandler.setLevel(logging.INFO) #create StreamFilehandler streamhandler=logging.StreamHandler() streamhandler.setLevel(logging.INFO) #Create formatter formatter=logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) formatter.datefmt="%Y-%m-%d %H:%M:%S" filehandler.setFormatter(formatter) streamhandler.setFormatter(formatter) logger.addHandler(filehandler) logger.addHandler(streamhandler) logger.info(‘this is a info message‘) logger.debug(‘this is a debug message‘) logger.error(‘this is a error message‘)
三.Config.ini文件来配置logging模块:
Config.ini文件:
######################Formatters################### [formatters] keys=f1 #定义f1 formatter,可以定义多个,key=f1,f2,f3... [formatter_f1] #注意格式是formatter_f1 format=%(filename)s-%(levelname)s-%(message)s datefmt=%Y-%m-%d %H:%M:%S #####################Handlers###################### [handlers] keys=h1,h2 #定义h1,h2两个handler,一个是FileHandler,一个是StreamHandler [handler_h1] #注意格式handler_h1 class=FileHandler args=(‘a.log‘,‘a‘) level=INFO formatter=f1 [handler_h2] #注意格式handler_h2 class=StreamHandler args=(sys.stdout,) #注意sys.stdout后面的,号 level=INFO formatter=f1 ###################loggers####################### [loggers] keys=root #root是父类,是必须的,还可以自定义其它的,key=root,l1,l2... [logger_root] #注意格式 level=DEBUG handlers=h1,h2 #同时输出到console和文件
import logging from logging.config import fileConfig fileConfig(‘logger_config.ini‘) logger1=logging.getLogger() logger1.info(‘this is a info message‘)
四.yaml 文件配置logging模块
logger.yaml:
version: 1
disable_existing_logger: False
formatters:
f1:
format: "%(filename)s-%(levelname)s-%(message)s"
datefmt: "%Y-%m-%d %H:%M:%S"
handlers:
h1:
class: logging.StreamHandler
level: INFO
formatter: f1
stream: ext://sys.stdout
h2:
class: logging.FileHandler
level: INFO
formatter: f1
filename: ‘a.log‘
loggers:
l1:
level: DEBUG
handlers: [h1,h2]
propagate: no
root:
level: INFO
handlers: [h1,h2]
import logging import yaml from logging.config import dictConfig with open(‘logger.yaml‘,‘r‘) as f: config=yaml.safe_load(f) dictConfig(config) logger=logging.getLogger() logger.info(‘this is a info message‘)
五.json文件配置logging模块
logger.json:
{
"version": 1,
"disable_existing_loggers": false,
"formatters":{
"f1":{
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
"datefmt": "%Y-%m-%d %H:%M:%S"
}
},
"handlers": {
"h1": {
"class": "logging.FileHandler",
"level": "INFO",
"formatter": "f1",
"filename": "a.log"
},
"h2": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "f1",
"stream": "ext://sys.stdout"
}
},
"loggers":{
"l1":{
"level": "DEBUG",
"handlers": [
"h1",
"h2"
]
}
},
"root":{
"level":"DEBUG",
"handlers":["h1","h2"]
}
}
import logging import json from logging.config import dictConfig with open(‘logger.json‘,‘r‘) as f: config=json.load(f) dictConfig(config) logger=logging.getLogger() logger.info(‘this is a info message‘)
原文:https://www.cnblogs.com/xia-dong/p/11833563.html