Java 如何创建log4j自定义appender并控制文件名
我的公司使用一个软件包,从我们的服务器读取日志文件,解析它们,并将性能数据吐入数据库。我们没有权限修改读取文件的应用程序的源代码,但我们有权访问写入文件的代码。我需要更改日志文件的写入方式,我想使用log4j(这样我就可以使用AsyncAppender)。该计划期望实现以下几点: 1) 。应该有10个日志文件滚动,每个日志文件将是一天的日志。这些文件需要命名为0到9,并且我需要能够通过编程设置文件名以及它们根据服务器时间滚动的时间 2) 。基本上,在生成第11个日志文件时,应该删除最旧的日志文件并开始写入该日志文件 3) 。生成新日志文件时,我需要能够在文件的第一行插入时间戳(System.currentTimeMillis())Java 如何创建log4j自定义appender并控制文件名,java,logging,log4j,Java,Logging,Log4j,我的公司使用一个软件包,从我们的服务器读取日志文件,解析它们,并将性能数据吐入数据库。我们没有权限修改读取文件的应用程序的源代码,但我们有权访问写入文件的代码。我需要更改日志文件的写入方式,我想使用log4j(这样我就可以使用AsyncAppender)。该计划期望实现以下几点: 1) 。应该有10个日志文件滚动,每个日志文件将是一天的日志。这些文件需要命名为0到9,并且我需要能够通过编程设置文件名以及它们根据服务器时间滚动的时间 2) 。基本上,在生成第11个日志文件时,应该删除最旧的日志文件
使用定制的log4j文件追加器是否可以满足上述要求?我看了DailRollingFileAppender,但似乎不知道如何像我需要的那样控制文件名。此外,我似乎不知道在生成日志时如何在日志中写入第一行(例如,当新日志文件进入时,是否有一些回调函数可以注册)?我认为您可以使用 使用并指定
滚动策略
至于#3,为了子孙后代,你可以随时编写自己的处理程序。我使用下面的类作为我的自定义滚动策略
import org.apache.log4j.rolling.RollingPolicyBase;
import org.apache.log4j.rolling.RolloverDescription;
import org.apache.log4j.rolling.RolloverDescriptionImpl;
import org.apache.log4j.rolling.TriggeringPolicy;
import org.apache.log4j.Appender;
import org.apache.log4j.spi.LoggingEvent;
public final class CustomRollingPolicy extends RollingPolicyBase
implements TriggeringPolicy
{
private short curFileId = -1;
private String lastFileName = null;
static private final long FILETIMEINTERVAL = 86400000l;
static private final int NUM_FILES = 10;//86400000l;
public String folderName = "";
public String getFolderName() {
return folderName;
}
public void setFolderName(String folderName) {
this.folderName = folderName;
}
private short calculateID(long startTime) {
return (short) ((startTime / FILETIMEINTERVAL) % NUM_FILES);
}
public String getCurrentFileName()
{
StringBuffer buf = new StringBuffer();
buf.append(folderName);
buf.append(calculateID(System.currentTimeMillis()));
return buf.toString();
}
public void activateOptions()
{
super.activateOptions();
this.lastFileName = getCurrentFileName();
}
public RolloverDescription initialize(String currentActiveFile, boolean append)
{
curFileId = this.calculateID(System.currentTimeMillis());
lastFileName = getCurrentFileName();
String fileToUse = activeFileName != null? activeFileName: currentActiveFile != null?currentActiveFile:lastFileName;
return new RolloverDescriptionImpl(fileToUse, append, null, null);
}
public RolloverDescription rollover(String currentActiveFile)
{
curFileId = this.calculateID(System.currentTimeMillis());
String newFileName = getCurrentFileName();
if (newFileName.equals(this.lastFileName))
{
return null;
}
String lastBaseName = this.lastFileName;
String nextActiveFile = newFileName;
if (!currentActiveFile.equals(lastBaseName))
{
nextActiveFile = currentActiveFile;
}
this.lastFileName = newFileName;
return new RolloverDescriptionImpl(nextActiveFile, false, null, null);
}
public boolean isTriggeringEvent(Appender appender, LoggingEvent event, String filename, long fileLength)
{
short fileIdForCurrentServerTime = this.calculateID(System.currentTimeMillis());
return curFileId != fileIdForCurrentServerTime;
}
}
这是我的log4jxml文件中的appender配置:
<!-- ROLLING FILE APPENDER FOR RUM LOGS -->
<appender name="rumRollingFileAppender" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="com.ntrs.wpa.util.CustomRollingPolicy">
<param name="folderName" value="C:/bea-portal-10.3.2/logs/"/>
<param name="FileNamePattern" value="C:/bea-portal-10.3.2/logs/foo.%d{yyyy-MM}.gz"/>
</rollingPolicy>
<layout class="com.ntrs.els.log4j.AppServerPatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
检查这里:我会检查并更新它,如果它有效-谢谢你的建议。这就是我最终要做的。但我创建了自己的自定义滚动策略。我将发布代码。