总结
- 打印或记录trackback信息
yaml_test.error("ii", exc_info=True)
logging.exception('除0异常')
- 根据日志的级别往下过滤日志信息
- yaml 或json方式配置日志参数
python 记录日志的logging
- Logger:即 Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作 Log Record。
- Log Record:就代指生成的一条条日志记录。
- Handler:即用来处理日志记录的类,它可以将 Log Record 输出到我们指定的日志位置和存储形式等,如我们可以指定将日志通过 FTP 协议记录到远程的服务器上,Handler 就会帮我们完成这些事情。
- Formatter:实际上生成的 Log Record 也是一个个对象,那么我们想要把它们保存成一条条我们想要的日志文本的话,就需要有一个格式化的过程,那么这个过程就由 Formatter 来完成,返回的就是日志字符串,然后传回给 Handler 来处理。
- formatter 参数
%(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。
%(processName)s:打印线程名称。
%(module)s:打印模块名称。
%(message)s:打印日志信息。 - Filter:另外保存日志的时候我们可能不需要全部保存,我们可能只需要保存我们想要的部分就可以了,所以保存前还需要进行一下过滤,留下我们想要的日志,如只保存某个级别的日志,或只保存包含某个关键字的日志等,那么这个过滤过程就交给 Filter 来完成。
- Parent Handler:Handler 之间可以存在分层关系,以使得不同 Handler 之间共享相同功能的代码。
以上就是整个 logging 模块的基本架构和对象功能,了解了之后我们详细来了解一下 logging 模块的用法。
以下代码运行环境是python 3.6
全局配置模式
def basic_log():
logging.basicConfig(level=logging.DEBUG,
filename='log.log',
datefmt='%Y.%m.%d %H:%M:%S',
format='%(asctime)s -%(module)s -%(funcName)s - %(levelname)s -%(lineno)d -%(message)s')
return logging.getLogger(__name__)
handler(多handler模式) 配置
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)
format = '%(asctime)s -%(module)s -%(funcName)s - %(levelname)s -%(lineno)d -%(message)s'
file_handler = logging.FileHandler("log.log")
formatter = logging.Formatter(format)
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(level=logging.DEBUG)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
return logger
配置共享,个人感觉不好用
def handler_share():
logger = logging.getLogger('main')
logger.setLevel(level=logging.DEBUG)
# Handler
handler = logging.FileHandler('result.log')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
return logger
yaml或json配置模式
yaml配置
version: 1
formatters:
brief:
format: "%(asctime)s - %(message)s"
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class : logging.StreamHandler
formatter: brief
level : DEBUG
stream : ext://sys.stdout
file:
class : logging.handlers.RotatingFileHandler
formatter: simple
level: DEBUG
filename: info.log
error:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: error.log
maxBytes: 10485760
backupCount: 20
encoding: utf8
loggers:
main.core:
level: DEBUG
handlers: [console, file, error]
root:
level: DEBUG
handlers: [console, file, error]
读取yaml的handler
def handler_yaml(file_name='log.yaml', default_level=logging.INFO):
current_dir = os.path.abspath(os.curdir)
path = pathlib.Path("{}/{}".format(current_dir, file_name))
if path.is_file():
with open(path, 'r', encoding='utf-8') as f:
config = yaml.load(f)
logging.config.dictConfig(config)
else:
logging.basicConfig(level=default_level)
return logging.getLogger(__name__)
测试
参考:
https://cuiqingcai.com/6080.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io