我目前正在開發一個程序,其中,我必須將所有輸出寫入日誌文件。使用多個參數記錄
我需要編寫一個日誌方法,它應該按照我所指定的順序給出帶有級別,消息,對象值,另一個消息,整數值,另一個消息和另一個整數值的輸出。我似乎無法找到這樣做的日誌方法。我正在使用Java.util.logging
。這可能嗎?
我目前正在開發一個程序,其中,我必須將所有輸出寫入日誌文件。使用多個參數記錄
我需要編寫一個日誌方法,它應該按照我所指定的順序給出帶有級別,消息,對象值,另一個消息,整數值,另一個消息和另一個整數值的輸出。我似乎無法找到這樣做的日誌方法。我正在使用Java.util.logging
。這可能嗎?
我假設你需要在以下格式 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());
這是一個相當古老的話題,無論如何,我的兩分錢,因爲我也更喜歡在我的項目中使用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)
);
希望這有助於你們中的一些誰也想使用內置記錄:-)
乾杯本
考慮Log4J的HTTP:/ /logging.apache.org/log4j/2.x/ – Mirco 2013-04-08 13:40:23
@verbose-mode爲什麼? java util logging可以完成所有必需的操作,並且使用起來更簡單。據我所見,你的建議打破了KISS(Keep it Simple S ...)原則。 – Martin 2014-11-12 12:50:19