logging 到 console 、File 、 ES loguru

本文介绍了一个日志管理系统的设计与实现,该系统支持将日志输出到控制台、文件及Elasticsearch中。系统提供了灵活的日志配置选项,可根据不同需求调整日志级别、格式等,并能根据不同运行环境自动设置Elasticsearch的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### 配置Spring Boot与Filebeat集成以向Elasticsearch发送日志 为了实现Spring Boot应用程序的日志通过Filebeat传输到Elasticsearch,需完成几个关键组件的配置。 #### Filebeat安装与基本配置 首先,在目标服务器上安装Filebeat。接着编辑`filebeat.yml`文件来指定要监控的日志路径以及定义输出目的地为Elasticsearch: ```yaml filebeat.inputs: - type: log enabled: true paths: - /path/to/springboot/logs/*.log output.elasticsearch: hosts: ["http://localhost:9200"] ``` 上述配置指定了Log类型的输入源,并启用了该功能,同时设置了日志文件的位置模式匹配规则[^1]。 #### 修改Spring Boot应用中的logging.properties或application.properties 为了让Spring Boot产生的日志能够被Filebeat捕获,调整项目的日志记录级别和格式是非常重要的。可以在`src/main/resources/application.properties`中加入如下属性: ```properties logging.file.name=/path/to/springboot/logs/app.log logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n logging.level.org.springframework.web=INFO logging.level.com.example.demo=DEBUG ``` 这里设定了具体的日志存储位置,并自定义了控制台输出样式以便于后续处理[^2]。 #### Elasticsearch端设置接收来自Filebeat的数据流 确保Elasticsearch实例已正确启动并监听外部连接请求(如前所述将`network.host`参数设为`0.0.0.0`)。此外还需创建索引模板用于管理传入文档结构的一致性和优化查询性能: ```json PUT _template/filebeat_template { "index_patterns": ["filebeat-*"], "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "_source": {"enabled": true}, "properties": { "@timestamp": { "type": "date"}, "message": {"type":"text"} } } } ``` 此API调用会预先设定好适用于大多数场景下的默认映射关系表单[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值