2013-04-16 82 views
3

我正在使用java.util.logging進行日誌記錄(我不想使用log4j或其他任何東西)。繼承java.util.logging.Formatter不起作用

這是我的完整的私人logging.properties:

handlers= java.util.logging.FileHandler 
.level= INFO 
java.util.logging.FileHandler.pattern = my.log 
java.util.logging.FileHandler.limit = 500000 
java.util.logging.FileHandler.count = 40 
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter 

這是我的程序代碼:

public static Logger log = Logger.getLogger(MyClass.class.getName()); 
// Is there anything else to be init'ed here? 
// I don't. I just start using log directly in the code. 

log.severe("something"); 
log.info("something else"); 

由於這給出了2行,每行日誌信息,我想這

How do I get java logging output to appear on a single line?

複製了LogFormatter類中的第e首先正確回覆。

在我logging.properties

java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter; 

更改一行現在我的日誌已開始出現在XML。我有強烈的感覺,FileHandler不喜歡我的com.mycomp.myproj.LogFormatter,因此默認爲XMLFormatter。我怎麼知道爲什麼FileHandler沒有使用我的LogFormatter類?

回答

4

您可以在FileHandler實例的代碼本身中設置格式器。

import java.util.logging.FileHandler; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

// please change name of your own choice 
Logger log = Logger.getLogger("CustomLogger"); 
log.setUseParentHandlers(false); 
log.setLevel(Level.ALL); 

FileHandler handler = new FileHandler("[log_file_location]"); 
handler.setFormatter(new CustomFormatter()); // set formatter 
log.addHandler(handler); 

log.info("test message"); 

handler.close(); // close the handler at some later point in your application. 

CustomFormatter類定義如下。

import java.util.logging.Formatter; 
import java.util.logging.LogRecord; 

public class CustomFormatter extends Formatter { 

    @Override 
    public String format(LogRecord record) { 
     StringBuffer buffer = new StringBuffer(); 
     buffer.append(record.getMessage()); 
     return buffer.toString(); 
    } 

} 

您可以在CustomFormatter中進行編碼,以任何您想要的格式輸出消息。希望這可以幫助。

+0

我會試試這個 - 但我的問題是關於爲什麼現有的設置不起作用。我究竟做錯了什麼? – user93353

+0

'log.setLevel(Level.ALL);' - 這是必要的 - 我想使用任何級別在我的logging.properties文件中指定? – user93353

+0

另外log_file_location - 我想使用在logging.properties中指定的位置。 – user93353

4

如何找出爲什麼FileHandler不使用我的LogFormatter類?

在調試器中啓動程序並逐步執行代碼。設置斷點在和/或LogManager.readConfiguration()

或者忘記java.util.logging和使用像logback一個框架,易於配置併爲您提供有用的錯誤信息時,什麼是錯的。

1

好吧,這真的讓我很生氣,並且讓我瘋狂,我無休止地檢查拼寫,做谷歌搜索等等 - 這就是我到這裏的方式 - 我知道這已經一歲了,但你要踢你自己。這是我非常確定的答案。

爲:

java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter; 

這應該是:

java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter 

降訓練 「;」。它似乎需要匹配正好到類名稱我看到別人抱怨他們有拖尾空白字符 - 這是我的問題是。更好的錯誤信息會有幫助。

乾杯 - 馬克

+0

爲什麼我不能給1000分。爲我留下空間 –

1

com.mycomp.myproj.LogFormatter是不是在你的系統類路徑。

日誌管理將做以下調用加載類:

Formatter getFormatterProperty(String name, Formatter defaultValue) { 
     String val = getProperty(name); 
     try { 
      if (val != null) { 
       Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(val); 
       return (Formatter) clz.newInstance(); 
      } 
     } catch (Exception ex) { 
      // We got one of a variety of exceptions in creating the 
      // class or creating an instance. 
      // Drop through. 
     } 
     // We got an exception. Return the defaultValue. 
     return defaultValue; 
} 

你需要確保你的類LogFormatter是在系統的類路徑。