在我们使用logging
的时候,它本身自带了一些对于类自身的一些方法即类方法,还有一些实例方法,在通常情况下我们会使用实例方法。
使用logging就能实现对日志的记入,首先配置类方法的配置文件
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
filename = "app.log",
filemode = "a",
# handlers 为日志处理器,可以设置多个,这里设置了控制台和文件处理器 , 推荐使用
handlers=[
logging.FileHandler("app.log"),
logging.StreamHandler()
]
logging.debug("This is a debug message")
logging.warning("This is a warning message")
logging.error("This is an error message")
logging.critical("This is a critical message")
在 Python 的 logging 库中,主要有三个重要组件,分别是记录器(Logger)、处理器(Handler)、格式化器(Formatter),这些是需要进行实例化的实例方法 。
它是日志记录的核心组件,用于收集日志信息。可以通过logging.getLogger(name)
方法创建,name
是记录器的名称,若不指定名称则使用根记录器。记录器有自己的日志级别,当一条日志消息产生时,会将消息的级别与记录器的级别进行比较,只有消息级别高于或等于记录器的级别时,消息才会被处理。
# 创建一个 name = name 的 记录器
test_logger = logging.getLogger('name')
# 表示记入的最低水平
test_logger.setLevel(logging.debug)
负责将记录器收集到的日志信息发送到指定的目标,比如控制台、文件、网络等。常见的处理器有StreamHandler
(将日志输出到控制台或类似文件的对象)、FileHandler
(将日志输出到磁盘文件)等。
处理器要放到记录器中
处理器类型 | StreamHandler |
FileHandler |
RotatingFileHandler |
TimedRotatingFileHandler |
---|---|---|---|---|
功能 | 将日志消息输出到控制台 | 将日志消息写入文件 | 当文件达到一定大小后自动轮转日志文件 | 按照时间间隔轮转日志文件 |
可选参数 | stream (指定输出流,默认是 sys.stderr ) |
filename (文件名)、mode (文件打开模式,默认是 'a' )、encoding (文件编码方式) |
filename 、maxBytes (文件最大字节数)、backupCount (备份文件数量)、encoding |
filename 、when (时间间隔单位)、interval (时间间隔数量)、backupCount (备份文件数量)、encoding |
示例 | console_handler = logging.StreamHandler(sys.stdout) |
file_handler = logging.FileHandler('example.log', mode='w', encoding='utf - 8') |
rotating_handler = RotatingFileHandler('rotating.log', maxBytes = 1024, backupCount = 3, encoding='utf - 8') |
timed_rotating_handler = TimedRotatingFileHandler('timed.log', when='D', interval = 1, backupCount = 3, encoding='utf - 8') |
logger.addHandler(console_handler)
console_handler.setLevel(logging.INFO)
file_handler.setLevel(logging.ERROR)
用于定义日志信息的输出格式,比如可以指定日志的时间、级别、来源、具体消息等信息以何种样式呈现。
格式化器要放到处理器中
占位符 | 说明 |
---|---|
%(asctime)s | 时间(可指定格式) |
%(levelname)s | 日志级别(DEBUG、INFO等) |
%(message)s | 日志消息内容 |
%(name)s | 记录器的名称 |
%(filename)s | 当前文件名 |
%(lineno)d | 当前行号 |
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
exception
try :
1 / 0
except:
logging.exception("An exception occurred")
import logging
from logging.handlers import TimedRotatingFileHandler
# 创建一个日志管理系统
all_logger = logging.getLogger('all')
all_logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.ERROR)
file_handler = TimedRotatingFileHandler('E:/ai/flask/gitee_front_end_project/ncst_acmer_management_system/log/all.log' , when='D' , backupCount=90 , encoding='utf-8')
file_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s - %(lineno)d - %(name)s - %(message)s")
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
all_logger.addHandler(console_handler)
all_logger.addHandler(file_handler)