python的日志模块logging

1.日志的基本使用

适用于每天执行的任务,如定时任务,日志量小一次几k,可以一直追加日志,logging模块是系统自带的无需安装直接导入使用

1.1logging.basicConfig

可以直接使用logging.basicConfig配置,但是它只能配置控制台输出或者文件输出,不能两者一起输出,而Handler可以

在日志配置中,stream=sys.stdout 为控制台输出日志,filename="devops.log"为日志写入到文件,filemode="w"为每次执行代码覆盖写,filemode = 'a'为追加日志,format="%(asctime)s-%(name)s-%(levelname)s-%(message)s" 为在每条日志之前加上时间戳,level=logging.INFO 为日志等级设置为info

复制代码
import logging
import sys
 #日志配置
 # logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    #filemode="w"为每次执行代码覆盖写,filemode = 'a'为追加日志
    logging.basicConfig(filename="devops.log", filemode="a", format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",
                        level=logging.INFO)
 #写日志
    logging.info("服务运行状态为: ok!")
   
复制代码

1.2Handler

典型的日志记录的步骤是这样的:

  1. 创建logger
  2. 创建handler
  3. 定义formatter
  4. 给handler添加formatter
  5. 给logger添加handler
  6. 返回logger
  7. 调用logger写入日志

生成的文件名为./logs/rancher.log这种形式的

复制代码
cat log.py

import
logging import os def get_logger(logfilename): # 1、创建一个logger,日志的名称为传输来的logfilename logger = logging.getLogger(logfilename) logger.setLevel(logging.DEBUG) # 2、创建一个handler,用于写入日志文件,文件名为test.log logfile = "{0}/logs/{1}.log".format(os.path.abspath('.'),logfilename) fh = logging.FileHandler(logfile) # fh = logging.FileHandler('test.log') fh.setLevel(logging.INFO) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() ch.setLevel(logging.INFO) # 3、定义handler的输出格式(formatter) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 4、给handler添加formatter fh.setFormatter(formatter) ch.setFormatter(formatter) # 5、给logger添加handler logger.addHandler(fh) logger.addHandler(ch) # 6、返回logger return logger
复制代码

调用logger,写入日志

#导入模块
from log import get_logger

#调用日志函数
rancherlog = get_logger("rancher")
#写入日志
rancherlog .info("hello a")

2.日志分割

适用于一直运行的应用,日志量大需要进行分隔。

2.1使用TimedRotatingFileHandler来按照日期进行分割,设置为每隔15天进行分隔。

生成的日志为./logs/rancher-info-2023-11-10.log这种形式的。

复制代码
cat log
import
os import logging from logging.handlers import TimedRotatingFileHandler import time log_path = "logs" #日志分割 def get_logger(name): logger = logging.getLogger(name) # 判断目录是否存在,存在不创建,不存在则创建log目录 if os.path.exists(log_path): pass else: os.mkdir(log_path) # 设置日志基础级别 logger.setLevel(logging.DEBUG) # 日志格式 formatter = '[%(asctime)s] [%(threadName)s] [line:%(lineno)d] %(levelname)s: %(message)s' log_formatter = logging.Formatter(formatter) # 控制台日志 console_handler = logging.StreamHandler() console_handler.setFormatter(log_formatter) # info日志文件名 info_file_name = '-info-' + time.strftime( '%Y-%m-%d', time.localtime(time.time())) + '.log' """ #实例化TimedRotatingFileHandler # filename:日志文件名 # when:日志文件按什么切分。'S'-秒;'M'-分钟;'H'-小时;'D'-天;'W'-周 # 这里需要注意,如果选择 D-天,那么这个不是严格意义上的'天',是从你 # 项目启动开始,过了24小时,才会重新创建一个新的日志文件,如果项目重启, # 这个时间就会重置。选择'MIDNIGHT'-是指过了凌晨12点,就会创建新的日志 # interval是时间间隔 # backupCount:是保留日志个数。默认的0是不会自动删除掉日志。如果超过这个个数,就会自动删除 """ info_handler = TimedRotatingFileHandler(filename='logs/' + name + info_file_name, when='MIDNIGHT', interval=15, backupCount=3, encoding='utf-8') # 设置文件里写入的格式 info_handler.setFormatter(log_formatter) info_handler.setLevel(logging.INFO) # 添加日志处理器 logger.addHandler(info_handler) logger.addHandler(console_handler) return logger
复制代码

 调用logger与之前的handle一致

#导入模块
from log import get_logger

#调用日志函数
rancherlog = get_logger("rancher")
#写入日志
rancherlog .info("hello a")

 

2.2使用RotatingFileHandler根据文件大小进行日志分割,设置日志文件最大字节数(2M)

生成的日志为./logs/rancher.log这种形式的,原来达到2m的日志变为./logs/rancher.log.1,如果再来一个新日志,则之前的rancher.log变为rancher.log.1,而原来的rancher.log.1变成rancher.log.2

复制代码
import logging
import os
import sys
from logging.handlers import RotatingFileHandler

# 定义默认日志格式
"""
%(asctime)s   :日志记录的时间
%(levelname)s :日志级别
%(message)s   :日志消息的内容
%(name)s      :日志记录器的名称
%(filename)s  :源代码文件名称
%(lineno)d    :源代码文件中的行号
%(funcName)s  :调用日志记录的函数名
"""

def get_logger(logger_name):
    #参数定义
    LOG_FORMAT = "%(asctime)s %(levelname)s [%(filename)s: %(lineno)d] %(message)s"

    # 定义日志全局记录级别: DEBUG < INFO < WARNING < ERROR < CRITICAL
    WRITE_LEVEL = logging.DEBUG

    # 定义输出控制台日志级别
    CONSOLE_LEVEL = logging.INFO

    # 定义输出文件日志级别
    # FILE_LEVEL = logging.ERROR
    FILE_LEVEL = logging.INFO

    # 日志文件存放路径,如不需要路径,填写 None
    FILE_PATH = "logs"

    # 日志文件名称
    LOG_FILE_NAME = logger_name + ".log"

    # 定义默认日志文件最大字节数(2M)
    LOG_MAX_BYTES = 2 * 1024 * 1024
    # 定义默认日志文件备份个数
    LOG_BACKUP_COUNT = 5

    """日志记录模块"""
    # 获取当前脚本所在的目录路径。该方法获取不正确时,使用方法二:os.path.realpath(sys.argv[0])
    script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))

    if FILE_PATH:
        # 拼接日志文件完整路径
        log_filename = os.path.join(script_dir, FILE_PATH, LOG_FILE_NAME)
        # 如果指定路径不存在,则尝试创建路径
        if not os.path.exists(os.path.join(script_dir, FILE_PATH)):
            os.makedirs(os.path.join(script_dir, FILE_PATH))
    else:
        # 拼接日志文件完整路径
        log_filename = os.path.join(script_dir, LOG_FILE_NAME)

    # 创建 Logger 实例,如果传入 logger_name 参数,则使用该名称创建 Logger,否则使用根 Logger
    logger = logging.getLogger(logger_name)
    logger.setLevel(WRITE_LEVEL)

    # 配置控制台输出
    console_handler = logging.StreamHandler()  # 创建 StreamHandler 实例,即将日志输出到控制台的处理器
    console_handler.setLevel(CONSOLE_LEVEL)
    console_handler.setFormatter(logging.Formatter(LOG_FORMAT))
    logger.addHandler(console_handler)

    # 配置文件输出
    file_handler = RotatingFileHandler(
        filename=log_filename,
        maxBytes=LOG_MAX_BYTES,
        backupCount=LOG_BACKUP_COUNT,
        encoding='utf-8'
    )  # 创建 RotatingFileHandler 实例,即将日志输出到文件的处理器
    file_handler.setLevel(FILE_LEVEL)
    file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
    logger.addHandler(file_handler)

    return logger
复制代码

调用logger,写入日志

#导入模块
from log2 import get_logger
#调用日志函数
logger = get_logger("rancher1")
#写日志
logger.info("hello tttttttt")

 

 

 

参考文档:

1.https://blog.csdn.net/xiao_yi_xiao/article/details/122111351

2.https://blog.csdn.net/weixin_44688529/article/details/126160744?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-126160744-blog-100030752.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-126160744-blog-100030752.235%5Ev38%5Epc_relevant_anti_t3_base&utm_relevant_index=12

3.https://blog.csdn.net/qq_45664055/article/details/133792652

posted @   潇潇暮鱼鱼  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
点击右上角即可分享
微信分享提示