2013-04-10 33 views
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"); 
     } 
    } 
} 
+1

使用任何日誌框架 – rajesh 2013-04-10 12:14:37

+0

@rajesh請參閱我的上述代碼,並請建議我如何更改此? – devsda 2013-04-10 12:15:26

回答

1

首先在POM的位置添加依賴log4j,低於行該副本,

<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()); 

H在我的項目中,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"); 

這些步驟,我跟着履行我對上述問題的要求。

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); 
     } 
    } 
}  
+0

最終我必須再次閱讀,我以前完成。 – devsda 2013-04-10 12:33:25

+0

但是你必須使用框架來記錄而不是自己寫。這將是您認爲您將在所有代碼中使用的人。 – rajesh 2013-04-10 12:34:52

+0

檢查編輯。 – rajesh 2013-04-10 12:45:26

0

我建議你使用阻塞隊列來存儲日誌的任務。只要你有一些東西來創建日誌對象並存儲在隊列中。 (簡單的字符串也足夠了)

單獨的線程應該同時處理您的隊列。

對於實施細節請查看:http://www.javamex.com/tutorials/blockingqueue_example.shtml

但是長的過程(遞歸或其他方式)運行時,您的隊列將被同時處理,你不必等待整個過程結束,開始記錄。

相關問題