log4j.xml配置示例

这是log4j1.x版本讲解,log4j-1.2.16.jar   

 

1、 一般的log4j.xml的两种配置方式:

1、Logger 完成日志信息的处理
定义输出的层次和决定信息是否输出
DEBUG<INFO<WARN<ERROR

2、Appender 设置日志信息的去向
常用的:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppener(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志讯息以串流格式发送到任意指定的地方)
org.apache.log4j.JdbcAppender(将日志讯息保存到数据库中)

3、Layout 设置日志信息的输出样式
layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.SimpleLayout(包含日志讯息的级别和讯息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、执行绪、类别等讯息)
org.apache.log4j.PatterLayout(可以灵活地指定布局格式)

4、配置文件 log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
    <!-- 定义一个从控制台输出的日志信息 -->
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n"/>
        </layout>
        <!--限制输出级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="levelMin" value="DEBUG" />
            <param name="levelMax" value="ERROR" />
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>
    
    <appender name="File_debug" class="org.apache.log4j.FileAppender">
        <param name="File" value="C:/log4j_debug.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n"/>
        </layout>
        <!--限制输出级别    只输出DEBUG级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="levelMin" value="DEBUG" />
            <param name="levelMax" value="DEBUG" />
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>

    <appender name="File_error" class="org.apache.log4j.FileAppender">
        <param name="File" value="C:/log4j_error.log"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %c -%-4r [%t] %-5p %x - %m%n"/>
        </layout>
        <!--限制输出级别    只输出ERROR级别-->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="levelMin" value="ERROR" />
            <param name="levelMax" value="ERROR" />
            <param name="AcceptOnMatch" value="true" />
        </filter>
    </appender>
    

    
    <!--<logger>的定义可以将各个包中的类日志输出到不同的日志文件中-->
    <!--com.litt2.log4j 目录下的日志会被打印到控制台中  -->
    <!---如果在root节点也包含<appender-ref ref="CONSOLE"/>  没有additivity="false"会重复打印<level value="WARN"/>级别的日志信息 -->
    <logger name="com.litt2.log4j" additivity="false">
        <level value="WARN"/>
        <appender-ref ref="CONSOLE"/>
    </logger>
    <!--<category></category>的作用和<logger>相同-->
    <!--com.litt3 目录下的日志会被打印到控制台中  -->
    <category name="com.litt3">
        <level value="DEBUG"/>
        <appender-ref ref="CONSOLE"/>
    </category>
    <root>
        <priority value="debug"/>
        <appender-ref ref="File_debug"/>
        <appender-ref ref="File_error"/>
    </root>
</log4j:configuration>

通过 ${catalina.base} 变量能获得tomcat的目录:

 ${catalina.base}/logs/psp_error.log   日志放到tomcat/logs 目录下文件名为psp_error.log

http://blog.csdn.net/longaohun/article/details/6233099

<root>和<logger> 是并列的节点,不能在root节点中包含对logger节点的映射,之前看别人写的xml文件有在root节点中包含logger节点的错误。

使用log4j 在调用其他类的方法时,会发现打印出来的行号是不正确的(自己可以试验),可以自己写方法方法处理。

 

public class Logger {
    private Log logger;
    public Logger(Log logger) {
        this.logger = logger;
    }

    public void debug(String paramString) {
        logger.debug(getFunctionName() + paramString);
    }

    public void debug(String paramString, Throwable t) {
        logger.debug(getFunctionName() + paramString, t);
    }

    public void info(String paramString) {
        logger.info(getFunctionName() + paramString);
    }

    public void info(String paramString, Throwable t) {
        logger.info(getFunctionName() + paramString, t);
    }

    public void warn(String paramString, Throwable t) {

        logger.warn(getFunctionName() + paramString, t);
    }

    public void warn(String paramString) {

        logger.warn(getFunctionName() + paramString);
    }

    public void error(String paramString) {

        logger.error(getFunctionName() + paramString);
    }

    public void error(String paramString, Throwable paramThrowable) {
        logger.error(getFunctionName() + paramString, paramThrowable);
    }

    private String getFunctionName() {

        StackTraceElement[] sts = Thread.currentThread().getStackTrace();
        if (sts == null) {
            return null;
        }

        for (StackTraceElement st : sts) {
            if (st.isNativeMethod()) {
                continue;
            }
            if (st.getClassName().equals(Thread.class.getName())) {
                continue;
            }
            if (st.getClassName().equals(this.getClass().getName())) {
                continue;
            }//获取行号和类名   log4j也能显示行号,但是log4j显示的行号不准确。
            return "[" + st.getClassName() + ":" + st.getLineNumber() + "] - ";
        }
        return null;
    }
}

StackTraceElement[] sts = Thread.currentThread().getStackTrace();  不明白可以查询jdk的API, 是去的方法的栈信息

public class LoggerFactory {

    public static Logger getLogger(Class<?> clazz) {
        return new Logger(LogFactory.getLog(clazz));
    }

    public static Logger getLogger(String loggerName) {
        return new Logger(LogFactory.getLog(loggerName));
    }
}

 

使用:

private Logger logger1 = LoggerFactory.getLogger(this.getClass());  或者类名.class 

 

如何使用log4j 参考  《log4j从入门到详解.pdf》  

参考

http://blog.csdn.net/subuser/article/details/20645163

http://heavyz.sourceforge.net/homepage/homepage_zh/comp/notes/log4j.html

http://blog.csdn.net/xiechao240/article/details/5922208

http://www.uml.org.cn/j2ee/201311051.asp

转载于:https://www.cnblogs.com/laj12347/p/3840637.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值