有多个参数记录(Logging with multiple parameters)

2019-08-20 07:32发布

我目前工作的一个程序,其中,我必须写所有输出到一个日志文件。

我需要写日志的方法,如我已指定应该得到具有电平的输出,一个消息,一个对象的值,另一个信息,一个整数值,另一个消息,另一个的整数值,以相同的顺序。 我似乎无法找到,这是否日志方法。 我使用Java.util.logging 。 这可能吗?

Answer 1:

我假设你需要在以下格式的日志格式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());


Answer 2:

这是一个很老的话题,无论如何,我的两分钱,因为我也喜欢在我的项目中使用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)
);

希望这有助于你们中的一些谁也想使用内置记录:-)

干杯本



Answer 3:

我们用下面的代码,同时使用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);


文章来源: Logging with multiple parameters