Posted on 2007-12-08 11:27 
探佚 阅读(193) 
评论(0)  编辑  收藏  所属分类: 
Java EE技术  
			 
			
		 
		前一段时间看了Log4j的使用,其难点在配置文件的配置,
配置方式可以通过.properties文件和xml文件实现。下面是在xml文件中的配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "dtd/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <!-- 控制台输出日志信息 -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout"/>
    </appender>
    <!-- 日志信息写到.log文件中 -->
    <appender name="file" class="org.apache.log4j.FileAppender">
        <param name="File" value="E:/log/DBServlet_xml.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%x] [%c]-[%-5p] %m%n%n"/>
        </layout>
    </appender>
    
    <!-- 日志信息写到HTML文件中 -->
    <appender name="htmlFile" class="org.apache.log4j.RollingFileAppender">
        <!-- 指定file appender输出日志文件的名字和保存路径 -->
        <param name="File" value="E:/log/DBServlet_rolling.html"/>
        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
        <param name="Append" value="false"/>
        <!-- 设置最大文件尺寸为1MB,当日志文件大小达到1MB时,开始备份到备份文件中 -->
        <param name="MaxFileSize" value="1MB"/>
        <!-- 设置备份文件的最大数目为2个 -->
        <param name="MaxBackupIndex" value="2"/>
        <layout class="org.apache.log4j.HTMLLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%x] [%c]-[%-5p] %m%n%n"/>
            <!-- 指定输出日志信息的语句所在的文件名和行号是否输出,默认为false -->
            <param name="LocationInfo" value="true"/>
        </layout>
    </appender>
    
    <!-- 日志信息写到数据库中 -->
    <appender name="db" class="org.apache.log4j.jdbc.JDBCAppender">
        <param name="URL" value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" />
        <param name="user" value="sa" />
        <param name="driver" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
        <param name="password" value="" />
        <param name="sql" value="INSERT INTO T_LOGS VALUES('%d','%c','%p','%m')" />
    </appender>
    
    <!-- 记录器 -->
    <logger name="pubsLogger" additivity="false">
        <appender-ref ref="file"/>    <!-- 日志信息写到.log文件 -->
        <appender-ref ref="htmlFile"/> <!-- 日志信息写到HTML文件 -->
        <appender-ref ref="db"/> <!-- 日志信息写到数据库中 -->
    </logger>
    
    <!-- 根记录器 -->
    <root>
        <level value="ERROR"/> <!-- 日志级别 -->
        <appender-ref ref="console"/>
    </root>
</log4j:configuration>
下面是日志文件插入数据库对于的表
IF exists(SELECT * FROM sysobjects WHERE name = 'T_LOGS')
    DROP TABLE T_LOGS
GO
CREATE TABLE T_LOGS
(
    log_id        int identity(1,1) PRIMARY KEY,
    log_date     varchar(20)    NOT NULL,
    log_logger      varchar(20)    NOT NULL,
    log_level       varchar(5)    NOT NULL,
    log_message    text        NOT NULL
)
INSERT INTO T_LOGS VALUES('','','','')
SELECT * FROM T_LOGS
在Servlet中使用Log4j实现日志记录:
public class DBServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    static Logger logger=Logger.getRootLogger();
    static Logger pubsLogger=Logger.getLogger("pubsLogger");
        
    public void init() throws ServletException {
        String prefix =  getServletContext().getRealPath("/");
        String file = getInitParameter("log4j-init-file");
        
        if(file != null)
        {
            // 读取log4j的配置文件
            // PropertyConfigurator.configure(prefix + file);
            // PropertyConfigurator.configureAndWatch(prefix + file , 65); 
            //创建了一个线程周期性的监测配置文件,默认的时间间隔为60秒
            
            // 读取XML格式的配置文件
            DOMConfigurator.configureAndWatch(prefix + file);
        }
    }    
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
        String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
        Connection conn=null;
        Statement stmt=null;
        try
        {
            Class.forName(driverName);
            conn=DriverManager.getConnection(url,"sa","");
            stmt=conn.createStatement();
            stmt.executeUpdate("delete from jobs where job_id=15");
            
            System.out.println("数据库操作成功!");
        }
        catch(Exception e)
        {
            NDC.push(request.getRemoteHost());
            
            logger.warn("数据库操作失败! "+ e);
            logger.error("数据库操作失败! "+ e);
            
            pubsLogger.warn("数据库操作失败! "+ e);
            pubsLogger.error("数据库操作失败! "+ e);
            
            NDC.pop();
            NDC.remove();
            
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"数据库操作出现问题");
        }
        finally
        {
            this.releaseDB(stmt, conn);
        }
    
    }
    private void releaseDB(Statement stmt,Connection conn){
        if(stmt!=null)
        {
            try
            {
                stmt.close();
            }
            catch(SQLException se)
            {
                pubsLogger.error("关闭Statement失败!",se);
            }
            stmt=null;
        }
        if(conn!=null)
        {
            try
            {
                conn.close();
            }
            catch(SQLException se)
            {
                pubsLogger.error("关闭数据库连接失败!",se);
            }
            conn=null;
        }
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }
}