`
pute
  • 浏览: 30709 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在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组合,成功。

6、最后修改原有系统中使用jdk自带的logger的代码。

1
1
分享到:
评论
1 楼 zzx0421 2011-01-21  
建议你使用slf4j+logback

相关推荐

    hplus4.1最新版最新版

    在新版本中,我们看到开发者们对用户体验、性能优化、安全性以及兼容性等多个方面进行了深度改进。这一系列升级不仅提升了系统的整体性能,也预示着HPlus平台在技术领域的持续领先。 1. 用户体验优化:HPlus 4.1在...

    swift-演示Swift4.1中引入的新功能的Xcodeplayground

    在这个“swift-演示Swift4.1中引入的新功能的Xcodeplayground”中,我们可以深入理解这些更新如何提升编程效率和代码质量。下面我们将详细探讨Swift 4.1中的关键变化。 首先,Swift 4.1改进了类型推断。类型推断是...

    ExtJs4.1中文API离线BS版

    在4.1版本中,ExtJS团队对框架进行了大量性能优化,包括减少DOM操作、提升渲染速度以及优化内存管理,使得大型应用也能保持流畅运行。 10. **国际化支持**: 由于提供了中文API,表明ExtJS 4.1对多语言的支持更加...

    INSPINIA后台框架中文版 Hplus 4.1最新版

    2. **新组件和插件**:引入了更多新的UI组件和JavaScript插件,如时间轴、日历控件、富文本编辑器等,丰富了开发工具库。 3. **安全性增强**:加强了对XSS、CSRF等常见安全威胁的防护,确保后台系统的安全性。 4. **...

    Lucene 4.1 最新版本 源码

    此外,Lucene 4.1引入了AnalyzingSuggester和FuzzySuggester两个新特性,这为用户提供了更强大的自动补全和模糊搜索功能。AnalyzingSuggester允许在建议时进行分词分析,这对于处理多语言或者需要根据用户输入的...

    solr4.1+IK中文分词

    在4.1版本中,Solr引入了全新的Cloud模式,支持SolrCloud,这是一项分布式管理服务,允许Solr实例在Hadoop的ZooKeeper协调下进行集群部署,实现数据的自动复制和负载均衡,提高了系统的可用性和可扩展性。此外,4.1...

    最新版(V4.1)SD卡规范中文

    在2016年发布的SD卡规范V4.1中,新增了UHS-II接口,以及功率消耗和功率限制方面的规定。 ### SD卡的关键功能 - **切换功能命令(CMD6)**:这是SD4.0新增的功能,允许设备在不同的工作模式之间切换。 - **高速模式...

    我的gradle-4.1-all.zip

    在您提供的信息中,"gradle-4.1-all.zip" 是Gradle 4.1版本的完整发行包,包含了运行和构建项目所需的所有组件。 Gradle 4.1 版本发布于2017年,是一个重要的里程碑,因为它引入了许多改进和新特性。以下是一些关键...

    Lucene 4.1 最新版本 修复诸多BUG

    首先,让我们关注一下Lucene 4.1中的错误修复。在之前的版本中,用户可能会遇到一些稳定性问题,包括查询性能下降、内存泄漏以及索引异常等。在4.1版本中,开发者对这些问题进行了全面排查,修复了数十个已知的BUG,...

    junit4.1.zip

    JUnit 4.1引入了测试监听器的概念,通过实现`TestListener`接口或使用`@Rule`注解,可以定制测试的执行过程,如记录测试日志、捕获系统快照等。 8. **延迟与假设** `Assume`类提供了一组方法,允许在测试开始前...

    易语言exdui4.1 Ex_DirectUI4.1 测试版

    1. **性能优化**:在4.1版本中,可能对库进行了代码优化,提高了界面渲染速度,降低了CPU和内存占用,提升了程序运行效率。 2. **新控件与布局**:可能新增了更多的自定义控件和布局管理器,使得开发者可以创建更...

    最新网上商城Extjs4.1+Spring3.2+hibernate4.1+MySql5(视频+源码).rar

    标题中的"最新网上商城Extjs4.1+Spring3.2+hibernate4.1+MySql5(视频+源码).rar"是一个综合性的IT资源,它涵盖了前端开发框架ExtJS 4.1,后端MVC框架Spring 3.2,持久层框架Hibernate 4.1,以及数据库管理系统...

    Spring4.1官方jar包完整版

    在这个"Spring4.1官方jar包完整版"中,我们可以找到所有必要的组件,包括核心容器、数据访问/集成、Web、AOP(面向切面编程)、工具和支持多种其他技术的模块。 1. **核心容器**:Spring的核心组件包括Bean工厂和...

    spring4.1 doc + jar包

    10. **测试框架**: Spring Test和Spring Boot Test在4.1中也有所改进,提供了更多的测试工具和API,如`@WebMvcTest`注解用于隔离测试MVC层,以及对模拟对象的更好支持。 这些只是Spring 4.1版本中部分关键知识点,...

    H+后台管理系统UI框架(最新版本)

    H+ 4.1新版本作为该框架的最新迭代,引入了多项优化和改进,以提升用户体验和开发效率。此版本包含了所有必要的模块,如导航菜单、表单、数据展示、图表报表等,确保能满足大多数后台管理系统的需求。此外,它还提供...

    ExtJs4.1中文API离线版

    ExtJS 4.1中文API离线版是一个全面的文档集合,专为JavaScript开发者设计,特别是那些使用ExtJS 4.1框架构建富客户端应用程序的人。这个离线版包含了所有必要的资源,允许开发者在没有互联网连接的情况下查阅和学习...

    MYSQL v4.1(中文)

    在这个版本中,MySQL引入了若干新特性和优化,使得它更适合于大型企业和开发者的使用。 1. **字符集支持**:MySQL v4.1显著提升了对多语言字符集的支持,特别是中文环境。这包括Unicode(如UTF-8)的全面支持,允许...

    springboot+mybatis+dubbo 分布式框架搭建及日志配置

    如果需要在分布式环境中统一管理日志,可以考虑引入ELK(Elasticsearch、Logstash、Kibana)或者Graylog这样的日志分析工具。 在项目中,`springboot-module`可能表示一个SpringBoot模块,通常每个模块代表一个...

    java spring4.1.x源码

    在4.1.x版本中,Spring MVC引入了路径变量的支持,增强了RESTful服务的实现,并且对模板引擎如FreeMarker和Thymeleaf的集成进行了优化。 Spring的数据访问层提供了对JDBC、ORM(Object-Relational Mapping)框架如...

Global site tag (gtag.js) - Google Analytics