我需要设置jetty-requests日志以根据大小而不是时间轮换日志。有没有办法实现这个目标?
我已阅读http://wiki.eclipse.org/Jetty/Howto/Configure_Request_Logs上的文档,但无济于事。
有什么想法吗?
谢谢, 弗拉基米尔
答案 0 :(得分:2)
我将展示针对jetty-distribution-9.4.28.v20200408
我们将通过在Jetty上启用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还提供根据文件大小旋转日志。