浅析log4j(日常使用)
下面从三个方面来简单介绍log4j的使用。
第一部分介绍log4j的背景
第二部分介绍Log4j的配置文件log4j.xml
第三部分介绍log4j在代码中的使用
一、背景
Log4j 是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
附上demo:
二、log4j.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE log4j:configuration SYSTEM "dtd/log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="stdout" value="%d{yyyy-MM-dd HH:mm:ss} %5p %c:%m%n" /><!-- 5代表五个空格,而且一定要在%后 --></layout></appender><appender name="testLog" value="test.log" /><!-- 项目根目录 --><layout value="%d{yyyy-MM-dd HH:mm:ss} %5p %l:%m%n" /></layout></appender><!-- additivity它是 Logger是否继承 rootLogger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。这里的父logger都是root,即控制台输出 --><logger name="test_log" additivity="true"><!-- 别名级别 --><level value="info" /><!-- 输出级别(开关) --><appender-ref ref="testLog" /><!-- 引用输出配置 --></logger><logger name="start.StartServer" additivity="false"><!-- 类级别 --><level value="info" /><appender-ref ref="testLog" /></logger><logger name="start" additivity="false"><!-- 包级别 --><level value="info" /><appender-ref ref="testLog" /></logger><root><level value="info" /><appender-ref ref="stdout" /></root></log4j:configuration>
),下面详细介绍:DOMConfigurator.configure(StartServer.class.getClassLoader().getResource("log4j.xml"));<logger name="test_log" additivity="true"><!-- 别名级别 -->
// 获取logLogFactory.getLog("test_log").info("hello world");// 别名级别<logger name="start.StartServer" additivity="false"><!-- 类级别 -->
LogFactory.getLog(StartServer.class).info("second world");// 类级别<logger name="start" additivity="false"><!-- 包级别 -->
package start;import org.apache.commons.logging.LogFactory;/** * @author minghua.l * @date 2012-4-9 下午07:14:30 */public class ServerTo {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubLogFactory.getLog(ServerTo.class).info("last world");// 包级别}}package util;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;/** * @author minghua.l * @date 2012-3-31 下午04:44:31 */public class LogUtils {private static Log testLog = LogFactory.getLog("test_log");public static Log getTestLog() {return testLog;}public static void testLogOnInfo(String content) {testLog.info(content);}public static void testLogOnDebug(String content) {testLog.debug(content);}}// 先判断再记录可有效提高性能,当这个记录器的级别》info时,就不用拼接下面两个字符串了(还要生成对象),//否则是先拼接再判断的(例如info()方法内部还会进行infoEnabled判断,这是传进来的已经是准备好了的对象了// 当拼接中可能要耗时大时(如调用其它耗时方法),会降低性能if(LogFactory.getLog("test_log").isInfoEnabled()) {LogFactory.getLog("test_log").info("enter infoenabled" + " ok");}