JBoss/Wildfly - 安全高效的日志过滤 - 多个处理程序记录到同一个文件

Posted

技术标签:

【中文标题】JBoss/Wildfly - 安全高效的日志过滤 - 多个处理程序记录到同一个文件【英文标题】:JBoss/Wildfly - Safe and efficient log filtering - Multiple handlers logging to the same file 【发布时间】:2020-01-20 19:58:27 【问题描述】:

应用过滤器表达式来记录总是出现在同一类别的消息的最安全和最有效的方法是什么?

我在一个容器中有 100 多个应用程序记录到同一个文件。我要处理的消息非常具体。将单个复杂的过滤器规范应用于每条消息似乎有很多开销,所以我决定为每个类别创建单独的记录器,其中包含我想要过滤的消息。每个记录器都有自己的处理程序和自己的过滤器规范。这样我只会将过滤逻辑应用于尽可能少的日志消息。

这里是standalone.xml中的记录器:

<root-logger>
    <level name="INFO"/>
    <handlers>
        <handler name="CONSOLE"/>
        <handler name="FILE"/>
    </handlers>
</root-logger>
<logger category="org.hibernate.engine.jdbc.spi.SqlExceptionHelper" use-parent-handlers="false">
    <level name="INFO"/>
    <handlers>
        <handler name="CONSOLE"/>
        <handler name="SQL_EXECUTION_HELPER_FILE"/>
    </handlers>
</logger>
<logger category="org.jboss.as.ejb3.invocation" use-parent-handlers="false">
    <level name="INFO"/>
    <handlers>
        <handler name="CONSOLE"/>
        <handler name="EJB3_INVOCATION_FILE"/>
    </handlers>
</logger>

这里是文件处理程序:

<periodic-rotating-file-handler name="FILE" autoflush="true">
    <formatter>
        <named-formatter name="PATTERN"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="server.log"/>
    <suffix value=".yyyy-MM-dd"/>
    <append value="true"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="SQL_EXECUTION_HELPER_FILE">
    <filter-spec value="any(  not(match(&quot;ERROR: duplicate key value violates unique constraint \&quot;option_option_expiry_id_option_type_id_strike_price_key\&quot;&quot;)),  all(  match(&quot;ERROR: duplicate key value violates unique constraint \&quot;option_option_expiry_id_option_type_id_strike_price_key\&quot;&quot;),  levelChange(WARN)  )  )"/>
    <formatter>
        <named-formatter name="PATTERN"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="server.log"/>
    <suffix value=".yyyy-MM-dd"/>
    <append value="true"/>
</periodic-rotating-file-handler>
<periodic-rotating-file-handler name="EJB3_INVOCATION_FILE">
    <filter-spec value="any(  not(match(&quot;EJB Invocation failed on component OptionProductManagementDataService for method public void com.nodalexchange.optionproductmanagement.OptionProductManagementDataService.insert&quot;)),  all(  match(&quot;EJB Invocation failed on component OptionProductManagementDataService for method public void com.nodalexchange.optionproductmanagement.OptionProductManagementDataService.insert&quot;),  levelChange(WARN)  )  )"/>
    <formatter>
        <named-formatter name="PATTERN"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="server.log"/>
    <suffix value=".yyyy-MM-dd"/>
    <append value="true"/>
</periodic-rotating-file-handler>

我不明白这些文件处理程序是如何在后台工作的,例如它们是共享文件描述符还是各自打开自己的文件描述符。这对我来说一直很好,除了有一次我只从单个处理程序获取消息而没有其他事件,这让我相信使用多个处理程序是不安全的,但我无法重现这一点。

    是否存在由于许多处理程序写入同一个文件而导致文件损坏的风险? 有没有更好的办法?

【问题讨论】:

【参考方案1】:

我绝对建议不要使用多个处理程序写入同一个文件。这肯定有问题。

由于您要定义特定的记录器,因此您应该将过滤器放在这些记录器上。

【讨论】:

哇,这是一个简单的解决方案。出于某种原因,我认为 filter-spec 只允许在处理程序下使用,而不是记录器。我以为我用根记录器尝试了过滤器,但它不起作用(这是预期的吗?)但它适用于我的自定义记录器。谢谢。 最初并且仍在 WildFly 中,记录器不继承过滤器。因此,如果您需要过滤名称为 org.jboss.example.SomeClass 的日志,您需要创建该特定记录器并将过滤器添加到该记录器。现在可以在日志管理器中继承过滤器,但该行为尚未在 WildFly 中公开。

以上是关于JBoss/Wildfly - 安全高效的日志过滤 - 多个处理程序记录到同一个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JBoss Wildfly 9 中关闭 Hibernate 调试日志记录?

AWS Linux 实例:访问 JBoss Wildfly 控制台

在 JBoss/WildFly 中注入 EntityManager

JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件

JBoss(Wildfly 10)不能远程访问

JBoss(Wildfly 10)不能远程访问