如何配置嵌入式jetty服务器来记录所有请求?

问题描述 投票:0回答:2

我想将所有肥皂请求记录到我的服务器。服务器实例是一个嵌入式jetty服务器。

有没有办法设置处理程序来执行此操作。我可以访问 web.xml 文件

java jetty embedded-jetty
2个回答
7
投票

您将需要在嵌入式码头启动中执行以下操作...

12号码头

您将使用...

  1. CustomRequestLog
    (具有输出语法)
  2. RequestLog.Writer
    的实例,用于指定输出的去向。
  3. 根据您的配置设置
    Server.setRequestLog(RequestLog)

您将不会使用来自 Jetty 的旧

RequestLogHandler
9 天, 因为该类无法记录任何未通过该处理程序调度的请求。 (例如:错误、错误请求、没有路径的请求、与配置的上下文路径不匹配的请求等)

以下两个示例都是来自 jetty-example 项目的片段:

有一个 Writer 以任意配置的记录器名称输出到 slf4j 日志记录的示例

Slf4jRequestLogWriter requestLoggingWriter = new Slf4jRequestLogWriter();
requestLoggingWriter.setLoggerName("examples.requests");

RequestLog requestLog = new CustomRequestLog(requestLoggingWriter,
    CustomRequestLog.EXTENDED_NCSA_FORMAT);

server.setRequestLog(requestLog);

您可以使用您选择的日志库(只需将 slf4j 路由到您的日志库),并将这些日志记录事件输出到您的日志库支持的任何位置(带覆盖的文件、带附加的文件、带翻转的文件、电子邮件、数据库、 unix系统日志等)

具有输出到文件的 Writer 的示例。

AsyncRequestLogWriter requestLogWriter = new AsyncRequestLogWriter();
requestLogWriter.setAppend(true);
requestLogWriter.setFilename("/var/web/logs/request.log");
requestLogWriter.setRetainDays(1);

RequestLog requestLog = new CustomRequestLog(requestLogWriter,
    CustomRequestLog.EXTENDED_NCSA_FORMAT);

server.setRequestLog(requestLog);

原答案(2013年10月18日)

这是针对 Jetty 9 的

    HandlerCollection handlers = new HandlerCollection();
    ContextHandlerCollection contexts = new ContextHandlerCollection();
    // your context specific handlers are added to "contexts" here
    server.setHandler(handlers);

    NCSARequestLog requestLog = new NCSARequestLog();
    requestLog.setFilename("/path/to/my/logs/yyyy_mm_dd.request.log");
    requestLog.setFilenameDateFormat("yyyy_MM_dd");
    requestLog.setRetainDays(90);
    requestLog.setAppend(true);
    requestLog.setExtended(true);
    requestLog.setLogCookies(false);
    requestLog.setLogTimeZone("GMT");
    RequestLogHandler requestLogHandler = new RequestLogHandler();
    requestLogHandler.setRequestLog(requestLog);
    handlers.addHandler(requestLogHandler);

2
投票

码头行家:

   <dependency>
        <groupId>org.eclipse.jetty.aggregate</groupId>
        <artifactId>jetty-all</artifactId>
        <version>9.3.8.v20160314</version>
        <type>pom</type> 
   </dependency>

代码:

NCSARequestLog requestLog = new NCSARequestLog();
requestLog.setFilename("/path/to/my/logs/yyyy_mm_dd.request.log");
requestLog.setFilenameDateFormat("yyyy_MM_dd");
requestLog.setRetainDays(90);
requestLog.setAppend(true);
requestLog.setExtended(true);
requestLog.setLogCookies(false);
requestLog.setLogTimeZone("GMT"); // or GMT+2 and so on. 

server.setRequestLog(requestLog); // here will set global request log

NCSARequestLog是同步日志,如果你想使用log4j,这样做:

public class AccessLogHandler extends AbstractNCSARequestLog {
    private Log logger = LogFactory.getLog(AccessLogHandler.class);
    @Override
    protected boolean isEnabled() {
        return true;
    }

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

}

使用

AccessLogHandler
替换
NCSARequestLog
并配置您的
log4j.properties

© www.soinside.com 2019 - 2024. All rights reserved.