在4.1版中引入新的日志框架组合,用于系统运行测量
2011-01-21 21:53
441 查看
最近在关注学习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组合,成功。
也引入更好的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组合,成功。
相关文章推荐
- 在4.1版中引入新的日志框架组合,用于系统运行测量
- Android源码解析之应用程序框架层和系统运行库层日志系统
- Mybatis框架运行机制(增删改查,一对一,一对多,日志系统,单元测试,版本控制,缓存,动态Sql)
- 大地测量系统、框架,测绘基准、系统
- 如何将tomcat8的运行日志框架切换到log4j2
- 番外 03:Java日志框架引入 log4j2(Log For Java version2.x)
- iOS应用崩溃日志分析低内存闪退 因为低内存崩溃日志与普通崩溃日志略有不同,所以本教程特别分开说明一下。 iOS设备检测到低内存时,虚拟内存系统发出通知请求应用释放内存。这些通知发送到所有正在运行
- SSM框架引入logback日志框架
- 从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController
- 在VMWare Workstation上使用RedHat Linux安装和配置Hadoop群集环境05_HDFS文件系统和Mapreduce框架的启动和运行
- 请教,自己写的系统,运行是正常的,偶尔会爆这个问题,页面弹出Failed to read input窗口, 日志如下
- 日志框架和日志系统
- 用于准确测量运行时间
- Android应用程序框架层和系统运行库层日志系统源代码分析
- cocos Creator[框架封装之二] 日志系统 设计 与 实现
- 了解安卓架构(linux内核层、系统运行库层、应用框架层、应用层)
- 交叉编译用于android系统里的C/C++应用程序/库文件(其实就是运行于linux之上的应用程序)。
- linux系统实时打印tomcat运行日志
- 番外 03:Java日志框架引入 log4j2(Log For Java version2.x)
- 基于NopCommerce的开发框架——缓存、网站设置、系统日志、用户操作日志