在4.1版中引入新的日志框架组合,用于系统运行测量

最近在关注学习cassandra,看到其日志框架采用的是slf4j+log4j组合。巧的是,自己最近也正在考虑在《威博文件管理系统》4.1版中,

也引入更好的slf4j+log4j日志框架,以便能为了更好地支持现场调试,运行效能测量、引入日志框架,用于系统运行监测。

这样就坚定了自己采用这个组合的信心。

 

具体是采用 slf4j-1.6.1+log4j-1.2.16组合。做法如下:

 

1、首先把slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar,log4j-1.2.16.jar三个包,放入web应用程序的lib库文件夹内。

 

2、编写log4j的日志配置文件,我采用xml文件来配置log4j的运行,放置在WEB-INF文件夹下。具体文件为log4j-config.xml,下为文件内容:

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

 

 

 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

 

    <!-- 设置文件输出输出方式:org.apache.log4j.RollingFileAppender -->

    <appender name="myFile"  class="org.apache.log4j.RollingFileAppender">

        <!-- 设置File参数:日志输出文件名 -->

        <param name="File" value="/webfile-logging/output.log" />

        <param name="MaxFileSize" value="2000KB"/>

        <param name="MaxBackupIndex" value="10" />

        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->

        <param name="Append" value="true" />

 

        <!-- 设置输出格式 -->

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS/} %-5p] [%t] %c{2/} - %m%n" />

        </layout>

    </appender>

 

 

    <!-- 设置标准监视器输出方式 -->

    <appender name="myStdout" class="org.apache.log4j.ConsoleAppender">

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss,SSS/} %-5p] [%t] %c{2/} - %m%n" />

        </layout>

 

    </appender>

 

    <!-- 根logger的设置-->

    <root>

        <priority value="debug" />

        <appender-ref ref="myStdout" />

        <appender-ref ref="myFile" />

    </root>

 

</log4j:configuration>

 

 

3、编写一个MyLoggerFactory.java包装类,使其slf4j能够使log4j-config.xml发挥作用,具体文件如下:

 

package cn.sh.webfile.logging;

 

import cn.sh.webfile.util.ClassPathUtil;

import org.apache.log4j.xml.DOMConfigurator;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

/**

 * 开始于 2011-01-16

 * 构建自己的log工厂类

 * 最后修改于 2010-11-16

 * @author 万继斌 www.putesoft.com

 * @version 1.2

 */

public class MyLoggerFactory {

 

    /**

     * log4j日志的位置文件

     */

    private final static String LOG4J_CONFIG_FILE_NAME = "log4j-config.xml";

 

    /**

     * 静态初始化代码,当类被加载时,自动执行

     */

    static {

        //获得配置文件位置

        String filePath = ClassPathUtil.getWebInfPath(MyLoggerFactory.class) + LOG4J_CONFIG_FILE_NAME;

        //加载log4j配置文件使之发生作用

        DOMConfigurator.configure(filePath);

    }

 

    /**

     * 获得log对象

     * @param name

     * @return

     */

    public static Logger getLogger(String name) {

        Logger tmpLog = LoggerFactory.getLogger(name);

        return tmpLog;

    }

 

    /**

     * 获得log对象

     * @param name

     * @return

     */

    public static Logger getLogger(Class clazz) {

        Logger tmpLog = LoggerFactory.getLogger(clazz);

        return tmpLog;

    }

}

 

4、其中使用到一个ClassPathUtil.java实用工具类,能够在系统中定位到实际的log4j-config.xml文件所在的路径位置,具体代码如下:

 

package cn.sh.webfile.util;

 

import cn.sh.webfile.exception.BusinessException;

import cn.sh.webfile.logging.MyLoggerFactory;

import java.io.UnsupportedEncodingException;

import java.net.URL;

import java.net.URLDecoder;

import org.slf4j.Logger;

 

/**

 * 开始于 2011-01-20

 * 获得类路径的实用程序

 * 最后修改于 2011-01-20

 * @author 万继斌

 * @version 1.0

 */

public class ClassPathUtil {

 

    private final static Logger myLog = MyLoggerFactory.getLogger(ClassPathUtil.class.getName());

 

    /**

     * 获得类的url

     * @param clazz

     * @return

     */

    private static URL getClassUrl(Class clazz) {

 

        //获得类文件名(短名),短名添加有.class

        String clazzFileName = clazz.getName().substring(clazz.getName().lastIndexOf(".") + 1) + ".class";

        //myLog.info("类短名==="+clazzFileName);

        //根据类文件名,获得类url路径

        URL clazzUrl = clazz.getResource(clazzFileName);

        //myLog.info("类url路径==="+clazzUrl);

 

        //防御性编程

        //如果无法获得类的路径字符串,则直接使用类全名,来构造url路径

        if (clazzUrl != null) {

            String name = clazz.getName().replaceAll("[.]", "/");

            //myLog.warn("--------"+name);

            clazzUrl = clazz.getResource("/" + name + ".class");

            //myLog.info("直接从全类名转换的来路径==="+clazzUrl);

        }

 

        //myLog.info(clazzUrl.toString());

 

        //返回url

        return clazzUrl;

    }

 

    /**

     * 获得类的路径

     * @param clazz

     * @return

     * @since:2011-01-20

     */

    public static String getClassPath(Class clazz) {

        try {

            String clazzFilePath = URLDecoder.decode(getClassUrl(clazz).getPath(), "utf-8");

            return clazzFilePath;

        } catch (UnsupportedEncodingException e) {

            myLog.warn("获得类的绝对路径异常,异常原因:" + e.getMessage());

            throw new BusinessException("获得类的绝对路径异常");

        }

    }

 

    /**

     * 获得类所在的包的路径

     * @param clazz

     * @return

     */

    public static String getPackagePath(Class clazz) {

        String clazzFilePath = getClassPath(clazz);

        return clazzFilePath.substring(0, clazzFilePath.lastIndexOf("/") + 1);

    }

 

    /**

     * 获得web应用程序中WEB-INF文件夹的路径

     * @param clazz

     * @return

     */

    public static String getWebInfPath(Class clazz) {

        String clazzFilePath = getClassPath(clazz);

        return clazzFilePath.substring(0, clazzFilePath.lastIndexOf("WEB-INF") + 8);

    }

 

    /**

     * 根据给定的类对象,获得该类在文件系统中所处的位置

     * 处理时,首先把转义的空格%20还原为原始空格

     * @param clazz

     * @return

     * @deprecated

     */

    public static String getPathOld(Class clazz) {

        String path = clazz.getResource("").getPath();

        //对路径中的空格进行转义还原

        path = path.replaceAll("%20", " ");

        //

        return path;

    }

    

    /**

     * 类测试

     * @param args

     */

    /*

    public static void main(String[] args) {

    myLog.warn(ClassPathUtil.getClassPath(ClassPathUtil.class));

    myLog.warn(getPackagePath(ClassPathUtil.class));

    myLog.warn(getWebInfPath(ClassPathUtil.class));

    }

     */

}

 

5、运行测试,slf4j+log4j组合,成功。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值