ページの先頭行へ戻る
Interstage Business Application Server オープンJavaフレームワークユーザーズガイド
FUJITSU Software

10.2.6 ULogComposerクラスを用いてログを出力する

ULogComposerクラスを用いてログを出力する場合

(ULogComposerを用いてログ出力を行う場合)

import java.sql.Connection;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.fujitsu.interstage.apfw.logging.ApfwLogger;
import com.fujitsu.uji.ulog.ULogComposer;
   ・・・
public class MyApp {
    Log _log = null;
    ApfwLogger _al = null;
    ULogComposer _ulc = null;
    ・・・
    public void method1() {
        if( _log == null ) {
            // ログ定義ファイルに記述したULogComposer"ULog1"のログ出力クラスを取得します
            _log = LogFactory.getLog("ULog1");
            _al = (ApfwLogger)_log;
            // JNDI環境の設定
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY,
                    "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
            env.put(Context.PROVIDER_URL,"SYM://...");
            InitialContext ctx = null;
            DataSource ds = null;
            Connection connection = null;
            try {
                ctx = new InitialContext(env);
                ds = (DataSource)ctx.lookup("jdbc/...");
                connection = ds.getConnection();
                // ULogComposerを取得します
                _ulc = (ULogComposer)_al.getULogComposer(connection);
                if( _ulc != null ) {
                    // ログを出力します
                    _ulc.println(null,null,"someMethod start");
                } else {
                    // 高信頼ログ出力クラスのオブジェクトがnullのため、ログの出力ができません
                    ・・・
                }
                // 高信頼性ログの出力を終了する場合に、クローズをします
                if( _ulc != null ) {
                    _ulc.close();
                }
                // コネクションをクローズします
                if( connection != null ) {
                    connection.close();
                }
            } catch(Throwable t) {
                // 例外の処理をおこないます
                ・・・
            }
        }
    }
}

Spring Frameworkが提供するAOP機能を利用して、以下の処理を業務アプリケーションから分離する事が可能になります。

  1. JNDI環境の情報を設定する処理と高信頼性ログを出力するためのULogComposerを取得する処理をSpring Frameworkが提供するAOP機能を利用して業務アプリケーションの前処理として作成する

  2. 高信頼性ログ出力クラス、およびコネクションのクローズ処理をSpring Frameworkが提供するAOP機能を利用して業務アプリケーションの後処理として作成する

Spring FrameworkのAOP機能を利用して、高信頼性ログを利用するために必要な処理を業務アプリケーションの処理から分離する事で、業務アプリケーションはcommons-loggingのAPIで高信頼性ログを利用する事が可能になります。

ULogComposerクラスを用いてログを出力する場合(commons-logging APIとAOP機能)

(commons-logging API、Spring FrameworkのAOPを用いてログ出力を行う場合)

package test;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
   ・・・
public class MyApp {
    // AOP機能のクラスからアクセス可能にします
    protected Log _log = null;
    public MyApp() {
        if( _log == null ) {
        // ログ定義ファイルに記述したULogComposer"ULog1"のログ出力クラスを取得します
        _log = LogFactory.getLog("ULog1");
        }
    }
    public void method1() {
        // ログを出力します
        Try {
            _log.info("someMethod start");
        } catch(Throwable t) {
            // 例外の処理をおこないます
            ・・・
        ]
    }
}

(AOP機能の利用)

package test;
import java.sql.Connection;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import com.fujitsu.interstage.apfw.logging.ApfwLogger;
import com.fujitsu.uji.ulog.ULogComposer;
   ・・・
public class MyAppAop {
    ApfwLogger _al = null;
    ULogComposer _ulc = null;
    ・・・
    // サーバアプリケーションのmethod1が実行される前に動作するメソッド
    public void execMethod1Before() {
        _al = (ApfwLogger)MyApp._log;
        // JNDI環境の設定
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory");
        env.put(Context.PROVIDER_URL,"SYM://...");
        InitialContext ctx = null;
        DataSource ds = null;
        Connection connection = null;
        try {
            ctx = new InitialContext(env);
            ds = (DataSource)ctx.lookup("jdbc/...");
            connection = ds.getConnection();
            // ULogComposerを取得します
            _ulc = (ULogComposer)_al.getULogComposer(connection);
        } catch(Throwable t) {
            // 例外の処理をおこないます
            ・・・
        }
    }
    // サーバアプリケーションのmethod1が実行された後に動作するメソッド
    public void execMethod1After() {
        try {
            // 高信頼性ログの出力を終了する場合に、クローズをします
            if( _ulc != null ) {
                _ulc.close();
            }
            // コネクションをクローズします
            if( connection != null ) {
                connection.close();
            }
        } catch(Throwable t) {
            // 例外の処理をおこないます
            ・・・
        }
    }

注意

Spring FrameworkのBean定義ファイルのインスタンス生成方式にはsingletonを指定しないでください

(アプリケーションとAOP機能)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  <aop:config>
    <aop:aspect id="ct001_asp" ref="MyAppAop">
      <aop:pointcut id="pointcut" expression="execution(* method1())"/>
      <aop:before pointcut-ref="pointcut" method="execMethod1Before"/>
      <aop:after pointcut-ref="pointcut" method="execMethod1After"/>
    </aop:aspect>
  </aop:config>
  <bean id="MyAppAop" class="test.MyAppAop"/>
  <bean id="MyApp" class="test.MyApp"/>
</beans>