logging 到 console 、File 、 ES loguru

本文介绍了一个日志管理系统的设计与实现,该系统支持将日志输出到控制台、文件及Elasticsearch中。系统提供了灵活的日志配置选项,可根据不同需求调整日志级别、格式等,并能根据不同运行环境自动设置Elasticsearch的索引。
部署运行你感兴趣的模型镜像
import logging
import sys
from os import makedirs
from os.path import dirname, exists

from cmreslogging.handlers import CMRESHandler

loggers = {}

LOG_ENABLED = True  # 是否开启日志
LOG_TO_CONSOLE = True  # 是否输出到控制台
LOG_TO_FILE = True  # 是否输出到文件
LOG_TO_ES = True  # 是否输出到 Elasticsearch

LOG_PATH = './runtime.log'  # 日志文件路径
LOG_LEVEL = 'DEBUG'  # 日志级别
LOG_FORMAT = '%(levelname)s - %(asctime)s - process: %(process)d - %(filename)s - %(name)s - %(lineno)d - %(module)s - %(message)s'  # 每条日志输出格式
ELASTIC_SEARCH_HOST = 'eshost'  # Elasticsearch Host
ELASTIC_SEARCH_PORT = 9200  # Elasticsearch Port
ELASTIC_SEARCH_INDEX = 'runtime'  # Elasticsearch Index Name
APP_ENVIRONMENT = 'dev'  # 运行环境,如测试环境还是生产环境

def get_logger(name=None):
    """
    get logger by name
    :param name: name of logger
    :return: logger
    """
    global loggers

    if not name: name = __name__

    if loggers.get(name):
        return loggers.get(name)

    logger = logging.getLogger(name)
    logger.setLevel(LOG_LEVEL)

    # 输出到控制台
    if LOG_ENABLED and LOG_TO_CONSOLE:
        stream_handler = logging.StreamHandler(sys.stdout)
        stream_handler.setLevel(level=LOG_LEVEL)
        formatter = logging.Formatter(LOG_FORMAT)
        stream_handler.setFormatter(formatter)
        logger.addHandler(stream_handler)

    # 输出到文件
    if LOG_ENABLED and LOG_TO_FILE:
        # 如果路径不存在,创建日志文件文件夹
        log_dir = dirname(log_path)
        if not exists(log_dir): makedirs(log_dir)
        # 添加 FileHandler
        file_handler = logging.FileHandler(log_path, encoding='utf-8')
        file_handler.setLevel(level=LOG_LEVEL)
        formatter = logging.Formatter(LOG_FORMAT)
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)

    # 输出到 Elasticsearch
    if LOG_ENABLED and LOG_TO_ES:
        # 添加 CMRESHandler
        es_handler = CMRESHandler(hosts=[{'host': ELASTIC_SEARCH_HOST, 'port': ELASTIC_SEARCH_PORT}],
                                  # 可以配置对应的认证权限
                                  auth_type=CMRESHandler.AuthType.NO_AUTH,  
                                  es_index_name=ELASTIC_SEARCH_INDEX,
                                  # 一个月分一个 Index
                                  index_name_frequency=CMRESHandler.IndexNameFrequency.MONTHLY,
                                  # 额外增加环境标识
                                  es_additional_fields={'environment': APP_ENVIRONMENT}  
                                  )
        es_handler.setLevel(level=LOG_LEVEL)
        formatter = logging.Formatter(LOG_FORMAT)
        es_handler.setFormatter(formatter)
        logger.addHandler(es_handler)

    # 保存到全局 loggers
    loggers[name] = logger
    return logger

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 我们正在解决Log4j2报错:"No Log4j 2 configuration file found. Using default configuration (logging only errors to the console)"。 根据引用[1]、[2]、[3]、[4]、[5],这个错误的原因是Log4j2没有找到配置文件,因此使用默认配置(只将错误日志输出到控制台)。 解决方法:添加Log4j2的配置文件(如log4j2.xml)到正确的位置(通常是类路径下,如src/main/resources)。 步骤: 1. 创建配置文件:在项目的src/main/resources目录下(如果是Maven项目)创建log4j2.xml文件。 2. 配置内容:参考引用[4]和[5]中的示例配置,根据需求调整。 3. 重启应用:确保配置文件被正确加载。 下面是一个基本的log4j2.xml配置示例(结合引用[4]和[5]): ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` 这个配置将日志输出到控制台,日志级别为info及以上。 注意: - 如果项目中没有resources目录,需要创建并标记为资源目录(在IDE中)。 - 如果使用其他构建工具(如Gradle),资源目录的位置可能不同。 - 配置文件中可以添加更复杂的设置,如输出到文件、按大小和时间滚动等,具体参考Log4j2官方文档。 如果问题仍然存在,可以尝试: - 检查配置文件是否在类路径中(编译后是否在target/classes或build/resources/main下)。 - 设置系统属性`-Dlog4j2.debug=true`以查看Log4j2内部初始化日志(如引用[2]和[3]所述)。 另外,引用[3]中还提到了一个ElasticsearchParseException异常,这可能是由于Elasticsearch的配置问题,需要检查Elasticsearch的配置文件(如elasticsearch.yml)格式是否正确。但这个问题与Log4j2的配置无关,是另一个独立的错误。 因此,针对Log4j2的配置问题,主要就是添加配置文件到正确位置。 生成相关问题: 1. 如何配置Log4j2将日志输出到文件? 2. Log4j2配置文件有哪些常见配置项? 3. 如何设置不同包或类的不同日志级别? 4. 为什么添加了log4j2.xml配置文件后仍然报错? </think> ### 解决 "No Log4j 2 configuration file found" 问题的方法 #### 问题原因分析 当出现错误信息 "No Log4j 2 configuration file found. Using default configuration..." 时,表明 Log4j 2 框架在应用程序的类路径中找不到有效的配置文件(如 `log4j2.xml` 或 `log4j2.properties`),因此只能使用默认配置(仅将错误日志输出到控制台)[^1][^2]。 #### 完整解决步骤 1. **创建配置文件** - 在项目的资源目录下创建配置文件: ```bash # Maven/Gradle 项目路径 src/main/resources/log4j2.xml ``` - 基础配置模板(引用[4][^4]): ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="[%-5p] %d %c - %m%n" /> </Console> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` 2. **配置文件位置验证** - 确保文件位于类路径中: - 标准位置:`src/main/resources` (Maven/Gradle) - 非 Maven 项目:`WEB-INF/classes` (Web 项目) 或项目根目录 - 编译后检查:确认文件出现在 `target/classes` 或 `build/resources` 目录中 3. **配置项说明(关键参数)** | 配置项 | 作用说明 | 示例值 | |----------------|----------------------------------|---------------| | `<Root level>` | 全局日志级别 | `INFO`, `DEBUG` | | `<PatternLayout>` | 日志输出格式 | `%d %-5p %m%n` | | `<AppenderRef>` | 指定日志输出目标 | `Console`, `File` | | `status` | 内部日志级别 | `WARN`, `ERROR` | 4. **高级配置(按需添加)** - 文件输出示例(引用[4][^4]): ```xml <File name="File" fileName="logs/app.log"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> </File> ``` - 包级别日志控制(引用[5][^5]): ```xml <Logger name="com.example" level="DEBUG" additivity="false"> <AppenderRef ref="File"/> </Logger> ``` 5. **验证与调试** - 启动时添加 JVM 参数获取详细日志: ```bash -Dlog4j2.debug=true ``` - 验证配置文件加载(控制台应显示): ``` DEBUG Loading configuration from file:///.../log4j2.xml ``` #### 常见问题排查 1. **配置文件未生效** - 检查文件名拼写:必须是 **log4j2.xml**(注意数字"2") - 清理并重建项目:确保资源文件被正确编译打包 2. **依赖冲突** - 检查是否存在多个日志框架依赖: ```xml <!-- 正确依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> ``` - 排除旧版 Log4j 1.x 或 SLF4J 冲突 3. **特殊环境配置** - Spring Boot 项目:需排除默认日志器 ```java @SpringBootApplication(exclude = {LogbackLoggingSystem.class}) ``` - Web 服务器:将配置文件放入 `WEB-INF/classes` > **重要提示**:配置文件语法错误会导致静默失败,建议使用 [XML 验证工具](https://logging.apache.org/log4j/2.x/manual/configuration.html) 检查[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值