[英]Logback not logging Exceptions using logger.error(message, throwable)
[英]How to add a header caption in all logger message exceptions
我正在使用Java和Jboss开发Web应用程序。
我使用java logger java.util.logging
来记录消息。
我对使应用程序具有自定义标题标题的所有输出消息感兴趣。 例如:
[21.2.2017 13:25:28][CERT:1642 ENS:5][ERROR]: java.lang.ArithmeticException: / by zero
自定义标题标题为: [21.2.2017 13:25:28][CERT:1642 ENS:5][ERROR]
我已经能够做到这一点,创建了一个自定义(扩展java.util.logging.Formatter
)。
Logger logger = null;
StreamHandler handler = null;
MyCustomFormatter format = null;
logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME + "." + custom_name);
format = new MyCustomFormatter();
handler = new StreamHandler(System.out, format);
logger.addHandler(handler);
我只能在显式调用记录器的情况下显示标题标题。 例如:
代码中的任何位置: logger.info(msg);
捕获异常中: logger.severe(e.printStackTrace());
我想在所有消息中添加此标题,在我无法通过try / catch控制的错误或异常消息中也要添加此标题。
我该怎么办?
编辑1
我的自定义记录器有一个父记录器,而这个父记录器有根记录器。
Logger.getLogger("")
|------> Logger.getLogger("global")
|------> Logger.getLogger(Logger.GLOBAL_LOGGER_NAME + "." + custom_name)
我做了一个测试。 我创建了一个自定义PrintStream
和OutputStream
以避免在控制台和日志文件中不显示错误,并在System.err
上进行设置:
CustomNullPrintStream pse = new CustomNullPrintStream(new CustomNullOutputStream());
System.setErr(pse);
我已经覆盖了没有内容代码的所有方法。
然后,如果我引发这样的异常:
try {
throw new Exception("ERROR TEST");
} catch (Exception e1) {
e1.printStackTrace();
}
在控制台和日志文件上看不到该异常。 但是,如果我在没有try / catch的情况下引发了这样的异常:
int iii = 1/0;
iii = iii+1;
例外是可见的,并始终显示在控制台和日志文件上。 为什么? 在两种情况下是例外/错误。
我不知道记录器是如何初始化的,但是您可以尝试在根记录器上设置格式化程序(在记录器上调用parent()
直到null
)。
另一种方法是更改全局模板本身,而不是覆盖它。 这可以通过编程方式或通过命令行完成。
System.setProperty("java.util.logging.SimpleFormatter.format", <template>);
有关如何构造模板,请参见该类的javadoc。
如果您已经有一个自定义格式化程序,则使用格式化程序的最佳方法是将其设置为WildFly中的一个模块。 从那里,您可以将其添加为WildFly中的custom-formatter
器,并将其分配给您要查看该格式的处理程序。
这是一些CLI命令的示例:
module add --name=com.example.formatter --resources=/path/to/formatter.jar
/subsystem=logging/custom-formatter=my-formatter:add(class=com.example.formatter.MyCustomFormatter, module=com.example.formatter)
/subsystem=logging/console-handler=CONSOLE:write-attribute(name=named-formatter, value=my-formatter)
上面的代码会将格式化程序用于所有写入控制台的消息。 您可以将其更改为使用其他处理程序,或仅将新处理程序分配给特定的日志类别。
需要注意的一件事是,您不应该像现在那样更改代码中的日志管理器。 这将更改容器及其中所有部署的日志记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.