logging

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志输出格式等。

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志输出格式等。

1.logging日志级别

下表是logging库的五个级别:

日志等级(level)

描述

DEBUG

最详细的日志信息,典型应用场景是 问题诊断

INFO

信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确 认一切都是按照我们预期的那样进行工作

WARNING

信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确 认一切都是按照我们预期的那样进行工作

ERROR

信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确 认一切都是按照我们预期的那样进行工作

CRITICAL

当发生严重错误,导致应用程序不能继续运行时记录的信息

1.1 调整日志输出级别

logging.basicConfig(filename, filemode, level)
# level:设置的输出等级,共五种(与表格一致),指定形式如logging.DEBUG
# filename: 设置日志的输出文件,如"test.log"。如果不指定,默认输出到控制台
# filemote: 输出到文件的模式,与open函数一致,如"w"先清空后写入,"a"附加

1.2 创建指定级别的日志

函数

说明

logging.DEBUG(msg, *args, **kwargs)

创建一条严重级别为DEBUG的日志记录

logging.info(msg, *args, **kwargs)

创建一条严重级别为INFO的日志记录

logging.warning(msg, *args, **kwargs)

创建一条严重级别为WARNING的日志记录

logging.error(msg, *args, **kwargs)

创建一条严重级别为ERROR的日志记录

logging.critical(msg, *args, **kwargs)

创建一条严重级别为CRITICAL的日志记录

logging.log(level, *args, **kwargs)

创建一条严重级别为level的日志记录

1.3 实例1

import logging
# logging.basicConfig(filename="demo.log", filemode='w', level=logging.DEBUG)
logging.debug("this is debug")
logging.info("this is info")
logging.warning("this is warning")
logging.error("this is error")
logging.critical("this is critical")

结果如下

我们可以看到,我们创建了5条日志,但是只输出了三条。**原因是我们默认的日志输出等级为WARNING,优先级低于这个的不会输出。**此时,指定输出等级就有作用了。

1.4 实例2

import logging
logging.basicConfig(filename="demo.log", filemode='w', level=logging.DEBUG)
logging.debug("this is debug")
logging.info("this is info")
logging.warning("this is warning")
logging.error("this is error")
logging.critical("this is critical")

1.5 改变公共信息

从上面两个实例,可以看到输出内容前有一个公共信息,比如DEBUG:root

这里面DEBUG指的是日志的输出等级,root回来补充!!!

其实这里也是可以自定义的

改变公共信息,需要的是指定logging.basicConfig的参数format

format

描述

%(levelno)s

打印日志级别的数值

%(levelname)s

打印日志级别名称

%(pathname)s

打印当前执行程序的路径,其实就是sys.argv[0]

%(filename)s

打印当前执行程序名

%(funcName)s

打印日志的当前函数

%(lineno)d

打印日志的当前行号

%(thread)d

打印线程ID

%(threadName)s

打印线程名称

%(process)d

打印进程ID

%(message)s

打印日志信息,主要使用这个参数,这个就是必须写上的

%(asctime)s

打印当前时间

如果需要使用多个这些格式,用|来连接。

1.6 实例3

import logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s | %(message)s")
logging.debug("this is debug")

控制台结果如下

2022-12-03 18:01:00,261 | this is debug

2.组件

四个核心类(组件)

名称

作用

Loggers

记录器,提供应用程序代码直接使用的接口

Handlers

处理器,将记录器产生的日志发送至目的地

Filters

过滤器,提供更好的粒度控制,决定哪些日志会被输出

Formatters

格式化器,设置日志内容的组成结构和消息字段

工作流程

2.1 Loggers

记录器,提供应用程序代码直接使用的接口。相当于笔,每个笔都有一个标识,不同的笔写下不同的东西。

from logging
logger = logging.getLogger(__name__)  # 创建一个画笔
# 决定日志记录的级别
logger.setLevel(level)  # level为级别,如logging.DEDBUG

2.2 StreamHandler

标准输出stdout(如显示器)分发器。

from logging
sh = logging.StreamHandler(stream=None)  # 创建一个处理器
# 设置级别
sh.setLevel(level)  # 参数同上
# 设置格式
sh.setFormatter(formatters)  # formatters是Formatters对的对象,后面会讲到

2.3 FileHandler

from logging
sh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)  # 创建一个处理器
# 设置级别
sh.setLevel(level)  # 参数同上
# 设置格式
sh.setFormatter(formatters)  # formatters是Formatters对的对象,后面会讲到

处理器除了上面两种还有一些,需要或遇到的时候百度!!!

2.4 Formatters

格式化器,设置日志内容的组成结构和消息字段。

import logging
ft = logging.Formatter.__init__(fmt=None, datefmt=None, style="%")
# style: 默认%,表示%(<dictionary key>s)格式的字符串。无特别需要,别动!!!

fmt参数构成与1.5节中提到的format参数一致

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
Java 编译器 Linux
使用Commons Logging22
使用Commons Logging22
25 3
|
4月前
|
数据库
You are not using binary logging
You are not using binary logging
22 0
|
7月前
|
关系型数据库 MySQL Unix
logging模块介绍
logging模块介绍
|
存储 Unix Python
logging模块
logging模块
49 0
Java:日志输出JDK Logging、commons-logging、log4j、SLF4J、Logback
Java:日志输出JDK Logging、commons-logging、log4j、SLF4J、Logback
159 0
|
监控 Java Apache
java日志commons-logging/log4j/slf4j/logBack需要知道的几件事
如果对于commons-loging、log4j、slf4j、LogBack等都已经非常清楚了,可以忽略本文。几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对这块有更深刻理解的同学,也贡献出自己的知识和见解。
1640 0
|
Linux Apache
|
监控 Apache