今天偶然发现 JFinal 的 Log 简单小巧。上代码。

JFinal 在初始化的时候有初始化 Log。

class Config {
    // ...

    static void configJFinal(JFinalConfig jfinalConfig) {
        jfinalConfig.configConstant(constants);                initLogFactory(); // 初始化 Log
        jfinalConfig.configRoute(routes);
        jfinalConfig.configPlugin(plugins);                    startPlugins();    // very important!!!
        jfinalConfig.configInterceptor(interceptors);
        jfinalConfig.configHandler(handlers);
    }

    private static void initLogFactory() {
        LogManager.me().init();
        log = Log.getLog(Config.class);
        JFinalFilter.initLog();
    }
}

接着 LogManager.me().init()。

public class LogManager {

    private static final LogManager me = new LogManager();

    private LogManager() {}

    public static LogManager me() {
        return me;
    }

    public void init() {
        Log.init();
    }

    public void setDefaultLogFactory(ILogFactory defaultLogFactory) {
        Log.setDefaultLogFactory(defaultLogFactory);
        com.jfinal.kit.LogKit.synchronizeLog();
    }
}

接着 Log.init(),在这里完成 defaultLogFactory 的实例化。当然也可以使用 Log.setDefaultFactory 重新设置 defaultLogFactory。

public abstract class Log {

    private static ILogFactory defaultLogFactory = null;

    static {
        init();
    }

    static void init() {
        if (defaultLogFactory == null) {
            try {
                Class.forName("org.apache.log4j.Logger");
                Class<?> log4jLogFactoryClass = Class.forName("com.jfinal.log.Log4jLogFactory");
                defaultLogFactory = (ILogFactory)log4jLogFactoryClass.newInstance();    // return new Log4jLogFactory();
            } catch (Exception e) {
                defaultLogFactory = new JdkLogFactory();
            }
        }
    }

    static void setDefaultLogFactory(ILogFactory defaultLogFactory) {
        if (defaultLogFactory == null) {
            throw new IllegalArgumentException("defaultLogFactory can not be null.");
        }
        Log.defaultLogFactory = defaultLogFactory;
    }

    public static Log getLog(Class<?> clazz) {
        return defaultLogFactory.getLog(clazz);
    }

    public static Log getLog(String name) {
        return defaultLogFactory.getLog(name);
    }

    public abstract void debug(String message);
    public abstract void debug(String message, Throwable t);
    public abstract void info(String message);
    public abstract void info(String message, Throwable t);
    public abstract void warn(String message);
    public abstract void warn(String message, Throwable t);
    public abstract void error(String message);
    public abstract void error(String message, Throwable t);
    public abstract void fatal(String message);
    public abstract void fatal(String message, Throwable t);
    public abstract boolean isDebugEnabled();
    public abstract boolean isInfoEnabled();
    public abstract boolean isWarnEnabled();
    public abstract boolean isErrorEnabled();
    public abstract boolean isFatalEnabled();
}

JFinal 默认使用 log4j 来管理日志,但是如果 JVM 在加载 org.apache.log4j.Logger 或 com.jfinal.log.Log4jLogFactory 的时候出现异常,就会使用 jdk 的日志系统来管理日志了。

JFinal 给了两个可以直接利用的 LogFactory:Log4jLogFactory 和 JdkLogFactory,它们分别可以通过 getLog(Class class) 得到 Log4jLog  和 JdkLog  实例。而 Log4jLog 和 JdkLog 分别封装了 org.apache.log4j.Logger 和 java.util.logging.Logger,并且利用它们进行日志操作。可以看出我们还可以使用别的 log 工具来管理日志,只需做到两点:1. 自定义工厂类继承 ILogFactory;2. 自定义 log 类继承 com.jfinal.log 并且对所用 log 工具进行封装。

当需要一个 Log 实例的时候,如第一段代码中 - Log.getLog(Class class),接着 - defaultLogFactory.getLog(Class class) new 出一个新的 Log 对象。

public class Log4jLogFactory implements ILogFactory {

    public Log getLog(Class<?> clazz) {
        return new Log4jLog(clazz);
    }

    public Log getLog(String name) {
        return new Log4jLog(name);
    }
}

题外话:这里用到了工厂模式。并且 JFinal 相当多的地方使用到了单例模式,例如第二段代码中的 LogManager。后面会专门总结一下设计模式。

JFinal - Log 日志的更多相关文章

  1. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  2. mysql general log日志

    注:应一直出现http://www.cnblogs.com/hwaggLee/p/6030765.html文章中的问题 故mysql general log日志.查看具体是什么命令导致的. 打开 ge ...

  3. 使用触发器实现记录oracle用户登录失败信息到alert.log日志文件

    前面我们说了用oracle自带的审计功能可以实现记录用户登录失败日志到数据表中(链接:http://www.54ok.cn/6778.html).今天我们来分享一下如何把用户登录失败信息记录到aler ...

  4. Junit测试打印详细的log日志,可以看到sql

    Junit测试打印详细的log日志,可以看到sql 在log4j.xml的日志配置文件中,把日志级别从info级别调整到debug级别: <?xml version="1.0" ...

  5. iOS及时log日志查看工具 (iConsole)

    github下载地址:https://github.com/nicklockwood/iConsole 偶然看到的一个iOS及时log日志查看工具,通过该工具,我们可以在任何想看日志的时候,通过手势呼 ...

  6. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)

    [root@ok 资料库]# svn log 简历 ------------------------------------------------------------------------ r ...

  7. 【个人使用.Net类库】(2)Log日志记录类

    开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序.(Web系统也是如此,只是对应的日志实现比这个要复杂 ...

  8. [转] C#实现自动化Log日志

    qing2005原文地址 C#实现自动化Log日志 在开发项目的时候,我们不免要使用Log记录日志,使用最多的是Log4Net和EntLib Log,在需要记录日志的代码处加入log.Write(日志 ...

  9. android的Log日志打印管理工具类(一)

    android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...

随机推荐

  1. C# EasyUI树形结构权限管理模块

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...

  2. LDAP 中 CN, OU, DC 的含义

    1. LDAP的存储规则 区分名(DN,Distinguished Name) 和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别 ...

  3. 利用Socket远程发送文件

    思想: 1.注意使用两个通道,一个普通对象通信通道,另一个纯净的文件字节流通道 2.利用通信通道发送文件请求,新建字节流通道,开始发送文件

  4. LeetCode: Ransom Note

    public class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] rans ...

  5. ArcGis for Android 工作与学习

    ArcGis安装 需求 windows7(32/64) Eclipse3.6以上版本 Android Sdk 2.2以上 Jdk 7 安装步骤 Eclipse安装 下载ArcGis插件 在Eclips ...

  6. SQL中exists和in比较

    in 和exists in是把外表和内表作hash 连接,而exists 是对外表作loop 循环,每次loop 循环再对内表进行查询. 一直以来认为exists 比in 效率高的说法是不准确的.如果 ...

  7. webservice通信调用天气预报接口实例

    转载:http://www.cnblogs.com/warrior4236/p/5668449.html 一:环境搭建 1:新建一个java project工程weatherInf 2:引入相应的ja ...

  8. linux命令:crontab命令(转)

    一.crond简介 二.crond服务 三.crontab命令详解 四.使用注意事项 linux系统是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作 ...

  9. Azure Web Site 之 利用Azure Web site 发布网站

    由于经常混迹于MSDN Azure论坛,少不了和一些外国朋友打交道.有的时候觉得还是有一些东西可以写出来与外国友人们分享下的, 所以就用一个开源项目建了一个英文blog项目. 在发布的时候,首选的就是 ...

  10. s3c2440液晶屏驱动 (内核自带) linux-4.1.24

    自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...