Java 如何让 log4j 在启动时清除日志?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/269999/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I make log4j clear a log at startup?
提问by braveterry
I want the log to roll over as long as the application is running, but I want the log to start fresh when the application is restarted.
我希望只要应用程序在运行,日志就会滚动,但我希望在应用程序重新启动时日志重新开始。
Updated:Based on erickson'sfeedback, my appender looks like this:
更新:根据erickson 的反馈,我的 appender 看起来像这样:
<appender name="myRFA" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="my-server.log"/>
<param name="Append" value="false" />
<param name="MaxFileSize" value="10MB"/>
<param name="MaxBackupIndex" value="10"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} %p - %t - %c - %m%n"/>
</layout>
</appender>
I simply added the following line:
我只是添加了以下行:
<param name="Append" value="false" />
It now truncates the base log file at startup, but it leaves the rolled files alone.
现在它会在启动时截断基本日志文件,但它会单独保留滚动文件。
采纳答案by erickson
If you set the append
parameter to false
, the base log file will be "started fresh" when the application restarts. Do you mean that you want any "rolled" log files to be deleted too?
如果将该append
参数设置为false
,则在应用程序重新启动时,基本日志文件将“重新启动”。您的意思是您也希望删除任何“滚动”日志文件吗?
回答by Eddie
I've written some custom code to find my RollingFileAppender
(which is unnecessarily difficult to get access to in log4j!) which I then cause to roll over. I've adapted my code below for a single use. I use code similar to this at application startup to force my logs to roll (if non-empty) so I always start in a fresh log but never delete any log but the oldest.
我已经编写了一些自定义代码来找到我的RollingFileAppender
(在 log4j 中访问它是不必要的困难!)然后我导致翻转。我已经修改了下面的代码以供一次性使用。我在应用程序启动时使用与此类似的代码来强制我的日志滚动(如果非空),所以我总是从新日志开始,但从不删除任何日志,但最旧的日志。
This code takes a given Logger and loops up the logger hierarchy until it finds a Logger that has Appenders attached. If it never does, then it gives up. If it does, it loops over all Appenders attached to that Logger and for each one that is a RollingFileAppender, it forces the log to roll.
此代码采用给定的 Logger 并循环记录器层次结构,直到找到附加了 Appenders 的 Logger。如果它从不这样做,那么它就放弃了。如果是,它会遍历所有附加到该 Logger 的 Appender,并且对于每个是 RollingFileAppender 的 Appender,它会强制日志滚动。
Something like this shouldbe a lot easier to do in log4j, but I haven't found a simpler way of doing it.
像这样的事情在 log4j 中应该更容易做,但我还没有找到更简单的方法。
public void rollLogFile(Logger logger) {
while (logger != null && !logger.getAllAppenders().hasMoreElements()) {
logger = (Logger)logger.getParent();
}
if (logger == null) {
return;
}
for (Enumeration e2 = logger.getAllAppenders(); e2.hasMoreElements();) {
final Appender appender = (Appender)e2.nextElement();
if (appender instanceof RollingFileAppender) {
final RollingFileAppender rfa = (RollingFileAppender)appender;
final File logFile = new File(rfa.getFile());
if (logFile.length() > 0) {
rfa.rollOver();
}
}
}
}