python中logging模块的认识
- loggers:理解为创建的一支笔,后面我们的日志就是用这个笔来写的
- handlers:决定了我们创建的笔要把日志写到什么地方,常见的就是控制台和日志文件
- filters:这个不常用,就是决定我们什么笔能写日志,什么笔不能写日志
- formatters这个决定我们的日志长成什么样子,输出格式是什么样的
logging模块使用过程
- 创建一只笔(logger):想一下,没笔怎么写日志呢?对不对
- 创建handlers:就是通道,决定你往哪里写
- 创建formatters:一定要用formatters装饰你的handler,其实就是设置日志的格式
- handlers加入到logger:这个时候才是调用info,error,warning等方法的时候
代码演示
# -*- coding: utf-8 -*-
import logging
logger = logging.getLogger("mylog") # 创建记录器,这个是单例的
logger.setLevel(logging.INFO) # 设置日志的级别,这个地方设置的和后面handler里面设置有覆盖关系,logger的会覆盖handler里面的
# 创建handler
consoleHandler = logging.StreamHandler() # 这是往控制台写的
consoleHandler.setLevel(logging.DEBUG)
fileHandler = logging.FileHandler(filename="appLog") # 这是往文件写的,我们不设置日志等级,将使用logger的日志等级
# 创建formatters
formatter = logging.Formatter("%(asctime)s-%(filename)s-%(levelname)s-%(message)s")
# 用formatters装饰我们的handlers
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# 将handlers和logger绑定
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)
if __name__ == '__main__':
logger.debug("this is debug log")
logger.info("this is info log")
logger.warning("this is warning log")
logger.error("this is error log")
logger.critical("this is critical log")
实际在生产项目中,采用配置文件的方式才是最推荐的
这是日志的配置文件
[loggers]
keys=root,mylog
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
qualname=root
[logger_mylog]
level=INFO
handlers=consoleHandler,fileHandler
qualname=mylog
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('../testoutput/logs/newlog.log', 'midnight',1,0)
[formatter_simpleFormatter]
format=%(levelname)8s - %(name)s - %(asctime)s - %(module)s.%(funcName)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
这是日志使用的代码
# -*- coding: utf-8 -*-
import logging.config
logging.config.fileConfig("../config/logging.conf")
logger = logging.getLogger("mylog")
logger.debug("this is debug log")
logger.info("this is info log")
logger.warning("this is warning log")
logger.error("this is error log")
logger.critical("this is critical log")
最后执行的结果如下: