Log 4 jデータベースへの書き込みの詳細

13405 ワード

log 4 jは優れたオープンソースログ記録プロジェクトであり、出力されたログのフォーマットをカスタマイズするだけでなく、画面、テキストファイル、データベース、socketで出力するなど、ログ出力の目的地を自分で定義することができます.このセクションでは、ログ情報をデータベースに入力する方法について説明します(MSSQLを例に詳細を説明します).log 4 jでログをデータベースに書き込むのは主にlog 4 jパッケージの下のJDBCappenderクラスで、ログ情報を非同期でデータに書き込む機能を提供して、私たちは直接このクラスを使って私たちのログ情報をデータベースに書き込むことができます;JDBCappenderクラスを拡張することもできます.JDBCappenderクラスをベースクラスとします.次に、log 4 jがログ情報をデータベースに書き込む方法を一例で説明する.デルのニーズ:ソフトウェア開発の過程で、デバッグ情報、操作情報などを記録して、ユーザーID、ユーザー名、操作クラス、パス、方法、操作時間、ログ情報を含む後続の監査を行う必要があります.設計思想:JDBCAppenderクラスを採用して直接ログ情報をデータベースに挿入し、すべてプロファイルでこのような構成を行うだけでよい.ユーザー情報を取得するにはフィルタで実現する必要がある.(ユーザの情報が不要であればフィルタを設計する必要はないが、実際にはこれらのユーザ情報がほとんど必要であり、特にwebアプリケーション開発において)ログ情報にユーザ情報を取得すると、フィルタのrequestやsessionオブジェクトを介してsessionからユーザ情報を取得してlog 4 jにどのように伝達するか、log 4 jは、アプリケーションのコンテキスト情報(context infomation)を格納するために使用されるMDC(MDCはlog 4 j種の非常に有用なクラスであり、logでこれらのコンテキスト情報を容易に使用することができる.MDC内部ではmapのようなメカニズムを用いて情報を格納し,コンテキスト情報もスレッドごとに独立して格納され,異なるのは情報がそれらのkey値で「map」に格納されることである.対応する方法、
MDC.put(key, value); MDC.remove(key); MDC.get(key);
PatternLayoutを構成するとき:%x{key}を使用して対応するvalueを出力します).MDCがあれば、フィルタでユーザ情報を取得してからMDCを使用することができます.Put(「key」)メソッドで、logはsql文を実行するときに%x{key}で対応するvalueを出力します.
実装手順:1、あなたのプロジェクトにlog 4 jとcommons-loggingの2つのjarファイルがあることを確認します.2、ログ情報を挿入するテーブル構造を設定する
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WDZLOG]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[WDZLOG]

GO



CREATE TABLE [dbo].[WDZLOG] (

    [WDZLOGID] [int] IDENTITY (1, 1) NOT NULL ,

    [LogName] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//  ID

    [UserName] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//    

    [Class] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//  

    [Mothod] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL //,   

    [CreateTime] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,//    

    [LogLevel] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,//    

    [MSG] [varchar] (555) COLLATE Chinese_PRC_CI_AS NULL //    

) ON [PRIMARY]

GO

3、プロファイル(私たちのプロジェクトから抜粋)は後でこのプロファイルについて詳しく説明し、log 4 jの核心部分でもある.
log4j.properties

log4j.rootLogger=INFO,stdout

            

log4j.logger.org.springframework.web.servlet=INFO,db



log4j.logger.org.springframework.beans.factory.xml=INFO

log4j.logger.com.neam.stum.user=INFO,db



log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [%c] - - <%m>%n



log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.log

log4j.appender.logfile.DatePattern=.yyyy-MM-dd

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n



########################



# JDBC Appender



#######################





#log4j.logger.business=INFO,db

#log4j.appender.db=com.neam.commons.MyJDBCAppender

log4j.appender.db=JDBCExtAppender



log4j.appender.db.BufferSize=10



log4j.appender.db.sqlname=log



log4j.appender.db.driver=net.sourceforge.jtds.jdbc.Driver

                      

log4j.appender.db.URL=jdbc:jtds:SqlServer://localhost:1433;DatabaseName=pubs



log4j.appender.db.user=sa



log4j.appender.db.password=sa



log4j.appender.db.sql=insert into WDZLOG (LogName,UserName,Class,Mothod,createTime,LogLevel,MSG) values ('%X{userId}','%X{userName}','%C','%M','%d{yyyy-MM-dd HH:mm:ss}','%p','%m')



log4j.appender.db.layout=org.apache.log4j.PatternLayout

4、作成フィルタ(ResFilter.java)
import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;



import org.apache.log4j.Logger;

import org.apache.log4j.MDC;



import com.neam.domain.User;



public class ResFilter implements Filter{



     

    private final static double DEFAULT_USERID= Math.random()*100000.0;  



    public void destroy() {

    }



    public void doFilter(ServletRequest request, ServletResponse response,

           FilterChain chain) throws IOException, ServletException {

       HttpServletRequest req=(HttpServletRequest)request;

        HttpSession session= req.getSession();

        if (session==null){

            MDC.put("userId",DEFAULT_USERID);  

        }

        else{

            User customer=(User)session.getAttribute("user");

            if (customer==null){

                MDC.put("userId",DEFAULT_USERID);

                MDC.put("userName",DEFAULT_USERID);

            }

            else

            {

                MDC.put("userId",customer.getName());

                MDC.put("userName",customer.getName());

            }

        }

        //logger.info("test for MDC.");



       chain.doFilter(request, response);

    }

    public void init(FilterConfig Config) throws ServletException {

//     this.filterConfig = Config;

//     String ccc = Config.getServletContext().getInitParameter("cherset");

//     this.targetEncoding = Config.getInitParameter("cherset");



    }

}

5、ログを書き込む必要がある場所に導入
private Log logger = LogFactory.getLog(this.getClass());



             

logger.info("");

logger.debug("");

logger.warn("");

logger.error("");

プロファイルの詳細:log 4 j.propertieslog4j.propertieslog4j.rootLogger=INFO,stdout
//ルートLoggerを配置し、その文法は:log 4 j.rootLogger=[level],appenderName 1,appenderName 2,...level:ログ記録の優先度で、OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALLまたは定義したレベルに分けられます.Log 4 jは4つのレベルのみを使用することを推奨し、優先度が高いものから低いものまでERROR、WARN、INFO、DEBUGである.ここで定義したレベルでは、アプリケーション内の対応するレベルのログ情報のスイッチを制御できます.たとえば、ここでINFOレベルが定義されている場合、アプリケーション内のすべてのDEBUGレベルのログ情報は印刷されません.appenderName:ログ情報がどこに出力されるかを指定します.複数の出力先を同時に指定できます.例えば、log 4 j.rootLogger=info,A 1,B 2,C 3は3つの出力場所を配置し、A 1をコンソールで出力するように設定することができます.B 2生産ログファイル;C 3ログ情報をデータベースに挿入する.この例では、すべてのログ情報をコンソールに印刷します. log4j.logger.org.springframework.web.servlet=INFO,db//springパッケージのクラスのログ情報をデータベースに書き込み、コンソールに印刷するように設定します.(log 4 j.rootLogger=INFO,stdoutで表す)dbは、ログ情報をデータベースに書き込むlog 4 jである.logger.org.springframework.beans.factory.xml=INFO//この例では、一部のパケットのログ情報をデータベースlog 4 jに書き込むことができるようにする.logger.com.neam.stum.user=INFO,db//自分のモジュールの下にあるログ情報を設定コンソールに印刷してデータベースに保存//以下はコンソールに配置するログ情報を印刷し、ここではlog 4 jを詳しく説明しない.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%p[%c]--<%m>%n//以下はログ情報をファイルに書き込む構成であり、ここではlog 4 jについて詳しく説明する.appender.logfile=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/exppower.loglog4j.appender.logfile.DatePattern=.yyyy-MM-ddlog4j.appender.logfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.logfile.layout.ConversionPattern=%d %p [%c] wang- <%m>%n######################### JDBC Appender########################log4j.appender.db=com.neam.commons.MyJDBCappender//次はログ情報をデータベースに挿入する構成で、log 4 j.appender.db=org.apache.log4j.jdbc.JDBCAppender//構成出力先はデータベース(ログをコンソールに出力する場合はlog 4 j.appender.stdout=org.apache.log 4 j.ConsoleAppender;ログをファイルに書き込み、log 4 j.appender.logfile=org.apache.log 4 j.DailyRollingFileAppenderのような構成は多くの場所で必要であり、関連資料を調べる必要がある)、もちろん自分でorgを拡張することもできますapache.log4j.jdbc.JDBCappenderというクラスは、ここで構成するだけでいいです.例えば、私自身が拡張したMyJDBCappenderを構成し、#log 4 jに構成します.appender.db=com.neam.commons.MyJDBCAppenderlog4j.appender.db.BufferSize=10//キャッシュサイズを設定すると、ログ情報が10個ある場合にログ4 jを一度データベースに挿入することを忘れてしまう.appender.db.driver=net.sourceforge.jtds.jdbc.Driver//データベースにログを挿入するドライバlog 4 jを設定.appender.db.URL=jdbc:jtds:SqlServer://localhost:1433;DatabaseName=pubslog4j.appender.db.user=salog4j.appender.db.password=salog4j.appender.db.sql=insert into WDZLOG(LogName,UserName,Class,Mothod,createTime,LogLevel,MSG)values('%X{userId}','%X{userName}','%C','%M','%d{yyyyy-M-ddH: mm:ss}','%p','%m')///////////////////////////////////////////////////////%X{userId}はMDCの中のkey値を取ります.フィルタではログ情報を挿入するフォーマットと内容を設定するので、%X{userId}はMDCの中のkey値を取ります.なぜなら、フィルタではMDCユーザIDとユーザ名をMDCに入れる、ここでは%X{userId}と%X{userName}を使用してユーザーのIDとユーザー名を取り出すことができます.'%C'はログ情報がそのクラスから来ていることを示します.%Mはログ情報がその方法から来ていることを示す.%d{yyyy-MM-dd HH:mm:ss}はログ情報が生成された時間を表し、{yyyy-MM-dd HH:mm:ss}は時間フォーマットを表し、直接%dと書くこともできます.pはログ情報のレベル(debug info warn error);mはあなたが書いたログ情報log 4 jを表す.appender.db.layout=org.apache.log4j.PatternLayout