订阅专栏
日志级别(5个等级),从低到高分别是:
DEBUG
INFO
WARNING
ERROR
CRITICAL
日志输出:
控制台日志
文件日志
logging 中的几个概念:
Logger:日志记录器,是应用程序中可以直接使用的接口。
Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久。
Formatter:格式化,用以配置日志的输出格式。
上述三者的关系是:一个 Logger 使用一个 Handler,一个 Handler 使用一个 Formatter。
输出到控制台
默认输出级别为WARNING
import logging logging.info("info") logging.debug("debug") logging.warning("warning") logging.error("error") logging.critical("critical") """ WARNING:root:warning ERROR:root:error CRITICAL:root:critical """
输出到文件
import logging filename = "{}.log".format(__file__) fmt = "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s" logging.basicConfig( level=logging.DEBUG, filename=filename, filemode="w", format=fmt ) logging.info("info") logging.debug("debug") logging.warning("warning") logging.error("error") logging.critical("critical")
打开日志文件
2018-06-21 14:32:29,904 - logging_demo.py[line:26] - INFO: info 2018-06-21 14:32:29,905 - logging_demo.py[line:27] - DEBUG: debug 2018-06-21 14:32:29,905 - logging_demo.py[line:28] - WARNING: warning 2018-06-21 14:32:29,905 - logging_demo.py[line:29] - ERROR: error 2018-06-21 14:32:29,905 - logging_demo.py[line:30] - CRITICAL: critical
常用参数
format: 日志格式 eg: "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s" datefmt:日志时间显示 eg: "%Y-%m-%d %H:%M:%S"
同时输出到控制台和文件
import logging # 创建logger对象 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # log等级总开关 # log输出格式 formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") # 控制台handler stream_handler = logging.StreamHandler() stream_handler.setLevel(logging.INFO) # log等级的开关 stream_handler.setFormatter(formatter) # 文件handler file_handler = logging.FileHandler("logging.log") file_handler.setLevel(logging.WARNING) # log等级的开关 file_handler.setFormatter(formatter) # 添加到logger logger.addHandler(stream_handler) logger.addHandler(file_handler) # 输出日志 logger.info("info") logger.debug("debug") logger.warning("warning") logger.error("error") logger.critical("critical")
日志格式
%(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: 打印日志信息
从配置文件读取日志配置
logging.conf
[loggers] keys = root [handlers] keys = logfile [formatters] keys = generic [logger_root] handlers = logfile [handler_logfile] class = handlers.TimedRotatingFileHandler args = ('test.log', 'midnight', 1, 10) level = DEBUG formatter = generic [formatter_generic] format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s
import logging
import logging.config logging.config.fileConfig('logging.conf') logging.debug('debug message') logging.info("info message") logging.warn('warn message') logging.error("error message") logging.critical('critical message')
执行效果test.log
2018-10-27 09:50:13,064 WARNI [root:13] warn message 2018-10-27 09:50:13,065 ERROR [root:14] error message 2018-10-27 09:50:13,065 CRITI [root:15] critical message
参考
Python中的logging模块
python logging 日志使用
16.6. logging — Logging facility for Python¶
所有 Python 程序员必须要学会的「日志」记录