首页 > 解决方案 > logback 导致性能问题

问题描述

我一直在使用 logback 作为日志框架,现在我需要屏蔽日志中的一些敏感数据。所以我写了一个这样的编码器:

public class MaskLayot extends PatternLayout {
    private String patternsProperty;
    public String getPatternsProperty() {
        return patternsProperty;
    }

    public void setPatternsProperty(String patternsProperty) {
        this.patternsProperty = patternsProperty;
    }
    @Override
    public String doLayout(ILoggingEvent event){
        String message = super.doLayout(event);
        if(patternsProperty != null){
            String[] patterns = patternsProperty.split("|");
            for(int i = 0;i<patterns.length;i++){
                Pattern pattern = Pattern.compile(patterns[i]);
                Matcher matcher = pattern.matcher(message);
                while(matcher.find()){
                    message = matcher.replaceAll("$1$2****$4$5");
                }
            }
        }
        return message;
    }
}

然后我写了一个文件附加器和一个控制台附加器:文件附加器:

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>
            ${logPath}/${logFile}.log
        </file>
        <rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>
                ${logPath}/${logFile}-%d.log.gz
            </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="com.idolice.controller.MaskLayot">
                <patternProperty>
                    (.*)(&lt;dateOfBirth&gt;)(.*?)(&lt;/dateOfBirth&gt;)(.*) | ...etc(many similar patterns)
                </patternProperty>
                <pattern>
                    ${fileLogPattern}
                </pattern>
            </layout>

        </encoder>
    </appender>
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>500</queueSize>
        <discardingThreshold>0</discardingThreshold>
        <appender-ref ref="file"/>
    </appender>
</included>

和控制台附加程序:

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="com.idolice.controller.MaskLayot">
                <patternProperty>
                    (.*)(&lt;dateOfBirth&gt;)(.*?)(&lt;/dateOfBirth&gt;)(.*) | ...etc(many similar patterns)
                </patternProperty>
                <pattern>
                    ${consoleLogPattern}
                </pattern>
            </layout>

        </encoder>
    </appender>
</included>

所以最后我的 logback 配置文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="default.xml"/>
    <include resource="fileAppender.xml"/>
    <include resource="consoleAppender.xml"/>
    <logger name="com.idolice" level="'INFO"/>
    <logger name="com.idolice" level="'DEBUG"/>
    <root level="info">
        <appender-ref ref="ASYNC"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

在我开始使用 MaskLayout 之后,我发现在发出请求之前只需要 6s 就可以得到响应,但现在至少需要 12s 才能得到响应,所以日志配置肯定有问题,任何人都有一些经验这个?

标签: javaperformancelogback

解决方案


我看到的一个问题是您正在为每个日志事件编译模式:

            Pattern pattern = Pattern.compile(patterns[i]);

这个操作并不便宜,你应该只做一次。也许在构造函数中。


推荐阅读