仅使用Log4J避免日志伪造

时间:2018-08-01 00:56:12

标签: java logging log4j

我正在尝试避免在使用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之上是否有任何简单的包装程序可以实现此功能?

1 个答案:

答案 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中添加此类 而这个答案是从另一个页面获取的

LOG4J: Modify logged message using custom appender