You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按条件创建多个日志文件?现有代码仅生成单个文件求解

问题原因

logging.basicConfig() 是Python logging模块的基础配置方法,但它只会在第一次被调用时生效,后续重复调用不会修改已有的日志配置。你的循环里,第一次配置了abc的日志文件后,第二次调用basicConfig试图切换到bca的文件时会被忽略,日志依然输出到abc的文件里,自然不会生成bca.log。

解决方案

推荐用独立Logger实例+FileHandler实现多日志文件需求,能灵活控制不同日志输出到对应文件,避开basicConfig的限制。

修正后的代码

import logging
import datetime

def get_logger(log_name):
    # 创建专属Logger实例,不使用根logger
    logger = logging.getLogger(log_name)
    logger.setLevel(logging.DEBUG)
    
    # 避免重复添加Handler,防止日志重复输出
    if not logger.handlers:
        log_day = datetime.datetime.now().strftime('%d-%m-%Y')
        log_path = f'/home/test/{log_day}_{log_name}'
        
        # 创建文件处理器并设置日志格式
        handler = logging.FileHandler(log_path)
        formatter = logging.Formatter('%(asctime)s:%(levelname)s:%(message)s')
        handler.setFormatter(formatter)
        
        logger.addHandler(handler)
    
    return logger

data = ["abc","bca"]

for i in data:
    if i == "abc":
        logger = get_logger("abc.log")
        logger.info("Hello")
    else:
        print("hello")
        logger = get_logger("bca.log")
        logger.info("Hello bca")

代码说明

  • 每个日志文件对应唯一的Logger实例,通过logging.getLogger(log_name)创建
  • 为每个Logger绑定专属的FileHandler,指定对应的日志文件路径
  • 加入if not logger.handlers判断,避免重复添加Handler导致日志重复输出
  • 这种方式比反复调用basicConfig更规范,也支持后续扩展更复杂的日志配置

如果想快速修改原有代码(不推荐长期使用),可以在每次调用basicConfig前重置根logger配置:

import logging
import datetime

def log_file(log_name):
    log_day = datetime.datetime.now().strftime('%d-%m-%Y')
    log_name = '/home/test/' + log_day + "_" + log_name
    return log_name

data = ["abc","bca"]

for i in data:
    # 重置根logger的所有处理器
    for handler in logging.root.handlers[:]:
        logging.root.removeHandler(handler)
        handler.close()
    
    if i == "abc":
        log_name = "abc.log"
        logging.basicConfig(filename=log_file(log_name), level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(message)s')
        logging.info("Hello")
    else:
        print("hello")
        log_name = "bca.log"
        logging.basicConfig(filename=log_file(log_name), level=logging.DEBUG, format='%(asctime)s:%(levelname)s:%(message)s')
        logging.info("Hello bca")

内容的提问来源于stack exchange,提问作者Tonin thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:22:12