27

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

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

4

3 回答 3

34

我假设您需要以下格式的日志格式 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<logger.getHandlers().length;i++)
        logger.getHandlers()[i].setFormatter(new DataFormatter());
于 2013-04-08T13:56:52.627 回答
23

我们在使用 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);
于 2018-07-31T12:05:32.503 回答
15

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

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

在 Java 8和 lambdas 之前,这Formatter是推迟消息构造的唯一可能性。唯一的选择loggable是,在基于级别的检查发生之前构建消息以提前登录。
使用 Java 8 lambdas,字符串格式可以推迟到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)
);

希望这对你们中的一些也想使用内置日志记录的人有所帮助:-)

干杯本

于 2016-06-28T10:14:03.320 回答