最详细的还是 官方文档
最简单的使用
# -*- coding:utf-8 -*-
import logging
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
默认情况下,输出到屏幕,只输出warn及以上信息。运行结果:
$ python log_test.py
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
更改日志级别
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(level=logging.INFO)
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
运行结果:
$ python log_test.py
INFO:root:info message
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message
输出日志到文件
# -*- coding:utf-8 -*-
import logging
logging.basicConfig(filename='log.log', level=logging.INFO, format='[%(asctime)s][%(process)d][%(thread)d][%(filename)s][line:%(lineno)d][%(levelname)s] %(message)s')
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
运行,屏幕上没有任何输出,但是目录下多了log文件,内容如下:
[2020-02-06 23:08:31,586][439325][140563023099712][log.py][line:9][INFO] info message
[2020-02-06 23:08:31,587][439325][140563023099712][log.py][line:10][WARNING] warning message
[2020-02-06 23:08:31,587][439325][140563023099712][log.py][line:11][ERROR] error message
[2020-02-06 23:08:31,587][439325][140563023099712][log.py][line:12][CRITICAL] critical message
两个重要的官方示例
示例一
import logging
# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
# add ch to logger
logger.addHandler(ch)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
从命令行运行此模块生成以下输出:
$ python simple_logging_module.py
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message
示例二
以下 Python 模块创建的记录器、处理程序和格式化程序几乎与上面列出的示例中的相同,唯一的区别是对象的名称:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
# create logger
logger = logging.getLogger('simpleExample')
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
tip: getLogger() 返回对具有指定名称的记录器实例的引用(如果已提供),或者如果没有则返回 root 。
这是 logging.conf 文件:
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
format=[%(asctime)s][%(process)d][%(thread)d][%(filename)s][line:%(lineno)d][%(levelname)s]%(message)s
输出几乎与不基于配置文件的示例相同:
$ python simple_logging_config.py
2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message
2005-03-19 15:38:55,979 - simpleExample - INFO - info message
2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message
2005-03-19 15:38:56,055 - simpleExample - ERROR - error message
2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message
配置文件方法比 Python 代码方法有一些优势,主要是配置和代码的分离以及非开发者轻松修改日志记录属性的能力。