gpt4 book ai didi

java - JUL 日志记录 - 消息上的实例前缀

转载 作者:行者123 更新时间:2023-11-30 06:21:45 27 4
gpt4 key购买 nike

我希望我的记录器在每条消息上添加一个文本字符串前缀,因为我需要确定类的哪个实例记录了该消息。我怎样才能做到这一点?

我不想记住在每个日志记录方法调用上添加前缀,所以我正在寻找一个更像是直接插入的解决方案。当然,记录器本身不能再像正常情况那样是静态的。

我研究了 FomatterHandler 的使用,但无法解决这个特定用例的问题。 JUL 几乎是为类级记录器设计的,而不是实例级记录器。也许我的处理方式是错误的?

想留在 JUL。

最佳答案

I've investigated use of Fomatters and Handlers but haven't been able to crack the nut for this particular use case. JUL is pretty much designed for class-level loggers, not instance-level loggers. Perhaps I'm going about this the wrong way?

JUL 中仅包含两个格式化程序。 XMLFormatter包括记录器名称。 SimpleFormatter包括可设置为包含记录器名称的格式属性。这是一个测试程序,可确保您已正确设置所有内容。

import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.LogRecord;


public class SimpleFormatTest {

public static void main(String[] args) throws Exception {
//final String format = "%1$ta %1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS.%1$tL %1$Tp %2$s%n%4$s: %5$s%n";
final String format = "%1$tc %2$s%n%3$s %4$s: %5$s%6$s%n";
final String key = "java.util.logging.SimpleFormatter.format";
test(format);
test(System.getProperty(key, format));
test(LogManager.getLogManager().getProperty(key));
}

private static void test(String format) {
if (format != null) {
System.out.println("============");
LogRecord record = new LogRecord(Level.INFO, "msg");
record.setLoggerName("logger.name");
record.setSourceClassName(SimpleFormatTest.class.getName());
record.setSourceMethodName("test");
System.out.println(String.format(format,
new java.util.Date(record.getMillis()),
record.getSourceClassName(),
record.getLoggerName(),
record.getLevel().getLocalizedName(),
record.getMessage(),
record.getThrown() == null ? "" : record.getThrown()));
System.out.println("============");
}
}
}

But I was looking for a solution that would include the prefix in message text. I cannot know what Formatter the user would want to use and he may choose to not log the logger name (in contrast nobody will ever create a Formatter which omits the message text).

在您的应用程序中包含一个logging.properties。您可以添加一个前提条件检查,使您的代码根本无法工作。这将强制用户设置配置。

 public class NoStart {
public static void main(String[] args) throws IOException {
String id = "logger.name";
LogRecord record = new LogRecord(Level.INFO, "msg");
record.setLoggerName(id);
File f = File.createTempFile("test", ".tmp");
try {
FileHandler fh = new FileHandler(f.getCanonicalPath(), false);
try {
Formatter fmt = fh.getFormatter();
String r = fmt.format(record);
if (!r.contains(id)) {
throw new IllegalStateException("Formatter must contain logger name.");
}
} finally {
fh.close();
}
} finally {
f.delete();
}
}
}

否则,您可以创建自定义过滤器来修改 LogRecord 消息。

public class PrefixMessageFilter implements Filter {

private final String instanceId;
private final Filter target;

public PrefixMessageFilter(final String instanceId, final Filter target) {
this.instanceId = instanceId;
this.target = target;
}

@Override
public boolean isLoggable(LogRecord record) {
record.setMessage(instanceId + ' ' + record.getMessage());
return target == null || target.isLoggable(record);
}

//Example code to setup filter.
private Logger logger = Logger.getLogger(toString());
{
logger.setFilter(new PrefixMessageFilter(toString(), logger.getFilter()));
}
}

您只需在首次使用时修改记录器即可。

关于java - JUL 日志记录 - 消息上的实例前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48007387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com