问题
I'm implementing some new features of Java 8 on my desktop app and Hibernate 3.6 seems to doesn't like it.
I added to an Interface a "default method", since then Hibernate it throwing:
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
for EACH class that implement the interface multiplied for EACH default method in the interface.
As this log is a Level.WARN
, it is generating biiiiiiiiiig log file on the users every time they open the application.
I tried to make some logger filters but is not working:
<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"/> -->
What am I doing wrong? Also if I uncomment DenyAllFilter
no log appears anymore.
回答1:
Using log4j 1.2 I am able to filter out specific exceptions, using an ExpressionFilter in the Appender.
<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>
See http://blog.trifork.com/2011/08/23/filtering-specific-exceptions-when-using-log4j/
回答2:
I have found the solution - RegexFilter.
Here is the related Log4j 2.x configuration, that allows me to exclude specific messages both from log file and console appenders.
<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>
来源:https://stackoverflow.com/questions/26166281/how-to-filter-a-specific-exception-from-log4j