# ==========logging配置文件==========
# 定义logger模块,root是父类,必须存在,其他的自定义
# 非实例化使用,而是通过logging.getLogger(name)来获取对象。相当于向logging模块注册了一种日志打印
# 如果name为loggers里面keys的值,则调用对应的配置,如果name没有则调用默认(root)的配置
# name 中用点 . 表示继承关系
# 可以有多个,以逗号隔开
# loggers默认的父对象是root,非占位对象,某个对象打日志时,父对象也会收到日志,并再打一次。
[loggers]
keys=root,infoLogger
# ==========实现logger对应的配置信息==========
# 必须是 logger_name name为loggers中key的值
# level:日志级别,包括:CRITICAL,ERROR,WARNING,INFO,DEBUG
# handlers:日志处理器,可以有多个,以逗号隔开
# qualname:logger的名称,通过logging.getLogger(name)获取
# 如果获取的logger名称不存在,则调用默认(root)logger
# propagate:是否继承符类的配置信息,0:否 1:是
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_infoLogger]
handlers=consoleHandler,fileHandler
qualname=infoLogger
propagate=0
# ==========handlers的具体配置实现==========
# Handlers将logger发过来的信息进行准确地分配,以下包括控制台、文件;
# 一个logger可以拥有多个handler。
[handlers]
keys=consoleHandler,fileHandler
# 必须是"handler_name",其中name为handlers中keys的值
[handler_consoleHandler]
# class为logging包里面的handler处理器,要写完整的包名
class=StreamHandler
level=INFO
# formatter:日志输入格式
formatter=form02
# args:handler相关参数
args=(sys.stderr,)
[handler_fileHandler]
class=FileHandler
level=INFO
formatter=form01
args=('../logs/runlog.log', 'a')
# ==========日志输出格式化实现==========
# datefmt 日期格式 对应asctime
# ----------------------------
# 日志格式
# ----------------------------
# %(asctime)s 年-月-日 时-分-秒,毫秒
# %(filename)s 文件名,不含目录
# %(pathname)s 目录名,完整路径
# %(funcName)s 函数名
# %(levelname)s 级别名
# %(lineno)d 行号
# %(module)s 模块名
# %(message)s 日志信息
# %(name)s 日志模块名
# %(process)d 进程id
# %(processName)s 进程名
# %(thread)d 线程id
# %(threadName)s 线程名
#----------------------------
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s