我正在尝试避免在使用log4j的基于Java的Web服务应用程序中伪造日志的可能性。由于我们不使用任何基于html的日志查看器,因此我们不需要在日志消息中对HTML内容进行编码。我只想避免换行符。因此,如果日志消息中有\ n或\ r,请将其打印为空格,而不是实际换行。
我不想使用任何额外的罐子。例如,使用ESAPI要求将所有类从Logger.getLogger(ClassName1.class);
更改为ESAPI.getLogger(ClassName1.class)
,并且无论您在何处打印日志,都需要从logger.info("message")
更改为logger.info(Logger.EVENT_SUCCESS, "message")
,我们不这样做想要为所有现有的代码库做。另外,使用ESAPI可以为每个日志条目添加多余的内容。
是否有任何log4j配置可以将其记录的所有内容替换为\ n或\ r ?如果没有,在log4j之上是否有任何简单的包装程序可以实现此功能?
答案 0 :(得分:0)
对不起,我是Stackoverflow的新手,请输入我的菜鸟答案
最好创建自己的自定义PatternLayout并在PatternLayout标签内的log4j.xml中使用它。
例如:
public class LogValidatorLayout extends PatternLayout {
public LogValidatorLayout() {
super();
}
public LogValidatorLayout(String pattern) {
super(pattern);
}
@Override
public String format(LoggingEvent event) {
// only process String type messages
if (event.getMessage() != null && event.getMessage() instanceof String) {
String message = event.getMessage().toString();
message = StringUtils.trim("Some custom text --->>"+message);
// earlier versions of log4j don't provide any way to update messages,
// so use reflections to do this
try {
Field field = LoggingEvent.class.getDeclaredField("message");
field.setAccessible(true);
field.set(event, message);
} catch (Exception e) {
// Dont log it as it will lead to infinite loop. Simply print the trace
e.printStackTrace();
}
}
return super.format(event);
}
}
并在log4j.xml中添加此类 而这个答案是从另一个页面获取的