在4.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 楼
zzx0421
2011-01-21
建议你使用slf4j+logback