使用多个参数进行记录

我目前正在开发一个程序,其中,我必须将所有输出写入日志文件。

我需要编写一个log方法,它应该给出一个带有级别,消息,对象值,另一个消息,整数值,另一个消息和另一个整数值的输出,其顺序与我指定的顺序相同。 我似乎无法找到执行此操作的日志方法。 我正在使用Java.util.logging 。 这可能吗?

我假设您需要以下格式的日志格式FINE,Message1,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}); 

现在,您需要通过扩展Formatter类来创建自定义格式化程序

 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 

无论如何,这是一个相当古老的话题,我的两分钱,因为我也更喜欢在我的项目中使用java.util.logging.Logger`。

除非您从应用程序范围的重用中受益,否则Lambdas会为多个自定义参数或多或少地使用这个样板文件扩展名。 在(我的)简单场景中,日志消息是针对插入它的代码部分定制的,因此String.format()通常更容易和更灵活。

在Java 8和lambdas 之前Formatter是推迟消息构造的唯一可能性。 唯一的选择是,在根据Level发生的可记录检查之前构造消息以提前登录。
使用Java 8 lambdas ,可以在可记录检查之后将String格式推迟到,但仍然可以访问原始方法上下文。 唯一的小缺点是,由于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) ); 

希望这可以帮助一些也想使用内置日志记录的人:-)

干杯本

我们在使用slf4j logger时使用了以下代码 –

 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);