0

将过滤器表达式应用到始终以相同类别出现的日志消息的最安全和最有效的方法是什么?

我在一个容器中有 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. 许多处理程序写入同一个文件是否存在文件损坏的风险?
  2. 有没有更好的办法?
4

1 回答 1

1

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

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

于 2019-09-21T00:14:53.327 回答