JFinal - Log 日志
今天偶然发现 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 日志的更多相关文章
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- mysql general log日志
注:应一直出现http://www.cnblogs.com/hwaggLee/p/6030765.html文章中的问题 故mysql general log日志.查看具体是什么命令导致的. 打开 ge ...
- 使用触发器实现记录oracle用户登录失败信息到alert.log日志文件
前面我们说了用oracle自带的审计功能可以实现记录用户登录失败日志到数据表中(链接:http://www.54ok.cn/6778.html).今天我们来分享一下如何把用户登录失败信息记录到aler ...
- Junit测试打印详细的log日志,可以看到sql
Junit测试打印详细的log日志,可以看到sql 在log4j.xml的日志配置文件中,把日志级别从info级别调整到debug级别: <?xml version="1.0" ...
- iOS及时log日志查看工具 (iConsole)
github下载地址:https://github.com/nicklockwood/iConsole 偶然看到的一个iOS及时log日志查看工具,通过该工具,我们可以在任何想看日志的时候,通过手势呼 ...
- svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)
[root@ok 资料库]# svn log 简历 ------------------------------------------------------------------------ r ...
- 【个人使用.Net类库】(2)Log日志记录类
开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序.(Web系统也是如此,只是对应的日志实现比这个要复杂 ...
- [转] C#实现自动化Log日志
qing2005原文地址 C#实现自动化Log日志 在开发项目的时候,我们不免要使用Log记录日志,使用最多的是Log4Net和EntLib Log,在需要记录日志的代码处加入log.Write(日志 ...
- android的Log日志打印管理工具类(一)
android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...
随机推荐
- error in config file "/etc/rabbitmq/rabbitmq.config"
记录一次RabbitMQ配置文件配置错误 error信息: dill@ubuntu-vm:/usr/share/doc/rabbitmq-server$ sudo /usr/lib/rabbitmq/ ...
- 原生js拖拽
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- sprint3个人总结
转眼间,这个学期又过去了,真的是忙碌的一个学期,却是有点充实,特别是我们的软件工程这门课程,我们这次做的是公众号开发功能,说实话,当初对这个项目有兴趣是因为自己也在弄自己一个300多人的公众号,对于这 ...
- c语言第11次作业
#include<stdio.h> void sum(int *p,int n) { ]; ; int i; ;i<n;++i) { sum+=*p+a[i]; } } int ma ...
- sqlserver日志管理(转载)
sql 在使用中每次查询都会生成日志,但是如果你长久不去清理,可能整个硬都堆满哦,笔者就遇到这样的情况,直接网站后台都进不去了.下面我们一起来学习一下如何清理这个日志吧 SQL2005清空删除 ...
- LINQ使用细节之.AsEnumerable()和.ToList()的区别
先看看下面的代码,用了 .AsEnumerable(): 1 var query = (from a in db.Table2 where a = SomeCondition3 select a.So ...
- DLL注入
最近的项目涉及了软件破解方面的知识,记录一下. 将dll注入另一个进程. // Inject.cpp : Defines the exported functions for the DLL appl ...
- owin建控制台应用程序步骤
1. Install-Package Microsoft.AspNet.WebApi.OwinSelfHost 2. 建立OWIN Startup类 public void Configurati ...
- Windows7下的免费虚拟机(微软官方虚拟机)
前言: 不是说windows7自带的虚拟机最好用,而是他是正式版的,免费的,只要你是windows7用户,就可以免费使用: 其实我最推荐的还是Vmware: 微软为什么提供免费的虚拟机呢? 因为vis ...
- php常用函数file
fopen:(创建并)打开一个文件或url地址. 模式 说明 r 只读,将将文件指针指向文件开始位置 r+ 读写,将文件指针指向文件开始位置 w 只写,将文件指针指向文件开始位置将将文件内容清空,如果 ...