我的目标是在 Spring Boot 3 中扩展 log4j 以拦截日志参数并在自动记录时隐藏敏感数据。由于我很难找到解决方案,因此我打开并回答我自己的问题,希望对其他人有所帮助。
添加依赖项
org.apache.logging.log4j:log4j-api:2.24.2
。
然后通过扩展
LogFactory
创建一个自定义 org.apache.logging.log4j.message.MessageFactory2
类并实现所有方法(是的,它们很多,但实现很容易)。示例:
class MyLogFactory : MessageFactory2 {
override fun newMessage(charSequence: CharSequence?): Message {
return charSequence?.let {
ParameterizedMessage(it.toString())
} ?: ParameterizedMessage("")
}
override fun newMessage(message: String?, p0: Any?): Message {
return ParameterizedMessage(
message,
hideSensitiveData(arrayOf(p0))
)
}
override fun newMessage(message: String?, p0: Any?, p1: Any?): Message {
return ParameterizedMessage(
message,
hideSensitiveData(arrayOf(p0, p1))
)
}
// and so on
}
然后在创建logger的时候,具体要使用自定义的LogFactory:
Logger log = LogManager.getLogger(MyCurrentClass.class, new MyLogFactory());
如果您希望对任何类默认使用自定义日志工厂,那么您可以通过在名为
log4j2.properties
的资源下定义一个文件来指定它:
log4j2.loggerFactory=com.example.MyLogFactory