logback导致性能问题

问题描述 投票:0回答:1

我一直在使用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;
    }
}

然后我写了一个文件appender和一个控制台appender:file appender:

<?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>

和控制台appender:

<?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之后,我发现在请求发出之前它只花了6秒才能得到响应,但现在需要至少12秒才能得到响应,因此日志配置必须出错,任何人都有一些经验这个?

java performance logback
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.