gpt4 book ai didi

java - 使用 java.util.logging Autoflush 在调试期间刷新流处理程序

转载 作者:搜寻专家 更新时间:2023-11-01 01:21:13 24 4
gpt4 key购买 nike

一段时间以来,我一直试图在谷歌上查找这个答案,我想我只是来这里寻找答案。

在生产过程中,这个设置工作正常,因为它打印到 stdout 和 stderr,我将它们分开并解析以备后用,但在开发过程中,我们希望看到这些记录操作在它们发生时被打印,即每条日志记录。我认为 java 将此称为自动刷新。我似乎找不到在哪里可以更改我拥有的流处理程序对象的缓冲区大小以解决此问题。

我考虑过的一些选项如下:

  1. 在格式化程序中将日志打印到标准输出
  2. 在每次方法调用后刷新处理程序(可能使用 groovy 注释)
  3. 在调试期间启用控制台处理程序

我正在使用 java.util.logging 来处理我的应用程序完成的所有日志记录,我们正在使用以下代码创建根记录器:

public Logger buildLogger()
{
Logger log = Logger.getLogger("") //TODO update when JDK updatesLogger.getGlobal() is what we would like to use here
log.setLevel(Level.WARNING)
log.setUseParentHandlers(false); //Turn off any Parent Handlers
Handler[] handlers = log.getHandlers();
for(Handler handler : handlers) {
log.removeHandler(handler);
}
log.addHandler(soh); //Add stdOut Handler
log.addHandler(seh); //Add stdErr Handler
return log;
}

处理程序在这里

public StreamHandler buildsoh()
{
def soh = new StreamHandler(System.out, formatter)
soh.setLevel(Level.ALL); //Default StdOut Setting
return soh;
}

public StreamHandler buildseh()
{
def seh = new StreamHandler(System.err, formatter)
seh.setLevel(Level.SEVERE); //Default StdErr Setting
return seh;
}

格式化程序在这里:

public class MyLogFormatter extends Formatter {
@Override
public String format(LogRecord record) {
StringBuffer log = new StringBuffer()
log.append("[${record.getLevel()}]")
log.append(new Date(record.getMillis()).format("yyyy-MM-dd HH:mm:ss"))
log.append(" ")
log.append("[").append(record.getSourceClassName() ?: record.getLoggerName())
log.append(" ")
log.append(record.getSourceMethodName() ?: " - ").append("]")
log.append(": ");
log.append(record.getMessage());
log.append(System.getProperty("line.separator"));
return log.toString();
}
}

非常感谢!

最佳答案

如果你想刷新你记录的每条记录,这可能是有用的(在 java 中):

public StreamHandler buildseh() {
final StreamHandler seh = new StreamHandler(System.err, formatter) {
@Override
public synchronized void publish(final LogRecord record) {
super.publish(record);
flush();
}
};
seh.setLevel(Level.SEVERE); // Default StdErr Setting
return seh;
}

关于java - 使用 java.util.logging Autoflush 在调试期间刷新流处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27825682/

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