java - 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>
(.*)(<dateOfBirth>)(.*?)(</dateOfBirth>)(.*) | ...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>
(.*)(<dateOfBirth>)(.*?)(</dateOfBirth>)(.*) | ...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 才能得到响应,所以日志配置肯定有问题,任何人都有一些经验这个?
解决方案
我看到的一个问题是您正在为每个日志事件编译模式:
Pattern pattern = Pattern.compile(patterns[i]);
这个操作并不便宜,你应该只做一次。也许在构造函数中。
推荐阅读
- r - 如何通过 R 和 dplyr 中的分组变量集进行总结?
- asp.net - 我想通过编辑我的 SqlDataSource 根据从 DropDownList 中选择的值更新 GridView
- node.js - 使用多个字段过滤文档
- azure - 我们可以使用 Azcopy 将文件从 S3 复制到多个 Azure blob 吗?
- node.js - Mac 上的 Kerberos 和 Nodejs
- c - cli输入在c中的分段错误Linux文件I / O
- spring - 下载 gradle 依赖项上的 Java Spring Boot 项目错误
- python - Python 脚本失败
- botframework - 从机器人框架模拟器向团队发送查询,并从团队向机器人框架模拟器获取回复
- amazon-web-services - 如何在多个实例上运行用户数据?