0

私の会社では、サーバーからログ ファイルを読み込んで解析し、パフォーマンス データをデータベースに出力するソフトウェア パッケージを使用しています。ファイルを読み取るアプリのソースコードを変更するアクセス/許可はありませんが、ファイルを書き込むコードにはアクセスできます。ログ ファイルの書き込み方法を変更する必要があり、log4j を使用したいと考えています (AsyncAppender を使用できるようにするため)。プログラムはいくつかのことを期待しています:

1)。10 個のログ ファイルがローリングされ、各ログ ファイルは 1 日分のログになります。ファイルには 0 から 9 までの名前を付ける必要があり、プログラムでファイル名を設定し、サーバー時間に基づいてロールするタイミングを設定できる必要があります。

2)。基本的に、11 番目のログ ファイルを生成するときに、最も古いログ ファイルを削除し、そのログ ファイルへの書き込みを開始する必要があります。

3)。新しいログ ファイルが生成されたら、タイムスタンプをファイルの最初の行として挿入できるようにする必要があります (System.currentTimeMillis())。

カスタムlog4jファイルアペンダーで上記の要件を満たすことは可能ですか? 私は DailyRollingFileAppender を見てきましたが、必要に応じてファイル名を正確に制御する方法がわかりません。また、ログが生成されたときに最初の行をログに書き込む方法がわからないようです (たとえば、新しいログ ファイルがロールインされたときに登録できるコールバック関数があります)。

4

2 に答える 2

0

後世のために。カスタムローリングポリシーとして以下のクラスを使用しました

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;
}
}

そして、ここに私のlog4j xmlファイルのアペンダー構成があります:

    <!-- 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>    
于 2013-11-15T00:01:36.733 に答える