首页 > 解决方案 > AbstractNCSARequestLog 不适用于 log4j

问题描述

我正在使用 Java Spark(Web 框架)并且我正在关注本教程:http ://sparkjava.com/tutorials/jetty-request-log以启用日志记录。

但是,以下课程给了我一个错误:

constructor AbstractNCSARequestLog in class AbstractNCSARequestLog cannot be applied to given types;
                return new AbstractNCSARequestLog() {
                       ^
  required: Writer
  found: no arguments

有问题的班级:

    public class RequestLogFactory {

    private Logger logger;

    public RequestLogFactory(Logger logger) {
        this.logger = logger;
    }

    AbstractNCSARequestLog create() {
        return new AbstractNCSARequestLog() {
            @Override
            protected boolean isEnabled() {
                return true;
            }

            @Override
            public void write(String s) throws IOException {
                logger.info(s);
            }
        };
    }
}

标签: javalog4jjetty

解决方案


如果您想使用老式的 NCSA 请求日志格式,请使用 Slf4jRequestLog代替AbstractNCSARequestLog(现在两者都已弃用)。

如果您想使用现代RequestLog技术,请CustomRequestLog使用Slf4jRequestLogWriter. (额外的好处是能够自定义请求日志格式)

使用其中任何一种方法,您都需要将 slf4j 路由到 log4j(通过slf4j-log4j12-<ver>.jar在类路径中包含 )

然后您现在可以在命名记录器上捕获您的请求日志(记录器名称可在 中配置Slf4jRequestLogWriter

例子:

Slf4jRequestLogWriter slf4jWriter = new Slf4jRequestLogWriter();
// The name of the logger to write request logs to
slf4jWriter.setLoggerName("my.requestlog");
CustomRequestLog requestLog = new CustomRequestLog(slf4jWriter, CustomRequestLog.NCSA_FORMAT);
server.setRequestLog(requestLog);

推荐阅读