我一直试图在谷歌上查找这个答案一段时间,并认为我只是来这里寻找答案.
在生产过程中,这个设置工作正常,因为它打印到stdout和stderr,我将其分开并解析以供以后使用,但在开发期间,我们希望看到这些日志记录操作在它们发生时打印,即每个日志记录.我认为java将此称为自动刷新.我似乎无法找到我可以更改我具有的流处理程序对象的缓冲区大小,以解决此问题.
我有一些选择如下:
>在Formatter中将日志打印到stdout
>在每次调用方法后刷新处理程序(可能使用groovy注释)
>在调试期间启用控制台处理程序
我使用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();
}
}
非常感谢你!