本文转自python logging 配置,并对其进行了简单的排版。
在python中,logging由logger、handler、filter、formater四个部分组成,logger是提供我们记录日志的方法;handler是让我们选择日志的输出地方,如:控制台,文件,邮件发送等,一个logger添加多个handler;filter是给用户提供更加细粒度的控制日志的输出内容;formater用户格式化输出日志的信息。python中配置logging有三种方式。
第一种:基础配置
logging.basicConfig(filename="config.log",filemode="w",format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO)。
在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
- filename: 用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
- filemode: 文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
- format: 指定handler使用的日志显示格式。
- datefmt: 指定日期时间格式。
- level: 设置rootlogger(后边会讲解具体概念)的日志级别
- stream: 用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
format参数中可能用到的格式化串:
- %(name)s Logger的名字
- %(levelno)s 数字形式的日志级别
- %(levelname)s 文本形式的日志级别
- %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
- %(filename)s 调用日志输出函数的模块的文件名
- %(module)s 调用日志输出函数的模块名
- %(funcName)s 调用日志输出函数的函数名
- %(lineno)d 调用日志输出函数的语句所在的代码行
- %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
- %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
- %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
- %(thread)d 线程ID。可能没有
- %(threadName)s 线程名。可能没有
- %(process)d 进程ID。可能没有
- %(message)s 用户输出的消息
日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
propagete参数 :propagete=0,表示输出日志,但消息不传递;propagate=1是输出日志,同时消息往更高级别的地方传递。root为最高级别。
第二种:使用配置文件的方式配置logging
使用fileConfig(filename,defaults=None,disable_existing_loggers=Ture )函数来读取配置文件。
第三种:使用一个字典方式来写配置信息
然后使用dictConfig(dict,defaults=None, disable_existing_loggers=Ture )函数来瓦按成logging的配置.
#coding=utf-8
import os
import datetime
import logging
import logging.config
def genLogDict(logDir, logFile):
'''
配置日志格式的字典
'''
logDict = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"simple": {
'format': '%(asctime)s [%(name)s:%(lineno)d] [%(levelname)s]- %(message)s'
},
'standard': {
'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(levelname)s]- %(message)s'
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "simple",
"stream": "ext://sys.stdout"
},
"default": {
"class": "logging.handlers.RotatingFileHandler",
"level": "INFO",
"formatter": "simple",
"filename": os.path.join(logDir, logFile),
'mode': 'w+',
"maxBytes": 1024*1024*5, # 5 MB
"backupCount": 20,
"encoding": "utf8"
},
},
# "loggers": {
# "app_name": {
# "level": "INFO",
# "handlers": ["console"],
# "propagate": "no"
# }
# },
"root": {
'handlers': ['default'],
'level': "INFO",
'propagate': False
}
}
return logDict
def initLogConf():
"""
配置日志
"""
baseDir = os.path.dirname(os.path.abspath(__file__))
logDir = os.path.join(baseDir, "logs")
if not os.path.exists(logDir):
os.makedirs(logDir) # 创建路径
logFile = datetime.datetime.now().strftime("%Y-%m-%d") + ".log"
logDict = genLogDict(logDir, logFile)
logging.config.dictConfig(logDict)
if __name__ == '__main__':
initLogConf()
log = logging.getLogger(__file__)
print "print A"
log.info("log B")
在项目中加日志,在项目中新建文件名为log.py的文件并拷贝上段代码,需要加日志的代码文件引用下段代码
import logging
import log
log.initLogConf()
_logging = logging.getLogger(__file__)