Log4j的使用

Posted on 2007-12-08 11:27 探佚 阅读(190) 评论(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,1PRIMARY 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);
    }
}

Copyright © 探佚