我目前工作的一个程序,其中,我必须写所有输出到一个日志文件。
我需要写日志的方法,如我已指定应该得到具有电平的输出,一个消息,一个对象的值,另一个信息,一个整数值,另一个消息,另一个的整数值,以相同的顺序。 我似乎无法找到,这是否日志方法。 我使用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);
}
}
现在设置新创建的格式化
for(int i=0;i<logger.getHandlers().length;i++)
logger.getHandlers()[i].setFormatter(new DataFormatter());
这是一个很老的话题,无论如何,我的两分钱,因为我也喜欢在我的项目中使用java.util.logging.Logger`有充分。
Lambda表达式让这个样板格式化扩展为多个自定义参数或多或少过时,除非你从它的应用范围重用受益。 在(我的)简单的场景,日志消息将针对它插入代码的一部分,这样String.format()
通常更容易,更灵活。
Java的8和lambda表达式之前 , Formatter
被推迟的消息建设的唯一的可能性。 唯一的选择是,以前来构建登录提前消息loggable
发生基于水平检查。
在Java 8个Lambda表达式 ,字符串格式化可以推迟到后loggable
检查,但仍与访问原始的方法上下文。 唯一的小缺点是,所有访问的字段需要是最终的,由于拉姆达限制。
这里一个相当简单的片断:
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)
);
希望这有助于你们中的一些谁也想使用内置记录:-)
干杯本
我们用下面的代码,同时使用SLF4J记录器 -
logger.error("Error while finding A from DB. a : {} and b : {}", a,b);
logger.info("Nothing found in db for A with a : {} and b : {}",a,b);