如何从Log4j中过滤特定异常?

问题描述 投票:0回答:3

我正在我的桌面应用程序上实现 Java 8 的一些新功能,而 Hibernate 3.6 似乎不喜欢它。

我向接口添加了一个“默认方法”,从那时起 Hibernate 它抛出:

2014-10-02 14:01:25,538 WARN entity.PojoEntityTuplizer  - could not create proxy factory for:modelo.ChequeTercero
org.hibernate.HibernateException: Javassist Enhancement failed: modelo.ChequeTercero
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.getProxyFactory(JavassistLazyInitializer.java:169)
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.postInstantiate(JavassistProxyFactory.java:65)
Caused by: java.lang.VerifyError: (class: modelo/ChequeTercero_$$_javassist_45, method: _d21getNumeroValor signature: ()Ljava/lang/String;) Illegal use of nonvirtual function call

对于实现接口的每个类,乘以接口中的每个默认方法。

由于此日志是

Level.WARN
,因此每次用户打开应用程序时,它都会生成 biiiiiiiiiig 日志文件。

我尝试制作一些记录器过滤器,但不起作用:

<filter class="org.hibernate.proxy.pojo.BasicLazyInitializer">
<param name="LevelMin" value="FATAL" />
<param name="LevelMax" value="FATAL" />
    </filter>
<filter class="org.apache.log4j.filter.ExpressionFilter">
        <param name="expression" value="EXCEPTION ~= org.hibernate.proxy.pojo.BasicLazyInitializer"/>
        <param name="acceptOnMatch" value="false"/>
    </filter>
    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="StringToMatch" value="org.hibernate.HibernateException: Javassist Enhancement failed"/>
        <param name="AcceptOnMatch" value="false" />
    </filter>
    <!--<filter class="org.apache.log4j.varia.DenyAllFilter"/> -->

我做错了什么?另外,如果我取消注释

DenyAllFilter
,则不会再出现日志。

java hibernate filter log4j java-8
3个回答
10
投票

我找到了解决方案 -

RegexFilter

这是相关的 Log4j 2.x 配置,它允许我从 log fileconsole 附加程序中排除特定消息。

<Appenders>
    <Console name="console" target="System.out">
        <RegexFilter regex=".*(Javassist Enhancement failed|could not create proxy factory for).*" onMatch="DENY" onMismatch="ACCEPT"/>
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-2p %c{1.} %x - %m%n"/> 
    </Console>
    <File name="logfile" filename="./app.log" append="true">
        <!--Evita cargar en el log el error que tira hibernate por Java 8 (default method en Interfaces)-->
        <RegexFilter regex=".*(Javassist Enhancement failed|could not create proxy factory for).*" onMatch="DENY" onMismatch="ACCEPT"/>
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{-1} %X{userName} - %m%n"/> 
    </File>
</Appenders>

9
投票

使用 log4j 1.2,我可以在 Appender 中使用 ExpressionFilter 过滤掉特定的异常。

<appender name="LOGFILE" class="com.me.RollingFileAppender">
    <param name="File" value="..." />
    ...
    <layout .../>
    <!-- Exclude expected exceptions -->
    <filter class="org.apache.log4j.filter.ExpressionFilter">
        <param name="Expression" value="EXCEPTION ~= 'String found in the exception message'"/>
        <param name="AcceptOnMatch" value="false"/>
    </filter>
</appender>

参见 http://blog.trifork.com/2011/08/23/filtering-specific-exceptions-when-using-log4j/


0
投票

接受的答案是使用 RegexFilter,它是在 Log4j2 中管理日志过滤的优雅解决方案。

在实现过程中,遇到了需要排除记录特定

Hibernate
错误的场景。正如在我们的项目中一样,我们正在使用
YAML
配置,因此发现在这里分享该方法很有价值,特别是因为互联网上大多数可用的示例都倾向于关注
XML
配置。

下面是如何在

RegexFilter
YAML
配置中使用
Log4j2
的示例:

  Loggers:
    logger:
      - name: org.hibernate.orm.jdbc.batch
        level: ERROR
        Filters:
          # Ignore log events with 'org.hibernate.StaleStateException' exception
          - RegexFilter:
              regex: ".*org.hibernate.StaleStateException.*"
              onMatch: DENY
              onMismatch: NEUTRAL

在上面的例子中,目的是过滤掉与

org.hibernate.StaleStateException
相关的日志,防止它们被记录。这是在允许捕获来自
error
记录器的所有其他
org.hibernate.orm.jdbc.batch
日志的同时实现的。

请随意根据您的喜好进一步定制。

© www.soinside.com 2019 - 2024. All rights reserved.