【问题标题】:How to add a header caption in all logger message exceptions如何在所有记录器消息异常中添加标题标题
【发布时间】:2017-07-12 12:38:13
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是哪个版本的 JBoss AS、JBoss EAP 或 WildFly?
  • 嗨@JamesR.Perkins,我在Eclipse IDE 中使用WildFly 8 (8.2.1.Final) 和Java (jdk 1.8.0_121)。
  • 消息的[CERT:1642 ENS:5] 部分来自哪里?日期格式很容易使用模式格式化程序。另一部分可能也是。
  • 我创建了一个自定义标题标题。结构在哪里:[date hour] [ids that identifies the current user (it isn't the WildFly user, is the object instance of user)][type of message]:

标签: java exception logging jboss wildfly


【解决方案1】:

我不知道您的记录器是如何初始化的,但您可以尝试在根记录器上设置格式化程序(在记录器上调用parent() 直到null)。

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

System.setProperty("java.util.logging.SimpleFormatter.format", <template>);

请参阅该类的 javadoc 以了解如何构造模板。

【讨论】:

  • 嗨@mar​​k,谢谢你的建议。我知道我的自定义记录器有一个父记录器,而我的父记录器有根父记录器。我已将 MyCustomFormatter 设置为我所有的父记录器。但我认为这不是正确的方法,因为我不想更改父记录器的输出格式。
  • 那么你需要找出你的未捕获异常处理程序正在使用什么记录器。
  • FWIW WildFly 默认不使用java.util.logging.SimpleFormatter
  • 为了放弃可能性,我不在我的项目中使用SimpleFormatter。我从java.util.logging.Formatter 扩展MyCustomFormatter
【解决方案2】:

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

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

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

【讨论】:

  • 感谢@James 的建议。但我认为首先,我必须实现我的 Web 应用程序的所有文本异常都应该有一个自定义标题标题。现在,在我的应用程序在标准输出/错误控制台/文件上打印之前,我无法捕获异常。我认为您的建议将是下一步。
  • 我不确定我是否理解异常的问题。你能解释一下你想用它们做什么吗?
猜你喜欢
  • 2012-08-12
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多