APP自动化-日志收集

一、日志收集

1、日志相关概念

日志的概念:日志就是用于记录系统运行时的信息,对一个事件的记录。

1.1 日志的作用
  • 调试程序
  • 可以用来判断程序是否运行正常
  • 可以用来分析和定位问题
  • 可以用来做用户行为分析和数据统计
1.2 日志的级别
  • 调试级别 DEBUG 记录的一些代码的调试信息
  • 信息级别 INFO 记录一些正常的操作信息
  • 警告级别 Warring 记录的是一些警告日志信息,但不会影响系统的功能及正常运行
  • 错误级别 Error 记录的是系统运行时的错误信息,说明系统的某些功能不能正常运行
  • 严重错误级别 critical 记录的系统运行时的严重错误信息,有可能导致整个系统都不能运行。

2、logging模块

logging是python自带的日志收集模块

2.1 logging的基本用法
  • 通过logging模块来输出日志信息.使用前需要导入logging模块
  • 使用方法:
    • logging.debug("这是一条调试级别的日志")
    • logging.info("这是一条信息级别的日志")
  • 注意点:logging模块默认的级别是warring级别,日志信息"如果设置了对应级别,那么会输出大于或等于对应级别的日志信息
#  导包
import logging

# 调用logging输出日志
logging.debug("这是一条调试级别的日志")
logging.info("这是一条信息级别的日志")
logging.warning("这是一条警告级别的日志")
logging.error("这是一条错误级别的日志")
logging.critical("这是一条严重级别的日志")

2.2 logging的日志级别设置
  • 日志级别的设置: logging.basicConfig(level=logging.DEBUG)
  • 日志级别的选择:
    • 开发环境和测试环境:可以使用DEBUG或者INFO级别
    • 生产环境:建议使用WARRING或者EEROR
2.3 logging的日志格式设置
  • 日志格式设置: logging.basciConfig(format=fmt) # fmt表示的日志格式字符串
#  导包
import logging
# 定义一个格式化的字符串
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
2.4 设置日志的级别&格式

logging.basicConfig(level=logging.DEBUG, format=fmt)

2.5 调用logging输出日志
'''
* 将日志输出到文件:

logging.basicConfig(filename = 'log/a.log')    # 日志文件保存的目录必须手动创建

如果将日志输出到文件当中,就不会在控制台打印出对应的日志信息了。
'''


#  导包
import logging
logging.basicConfig(filename = 'log/a.log')
# 定义一个格式化的字符串
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
# 设置日志的级别
logging.basicConfig(level=logging.DEBUG, format=fmt, filename='log/a.log')
# 调用logging输出日志
logging.debug("这是一条调试级别的日志")
logging.info("这是一条信息级别的日志")
logging.warning("这是一条警告级别的日志")
logging.error("这是一条错误级别的日志")
logging.critical("这是一条严重级别的日志")

3、logging的高级用法

3.1 logging的四大组件介绍
  • 四大组件
    • 日志器 logger : 是程序的入口,主要用来记录日志的信息
    • 处理器 handler : 决定了日志的输出目的地
    • 格式器 formatter :决定了日志的输出格式
    • 过滤器 filter: 决定哪些日志信息被输出,哪些被丢弃
3.2 logger类
  • 创建日志器:
    • logger = logging.getLogger() 创建的日志器不带参数,默认的日志名称是root
    • logger = logging.getLogger("myLogger") 创建的日志器带了参数,日志名称为对应的参数名
    • 如果创建的日志器名称相同,这两个日志器使用的是同一个日志名称。
  • 日志器常用方法:
    • 输出日志信息:
      • logger.debug(msg)
      • logger.info(msg)
      • logger.warring(msg)
    • 设置日志的级别: logger.setLever(logging.INFO)
    • 添加处理器: logger.addHandler(handler)
3.3 handler类
  • 处理器的作用:决定日志输出到目的地
  • 常用处理器类:
    • logging.StreamHandler 将日志信息输出到控制台
    • logging.hanlders.TimedRotatingFileHandler 将日志信息输出到文件,并支持按时间来切割
  • 处理器类常用的方法
    • 设置日志的级别 handler.setLevel()
    • 在处理器当中添加格式器 handler.setFormatter()
import logging
import logging.handlers
import time

logger = logging.getLogger("myLogger")  # 创建logger日志器
logger.setLevel(logging.DEBUG)  # 设置日志器的级别

# 创建 输出日志到文件的处理器, 文件按时间来切割的
handler = logging.handlers.TimedRotatingFileHandler("log/test.log", when='S', interval=30, backupCount=3)
handler.setLevel(logging.INFO)

# 将处理器添加到日志器
logger.addHandler(handler)
while True:
    #  输出日志信息
    time.sleep(2)
    logger.info("这是一条信息级别的日志!")

3.4 formatter类
  • 格式器: 用来格式化日志信息的格式创建格式
    • formatter = logging.formatter(fmt=fmt) # fmt参数表示的是格式化的字符串可以将格式器添加到处理器
3.5 将日志输出到控制台和文件中
import logging
import logging.handlers
import time

# 1. 创建日志器
logger = logging.getLogger()
# 设置日志器的级别为DEBUG,这样可以捕获更详细的日志信息,方便调试等场景
logger.setLevel(logging.DEBUG)

# 2. 创建处理器(同时创建输出到控制台和输出到文件的处理器)
# 创建输出到控制台的StreamHandler,用于实时查看日志信息
console_handler = logging.StreamHandler()
# 创建输出到文件的TimedRotatingFileHandler,实现按时间轮转日志文件
# 参数说明:
# - "log/log.log" 是日志文件的存储路径及文件名。
# - when='M' 表示按分钟轮转日志文件。
# - interval=1 表示每1个单位时间(结合when='M',就是每分钟)进行轮转。
# - backupCount=3 表示最多保留3个旧的日志文件备份。
file_handler = logging.handlers.TimedRotatingFileHandler("log/log.log", when='M', interval=1, backupCount=3)

# 统一设置处理器的级别为INFO,意味着只有INFO及更高级别的日志会通过这些处理器输出
handlers = [console_handler, file_handler]
for handler in handlers:
    handler.setLevel(logging.INFO)

# 3. 创建格式器,定义日志输出的格式
# 格式包含了时间、日志级别、日志器名称、文件名、函数名、行号以及具体日志消息内容等信息
fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
formatter = logging.Formatter(fmt=fmt)

# 4. 将格式器添加到各个处理器当中
for handler in handlers:
    handler.setFormatter(formatter)

# 5. 将处理器添加到日志器
for handler in handlers:
    logger.addHandler(handler)

# 6. 循环输出日志信息示例(这里只是简单模拟持续输出日志的情况,实际应用中根据业务逻辑替换对应日志记录内容)
while True:
    time.sleep(3)
    logger.info("这是一条信息级别的日志")
    logger.warning("这是一条警告级别的日志")

在实际应用场景中,建议可以将日志相关的配置代码(比如创建日志器、设置处理器、格式器等)封装到一个单独的函数或者类中,使得代码结构更加模块化,更易于在不同模块或项目中复用日志配置部分的代码。例如:

import logging
import logging.handlers


def setup_logging():
    """
    配置并返回一个设置好的日志器
    """
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    console_handler = logging.StreamHandler()
    file_handler = logging.handlers.TimedRotatingFileHandler("log/log.log", when='M', interval=1, backupCount=3)

    handlers = [console_handler, file_handler]
    for handler in handlers:
        handler.setLevel(logging.INFO)

    fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
    formatter = logging.Formatter(fmt=fmt)

    for handler in handlers:
        handler.setFormatter(formatter)

    for handler in handlers:
        logger.addHandler(handler)

    return logger


if __name__ == "__main__":
    logger = setup_logging()
    while True:
        time.sleep(3)
        logger.info("这是一条信息级别的日志")
        logger.warning("这是一条警告级别的日志")

这样将日志配置独立出来后,在其他需要使用日志的模块中,只需要简单调用 setup_logging 函数获取配置好的日志器即可进行日志记录操作,进一步增强了代码的模块化程度和复用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值