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

时间:2017-02-22 12:46:03

标签: java exception logging jboss wildfly

我正在使用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;

异常是可见的并且一直显示在控制台和日志文件中。 为什么?在两种情况下是例外/错误。

2 个答案:

答案 0 :(得分:0)

我不知道您的记录器是如何初始化的,但您可以尝试在根记录器上设置格式化程序(在记录器上调用lapply(mydf, function(x) x[!duplicated(x[c("Val")]), ]) 直到parent())。

另一种方法是更改​​全局模板本身而不是覆盖它。这可以通过编程方式或通过命令行完成。

null

查看该类的javadoc是如何构造模板的。

答案 1 :(得分:0)

如果您已经拥有自定义格式化程序,则使用格式化程序的最佳方法是将其作为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)

以上内容会将您的格式化程序用于写入控制台的所有消息。您可以将其更改为使用不同的处理程序,或者只是将新处理程序分配给特定的日志类别。

有一点需要注意的是,你不应该像你正在做的那样改变代码中的日志管理器。这将更改容器和容器内所有部署的日志记录。