Log4j是一个常用的Java日志框架,可以帮助我们定位程序运行时的错误以及提高代码的可读性。其中,日志分类和过滤敏感字段是常见的Log4j使用技巧。下面为大家详细讲解这两个方面的实例攻略。
1. 日志分类
在实际项目中,我们往往需要将不同类型的日志记录到不同的文件中,便于快速定位问题。下面是一个日志分类的示例:
- 首先,我们需要定义不同类别日志的Logger对象,例如:
private static final Logger SYSTEM_LOGGER = LogManager.getLogger("system_log");
private static final Logger BUSINESS_LOGGER = LogManager.getLogger("business_log");
其中,system_log
和business_log
分别代表系统日志和业务日志。
- 然后,我们在log4j配置文件中,为不同类别的日志指定输出方式和输出路径,例如:
<!-- 系统日志输出 -->
<appender name="SYS_LOG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/log/system.log" />
<param name="MaxFileSize" value="100MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c{2} - %m%n" />
</layout>
</appender>
<logger name="system_log">
<level value="DEBUG" />
<appender-ref ref="SYS_LOG" />
</logger>
<!-- 业务日志输出 -->
<appender name="BUSINESS_LOG" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/log/business.log" />
<param name="MaxFileSize" value="100MB" />
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c{2} - %m%n" />
</layout>
</appender>
<logger name="business_log">
<level value="DEBUG" />
<appender-ref ref="BUSINESS_LOG" />
</logger>
其中,SYS_LOG
和BUSINESS_LOG
分别定义了输出到系统日志和业务日志的方式和路径。
- 最后,在代码中使用不同类别的Logger对象进行日志记录,例如:
// 记录系统日志
SYSTEM_LOGGER.error("Something bad happened!");
// 记录业务日志
BUSINESS_LOGGER.debug("Enter method foo()");
注意,这里的日志级别应当根据实际场景进行选择,例如系统日志可以选择ERROR级别,业务日志可以选择DEBUG级别。
2. 过滤敏感字段
在实际项目中,我们往往需要保护用户的隐私信息,例如电话号码、邮箱等,并防止将这些信息记录到日志中。下面是一个过滤敏感字段的示例:
- 首先,我们需要自定义一个Filter类,用于过滤敏感字段。例如:
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;
public class SensitiveInfoFilter extends Filter {
private String[] sensitiveFields = {"phone", "email"};
@Override
public int decide(LoggingEvent event) {
if (event.getMessage() instanceof String) {
String message = (String) event.getMessage();
for (String field : sensitiveFields) {
if (message.contains(field)) {
message = message.replaceAll(field + "=[^&]*", field + "=***");
}
}
event.setMessage(message);
}
return Filter.NEUTRAL;
}
}
其中,sensitiveFields
为敏感字段的名称,这里我们仅使用了"phone"和"email"两个简单示例。在decide()
方法中,我们判断了日志消息是否为字符串类型,如果是则遍历敏感字段,将敏感字段的值替换为"***",然后重新设置日志消息。
- 然后,在log4j配置文件中添加Filter,例如:
<!-- 过滤敏感字段 -->
<filter class="com.example.SensitiveInfoFilter" />
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %-5p %c{2} - %m%n" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="STDOUT" />
</root>
注意,这里的Filter需要放在最上方,以保证其他Filter或Appender对日志消息进行操作前,先过滤敏感字段。
- 最后,在代码中使用Logger对象记录日志:
LOGGER.info("User order created, phone=123456789, email=test@example.com");
在这个例子中,如果日志输出到控制台或保存到文件中,将会被替换为:
User order created, phone=***, email=***
这样就保护了用户的隐私信息,可以避免泄露敏感数据。
以上两个示例展示了Log4j日志分类和过滤敏感字段的实现过程,可以根据实际需求进行修改和扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Log4j日志分类和过滤敏感字段的实例 - Python技术站