2013-04-08 54 views
8

我目前正在開發一個程序,其中,我必須將所有輸出寫入日誌文件。使用多個參數記錄

我需要編寫一個日誌方法,它應該按照我所指定的順序給出帶有級別,消息,對象值,另一個消息,整數值,另一個消息和另一個整數值的輸出。我似乎無法找到這樣做的日誌方法。我正在使用Java.util.logging。這可能嗎?

+0

考慮Log4J的HTTP:/ /logging.apache.org/log4j/2.x/ – Mirco 2013-04-08 13:40:23

+1

@verbose-mode爲什麼? java util logging可以完成所有必需的操作,並且使用起來更簡單。據我所見,你的建議打破了KISS(Keep it Simple S ...)原則。 – Martin 2014-11-12 12:50:19

回答

13

我假設你需要在以下格式 FINE,即Message,object.GetValue(),Message2,1日誌格式,Message3,2

你需要創建一個輸出消息格式

logger.log(Level.INFO, "{0},{1},{2},{3},{4},{5}",new Object[]{Message1,object.getValue(),Message2,1,Message3,2}); 

現在你需要它通過擴展格式化類

public class DataFormatter extends Formatter { 

@Override 
public synchronized String format(LogRecord record) { 
    String formattedMessage = formatMessage(record); 
    String throwable = ""; 
    String outputFormat = "%1$s, %2$s \n %3$s"; //Also adding for logging exceptions 
    if (record.getThrown() != null) { 
     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     pw.println(); 
     record.getThrown().printStackTrace(pw); 
     pw.close(); 
     throwable = sw.toString(); 
    } 
    return String.format(outputFormat,record.getLevel().getName(),formattedMessage,throwable); 
} 
} 

現在設置新創建的格式化

0123來創建自定義格式
for(int i=0;i<logger.getHandlers().length;i++) 
     logger.getHandlers()[i].setFormatter(new DataFormatter()); 
9

這是一個相當古老的話題,無論如何,我的兩分錢,因爲我也更喜歡在我的項目中使用java.util.logging.Logger`。

Lambdas爲多個自定義參數創建了這個樣板格式化擴展,或多或少已經過時,除非您從其在應用程序範圍內的重用中受益。在(我的)簡單場景中,日誌消息會根據插入的代碼部分進行量身定製,因此String.format()通常更容易且更靈活。

在Java 8和lambdas之前,Formatter是推遲消息構造的唯一可能性。唯一的替代是,建立消息提前登錄loggable檢查基礎上的水平發生。
使用Java 8 lambda,可以將字符串格式化推遲到loggable檢查後,但仍然可以訪問原始方法上下文。唯一的小缺點是,由於lambda限制,所有訪問的字段都必須是最終的。

這裏一個相當簡單的片斷:

final String val1 = "lambda expression log message"; 
final Level level = Level.INFO; 
Logger.getGlobal().log(level,() -> 
     String.format("Hello, I'm a %s, evaluated after %s loggable check.", val1, level) 
); 
Logger.getGlobal().log(level, new RuntimeException(),() -> 
     String.format("Hello, I'm a %s with a stack trace, evaluated after %s loggable check.", val1, level) 
); 

希望這有助於你們中的一些誰也想使用內置記錄:-)

乾杯本