JDBC アペンダーを拡張してログ データをデータベースに保存することにより、カスタム アペンダーを追加しようとしています。しかし、春に注入されたデータソースからデータベース接続をオーバーライドする必要があります。log4j コンテキストが最初に読み込まれ、Spring コンテキストがまだ初期化されていないため、機能しません。Spring が注入された DataSource に対して Null Pointer Exception が発生しています。
春は全くの初心者です。可能であれば、例を教えてください。
**This is how my Spring configuration looks like..**
<!-- DataSource --> <bean id="dataSource" class="*******" destroy-method="close" p:driverClassName="XXXXX" p:url="jdbc:oracle://****" p:username="root" p:password="password"/> <!-- Hibernate session factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource"> <property name="packagesToScan" value="com.beans"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop> </props> </property> </bean> <!-- Transaction Manager --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property>
私のlog4j構成
<appender name="SMTT-JDBC" class="com.XXX.XXX.CustomAppender"> <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler"> <appender-ref ref="FILE"/> </errorHandler> <param name="Threshold" value="INFO"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="INSERT INTO LOGS VALUES ('%x', current_timestamp ,'%C','%p','%m')" /> </layout> </appender>
これは私のカスタムアペンダーがどのように見えるかです:
public class CustomJDBCAppender extends org.apache.log4j.jdbc.JDBCAppender { protected java.sql.Connection getConnection() throws java.sql.SQLException { /* I need to get Connection From Spring configuration */ } protected void closeConnection() throws java.sql.SQLException { if (connection != null && !connection.isClosed()) connection.close(); } } `