前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >组件日志单独打印

组件日志单独打印

作者头像
只喝牛奶的杀手
发布2024-04-10 08:18:33
1230
发布2024-04-10 08:18:33
举报
文章被收录于专栏:只喝牛奶的杀手

那么多组件对MQ、Redis、鉴权等的封装着,每个组件都需要打印日志,组件日志与业务日志混合在一起,干扰业务排查问题。组件日志主要是为了排查问题,组件打印的日志也没有必要被收集到SLS、ELK上等。

主要解决两个问题:

  • 组件日志需要单独打印
  • 需要兼容项目项目里面的Log2j.xml配置文件,不和业务项目日志文件冲突

这里会有同学说,我在配置一个logj2文件,其实是不行的。Log4j2为应用程序提供了几种创建自己的编程配置的方法:

  1. 指定自定义ConfigurationFactory以使用编程配置启动Log4j
  2. Log4j启动后,使用Configurator替换配置
  3. 使用配置文件和编程配置的组合初始化Log4j
  4. 初始化后修改当前配置

这里说一下第四种:有时你使用配置文件进行配置,但需要进行一些额外的编程配置。一个可能的用例可能是,您希望允许使用XML进行灵活的配置,但同时确保始终存在一些无法删除的业务配置元素。实现这一点的最简单方法是扩展其中一个标准配置类(XmlConfiguration、JSONConfiguration),然后为扩展类创建一个新的ConfigurationFactory。标准配置完成后,可以向其中添加自定义配置。

下面的示例显示了如何扩展XmlConfiguration以手动将Appender和LoggerConfig添加到配置中。

代码语言:javascript
复制
Plugin(name = "MyXmlConfigurationFactory", category = "ConfigurationFactory")
@Order(10)
public class MyXmlConfigurationFactory extends ConfigurationFactory {

    /**
     * Valid file extensions for XML files.
     */
    public static final String[] SUFFIXES = new String[]{".xml", "*"};

    /**
     * Return the Configuration.
     *
     * @param source The InputSource.
     * @return The Configuration.
     */
    public Configuration getConfiguration(LoggerContext loggerContext, ConfigurationSource source) {
        return new MyXmlConfiguration(loggerContext, source);
    }

    /**
     * Returns the file suffixes for XML files.
     *
     * @return An array of File extensions.
     */
    public String[] getSupportedTypes() {
        return SUFFIXES;
    }
}

public class MyXmlConfiguration extends XmlConfiguration {
    public MyXmlConfiguration(final LoggerContext loggerContext, final ConfigurationSource configSource) {
        super(loggerContext, configSource);
    }

    @Override
    protected void doConfigure() {
        super.doConfigure();
        final LoggerContext context = (LoggerContext) LogManager.getContext(false);
        final Configuration config = context.getConfiguration();
        final Layout layout = PatternLayout.createDefaultLayout(config);
        final Appender fileAppender = FileAppender.newBuilder().setName("target/test.log").withFileName("File")
                .withImmediateFlush(true).setIgnoreExceptions(false).withBufferedIo(false).withBufferSize(4000)
                .setLayout(layout).withAdvertise(false).setConfiguration(config)
                .build();
        fileAppender.start();
        addAppender(fileAppender);
        AppenderRef[] refs = new AppenderRef[]{AppenderRef.createAppenderRef(fileAppender.getName(), null, null)};
        LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, "org.apache.logging.log4j",
                "true", refs, null, config, null);
        loggerConfig.addAppender(fileAppender, null, null);
        addLogger("org.apache.logging.log4j", loggerConfig);
    }
}

主要思路就是通过显示编码的方式在log4j2初始化配置的时候,加入自己的单独配置,兼容业务配置,而且对业务无感。本解决思路比较简单,但收益巨大,避免干扰业务日志,减少存储成本。

参考资料:

log4j2 Programmatic Configuration: https://logging.apache.org/log4j/2.x/manual/customconfig.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 只喝牛奶的杀手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档