0

Java コードでログを作成したい。そして、プロセス全体が完了するまでに数時間かかります。しかし、バッファは最後に閉じられるため、私のコードは実行の最後にすべてのログを作成します。

ログファイルに追加できる方法はありますか?

私のコードを見て、必要な変更を提案してください。前もって感謝します。

私のコード

public class test {

    public static void func(String url1, String url2, BufferedWriter bw) throws  InterruptedException, IOException {
        long loading_time = 10878;
        long parsing_time = 120;
        long processing_time = 329;
        Thread.sleep(100000000);  // Here is some process that performs recursively
        bw.write( url1 + "\n" + url2 + "\n"+ ((double)loading_time)/((double)1000)+ " seconds   " + ((double)parsing_time)/((double)1000) +  " seconds   "  + ((double)processing_time)/((double)1000) + " seconds\n\n\n\n" );
    }

    public static void main(String[] args) throws IOException, InterruptedException{
        try {
            FileWriter fw = new FileWriter("C:\\Users\\jhamb\\Desktop\\log.txt");
            BufferedWriter bw = new BufferedWriter(fw);
            for(int i = 0; i < 5; i++) { func("hitesh", "jhamb", bw);  }
            bw.close();
        } catch (Exception e) {
            System.out.println("Sorry some problem");
        }
    }
} 
4

3 に答える 3

1

最初log4jに POM の依存関係を追加します。そのコピーの行の下に、

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

次に、ファイルlog.propertiesを作成し、これらの行を次の場所にコピーします<PROJECT FOLDER>\src\main\resources\

# Define the root logger with appender file
log4j.rootLogger = INFO, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=C:/Users/jhamb/Desktop/log.txt

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n 

次に、メイン クラスに行を追加します。

static Logger log = Logger.getLogger( Scroll_down.class.getName() );

ここで、Scroll_down は私のプロジェクトのクラス名です。

を使用して、好きな場所にログを作成できるようになりました

log.info( <PUT STRING HERE> )

ここで私の上記の場合は、

log.info( url1 + "\n" + url2 + "\n"+ ((double)loading_time)/((double)1000)+ " seconds   " + ((double)parsing_time)/((double)1000) +  " seconds   "  + ((double)processing_time)/((double)1000) + " seconds\n\n\n\n" );

これらは、上記の質問の要件を満たすために私が従った手順です。

于 2013-04-14T09:09:30.503 に答える
0

独自のファイルを作成するのではなく、ロギング フレームワークを使用してログを記録する必要がありますSL4Jをご覧ください

これは、サイトの Hello World サンプルです。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

bw.write() を呼び出す場所はいつでも、場合に応じて logger.info()、logger.warn() logger.error() などに置き換えます。

これはコンソールに出力されます。これがファイルである必要があることを示すには、構成を使用する必要があります。私はそれをあなたに任せます:-)

編集:

sl4j を使用すると、コードは次のようになります。

public class Test {
    Logger logger = LoggerFactory.getLogger(Test.class);
    public static void func(String url1, String url2, BufferedWriter bw) throws  InterruptedException, IOException {
        //your code
        logger.info(" {} \n {} \n  {} seconds   {} seconds   {}  seconds\n\n\n\n",url1,url2 ,((double)loading_time)/((double)1000),((double)parsing_time)/((double)1000), ((double)processing_time)/((double)1000) );

    }

    public static void main(String[] args) throws IOException, InterruptedException{
        try {
               //
        } catch (Exception e) {
                logger.error("Sorry some problem",e);
        }
    }
}    
于 2013-04-10T12:20:41.387 に答える
0

ブロッキング キューを使用してログ タスクを保存することをお勧めします。ログに記録するものがあるとすぐに、ログ オブジェクトを作成し、キューに保存します。(単純な文字列でも十分です)

別のスレッドがキューを同時に処理する必要があります。

実装の詳細については、http ://www.javamex.com/tutorials/blockingqueue_example.shtml をご覧ください。

プロシージャ (再帰的またはその他の方法) が実行されていても、キューは同時に処理され、ログを開始するためにプロセス全体が終了するのを待つ必要はありません。

于 2013-04-10T12:23:47.047 に答える