5

私が取り組んでいるプロジェクトでログ フレームワークとして Log4j を使用しています。次のような状況があります: Log4j は、ログをログ ファイルに書き込むように構成されています。ある時点で、このログ ファイルは別の宛先にコピーされ、削除されます。ロギング フレームワークは機能し続けますが、ログ ファイルは削除されているため、ログ ファイルに書き込まれません。Log4j にファイルを再作成し、ログをログ ファイルに書き込み続けるように指示する方法はありますか。

よろしく、 ラシッド

4

5 に答える 5

1

I study the source of log4j and find log4j can't create new log file, it just print the error message to system.err when the log file was deleted

    /** 
     This method determines if there is a sense in attempting to append. 

     <p>It checks whether there is a set output target and also if 
     there is a set layout. If these checks fail, then the boolean 
     value <code>false</code> is returned. */  

  protected   boolean checkEntryConditions() {  
    if(this.closed) {  
      LogLog.warn("Not allowed to write to a closed appender.");  
      return false;  
    }  

    if(this.qw == null) {  
      errorHandler.error("No output stream or file set for the appender named ["+  
            name+"].");  
      return false;  
    }  

    if(this.layout == null) {  
      errorHandler.error("No layout set for the appender named ["+ name+"].");  
      return false;  
    }  
    return true;  
  }  

I think there are two workaround

  1. create another cron thread to monitor the log file
  2. add judge in getLog or getInstance (singleton), check the log file does exist, if not then init log4j
于 2012-08-24T09:27:10.010 に答える
1

log4j ファイルでこの行を宣言できることを確認してください

    log4j.appender.rollingFile.File=D:/myapp/mylog.log

すでに宣言している場合、ログ ファイルは任意に削除または置換できます。次に、プログラムを再実行すると、このパスに新しいログ ファイルが作成されます。

于 2012-08-24T09:23:45.053 に答える
1

このクラスを試す

package wodong.test;
import java.io.File;
import java.io.IOException;

import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;

public class LastFileAppender extends FileAppender {
    @Override
    public void append(LoggingEvent event) {
        checkLogFileExist();
        super.append(event);
    }
    private void checkLogFileExist(){
        File logFile = new File(super.fileName);
        if (!logFile.exists()) {
            try {
                logFile.createNewFile();
            } catch (IOException e) {
                System.out.println("Error while create new log file.");
            }
        }
    }
}

また、log4j構成ファイルを編集します

log4j.appender.R=wodong.test.LastFileAppender
于 2012-08-24T12:33:27.940 に答える
0

これを試してみてください。現在、Linux マシンを持っていないため、パフォーマンスの問題を解決できるかどうかはわかりません。

package wodong.test;
import java.io.File;
import java.io.IOException;

import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;

public class LastFileAppender extends FileAppender {
    @Override
    public void append(LoggingEvent event) {

        checkLogFileExist();
        super.append(event);
    }

    private void checkLogFileExist() {
        if (qw == null) {
            File logFile = new File(super.fileName);
            if (!logFile.exists()) {
                try {
                    logFile.createNewFile();
                } catch (IOException e) {
                    System.out.println("Error while create new log file.");
                }
            }
        }
    }
}
于 2012-08-25T15:57:30.093 に答える