繁体   English   中英

如何在所有记录器消息异常中添加标题标题

[英]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)

我做了一个测试。 我创建了一个自定义PrintStreamOutputStream以避免在控制台和日志文件中不显示错误,并在System.err上进行设置:

CustomNullPrintStream pse = new CustomNullPrintStream(new CustomNullOutputStream());
System.setErr(pse);
  • CustomNullPrintStream扩展PrintStream
  • CustomNullPrintStream扩展OutputStream

我已经覆盖了没有内容代码的所有方法。

然后,如果我引发这样的异常:

            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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM