jetty请求日志轮换 - 基于大小

时间:2014-08-21 21:06:50

标签: java logging jetty

我需要设置jetty-requests日志以根据大小而不是时间轮换日志。有没有办法实现这个目标?

我已阅读http://wiki.eclipse.org/Jetty/Howto/Configure_Request_Logs上的文档,但无济于事。

有什么想法吗?

谢谢, 弗拉基米尔

3 个答案:

答案 0 :(得分:2)

我将展示针对jetty-distribution-9.4.28.v20200408

执行此操作的过程

我们将通过在Jetty上启用Slf4j来实现这一目标,因为这是当前唯一支持的基于大小滚动日志的方法。

阅读:https://www.eclipse.org/jetty/documentation/current/configuring-logging-modules.html#example-logging-slf4j

首先安装slf4j-log4j2或其中的一种。

cd $JETTY_HOME
java -jar start.jar --add-to-start=slf4j-log4j2

这将生成文件resources/log4j2.xml。编辑此文件,并添加一个新的RollingRandomAccessFile记录器并为其添加一个新名称。在这里,我们将创建一个名称为reqlog的文件。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="Jetty" >

  <properties>
    <property name="logging.dir">${sys:jetty.logging.dir:-logs}</property>
  </properties>

  <Appenders>
    <Console name="console" target="SYSTEM_ERR">
      <PatternLayout>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n</Pattern>
      </PatternLayout>
    </Console>

    <RollingRandomAccessFile name="reqlog"
      fileName="${logging.dir}/jetty-request-log.log"
      filePattern="${logging.dir}/jetty-request-log-%d{MM-dd-yyyy}.log.gz"
      ignoreExceptions="false">
      <PatternLayout>
        <Pattern>%d [%t] %-5p %c %x - %m%n</Pattern>
      </PatternLayout>

      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="10 MB"/>
      </Policies>
    </RollingRandomAccessFile>

    <RollingRandomAccessFile name="file"
      fileName="${logging.dir}/jetty.log"
      filePattern="${logging.dir}/jetty-%d{MM-dd-yyyy}.log.gz"
      ignoreExceptions="false">
      <PatternLayout>
        <Pattern>%d [%t] %-5p %c %x - %m%n</Pattern>
      </PatternLayout>

      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="10 MB"/>
      </Policies>
    </RollingRandomAccessFile>

  </Appenders>

  <Loggers>
    <Root level="info">
      <AppenderRef ref="console"/>
    </Root>
    <!--
    To have all logger async 
    <AsyncRoot level="info">
      <AppenderRef ref="file"/>
    </AsyncRoot>
    -->
  </Loggers>

</Configuration>

根据需要更改<SizeBasedTriggeringPolicy size="10 MB"/>

现在编辑etc/jetty-requestlog.xml并进行更改,使其指向reqlog记录器:

<?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">

<!-- =============================================================== --><!-- Configure the Jetty Request Log                                 --><!-- =============================================================== -->
<Configure id="Server" class="org.eclipse.jetty.server.Server">

  <!-- =========================================================== -->
  <!-- Configure Request Log for Server                            -->
  <!-- (Use RequestLogHandler for a context specific RequestLog    -->
  <!-- =========================================================== -->
  <Set name="RequestLog">
    <New id="RequestLog" class="org.eclipse.jetty.server.Slf4jRequestLog">
      <Set name="loggerName">reqlog</Set>
    </New>
  </Set>  
</Configure>

现在您已经准备就绪。

然后通过启动Jetty来证明其工作

tail -f logs/jetty-request-log.log 
2020-04-24 22:18:10 INFO  reqlog:62 - 127.0.0.1 - - [25/Apr/2020:03:18:10 +0000] "GET / HTTP/1.1" 404 751 
2020-04-24 22:18:10 INFO  reqlog:62 - 127.0.0.1 - - [25/Apr/2020:03:18:10 +0000] "GET /favicon.ico HTTP/1.1" 200 1150

答案 1 :(得分:1)

Jetty 9+有一个Slf4jRequestLog实现,您可以使用它来让Jetty编写NCSA格式的日志记录事件。

然后,您可以配置您选择的日志记录实施,以滚动日志,电子邮件事件,路由到系统日志等。

注意,使用setLoggerName(String)配置此实现将使用的输出记录器名称。这样,您可以将此实现输出说成com.company.access,这将是您在日志记录实现中用于路由/过滤/附加访问日志记录事件的名称。

这是以这种方式设置的,以允许多个Access日志记录处理程序使用不同的名称,日志记录实现随后会相应地处理这些名称。

答案 2 :(得分:0)

我认为码头没有现成的解决方案。但是,如果您使用的是linux / unix主机,则可以将日志写入单个文件并使用系统logrotate。这是一个方法:

http://www.techrepublic.com/article/manage-linux-log-files-with-logrotate/

logrotate还提供根据文件大小旋转日志。