2012-02-20 32 views
14

有沒有任何方法可以將錯誤日誌或異常寫入java中的文件中。我已經通過Log4j。我搜索了一下,但diidnt找到了一個好的解決方案。我寫了一個簡單的代碼如何在java中將錯誤日誌或異常寫入文件

catch (Exception e) { 
    PrintWriter pw = new PrintWriter(new FileOutputStream("Log"));  
    e.printStackTrace(pw); 
} 

是否有任何其他方式來記錄錯誤或異常?任何機構可以爲我提供Log4j的示例示例嗎?

回答

22

首先閱讀log4j Manual,很容易配置滾動日誌文件。你不必做任何明確的文件操作。

#SET LEVEL of ROOT-LOGGER, you will like to have Debug in local, but in prod you may just want WARN and ABOVE. This setting is done here! 
log4j.rootLogger=debug, stdout, R 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

# Pattern to output the caller's file name and line number. (basically, format of log) 
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 

# THIS IS WHERE YOU WILL HAVE ALL THE LOG WRITTEN 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=/var/log/applogs/example.log 

# Maximum size of log file, usually we keep 10MB 
log4j.appender.R.MaxFileSize=100KB 
# Keep one backup file, usually we keep 10 
log4j.appender.R.MaxBackupIndex=1 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 

其次,當你捕獲異常,做這樣的

public class MyClass{ 

    private static Logger logger = Logger.getLogger(MyClass.class); 

    public ReturnType myMethod(Param p, Param2 p2) { 
    .... 
    .... 
    try { 
     ..  
    } catch(MyException e) { 
     logger.log("Exceptions happen!", e); //this will put all the details in log file configured earlier 
    } 
    .... 
    } 

    .... 
} 

它值得閱讀的手冊。更好的閱讀Complete log4j Manual

+1

以及當未經檢查的例外出現時我該怎麼辦?我怎樣才能確保一切將被髮送到記錄器? – Blauhirn 2015-02-17 20:16:17

+0

使用'Throwable'來捕捉*一切*。但不可取。你可能想閱讀這些帖子:1. http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation 2. http://stackoverflow.com/questions/2274102/difference-between -using-throwable-and-try-catch – Nishant 2015-02-18 06:57:33

+0

@Nishant日誌文件位於何處?它在apache文件夾內嗎? – KJEjava48 2017-04-03 11:27:14

2

使用log4j您可以登錄exceptiosn很容易:

try { 
    ... 
} catch(Exception e) { 
    log.error("An exception! Oops!", e); 
} 
4
try { 
     System.setErr(new PrintStream(new FileOutputStream(System.getProperty("user.home")+"/error.log"))); 
} catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
} 

現在所有的錯誤輸出寫入該文件

+1

儘管技術上是正確的,但是如何比使用日誌框架(log4j,juli,commons-logging等)更好? – pap 2012-02-20 14:37:57

+2

爲什麼使用框架,什麼時候可以用javas自己的方法來解決? – Thargor 2012-02-20 14:43:12

+3

1:診斷上下文不支持(線程,類,方法等) 3:針對不同的日誌級別 2不支持格式化輸出 我可以繼續下去不支持。你可以用螺絲刀釘釘子,但爲什麼你不用錘子? – pap 2012-02-20 14:46:38

3

可以作爲參數添加例外您的log4j的說法,例如

catch(Exception e) 
{ 
    logger.error("Unexpected error", e); 
} 

只要你有一個文件appender運行正常,這將輸出異常的完整堆棧跟蹤。

1

Look this tutorial about "File Appender"

official Log4j short introduction和 「配置」 部分。

您還可以搜索「RollingFileAppender」或「文件appender」。

您可以配置您的記錄器以將其消息發送給appender。該附加器可以轉發消息向控制檯(標準輸入),對文件(FileAppender,RollingFileAppender進行...)...

使用它進行錯誤日誌:

try{ 
    throw new Exception("bla bla bla..."); 
} catch(Exception e){ 
    // log without stack trace 
    mLogger.error("Your log message"); 

    // log with stack trace 
    mLogger.error("Your log message", e); 
} 
相關問題