Log4J 学习

入门:

最初使用 sout,简单有效,但:

  • 不知道是哪个类,哪个线程输出的
  • 不知道什么时候输出的,因此不知前后输出,间隔多长时间
  • 无法选择性的关闭调试级别的信息:输出过多时,对程序效果形成干扰、没有级别区分,查看日志很痛苦等

因此使用日志框架,这里引入 Log4J(网上教程多为老项目 —— Log4J 1,先用着):

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

例程:

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

public class LogTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(LogTest.class);
        BasicConfigurator.configure();
        logger.setLevel(Level.DEBUG);

        logger.trace("跟踪信息");
        logger.debug("调试信息");
        logger.info("输出信息");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.warn("警告信息");
        logger.error("错误信息");
        logger.fatal("致命信息");
    }
}

下面是新项目 Log4J 2 的例程:

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;

public class LogTest {
    public static void main(String[] args) {
        Logger logger = LogManager.getLogger(LogTest.class);
//        Configurator.setRootLevel(Level.DEBUG);
        Configurator.setLevel(logger.getName(), Level.DEBUG);

        logger.trace("跟踪信息");
        logger.debug("调试信息");
        logger.info("输出信息");
        logger.warn("警告信息");
        logger.error("错误信息");
        logger.fatal("致命信息");
    }
}

日志配置文件

1.log4j.properties

例子 ——:
在 classpath 下,创建 log4j.properties 文件:

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log4j.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=5

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

Java 代码:

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogTest {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(LogTest.class);
        PropertyConfigurator.configure("D:\\repository\\quartz\\src" +
                "\\main\\resources\\log4j.properties");
        logger.trace("跟踪信息");
        logger.debug("调试信息");
        logger.info("输出信息");
        logger.warn("警告信息");
        logger.error("错误信息");
        logger.fatal("致命信息");
    }
}

配置文件解释:

  • 设置日志等级为 debug;日志输出到两个地方,分别 stdout、R
  • stdout 输出到控制台:org.apache.log4j.ConsoleAppender;下面是控制台的格式
  • R 滚动写入到文件(在未超过文件指定大小之前,每次接着上次写入):一个文件 100k,最多 5 个文件。下面同样是输出的格式

输出格式类是 org.apache.log4j.PatternLayout,输出格式解释:

  • %c:日志所属类的全名
  • %f :日志所属类的类名
  • %d:输出时间(日期或时间点),默认格式为 ISO8601,也可以指定格式,如 %d{yyyy-MM-dd HH:mm:ss},输出如 2019-06-15 04:39:00
  • %l :日志事件发生的位置(第几行 line)
  • %m:输出指定的 message,如 trace("message")、debug("message")
  • %n:回车换行符
  • %p:输出一个字符串(包含优先级,即日志级别,其他为空格)。可以指定总长度,长度为正数,则右对齐;长度为非正数或者不指定,则左对齐。多余的空格补齐
  • %r:从应用启动,到输出该日志,所耗费的毫秒数
  • %t:输出该日志的线程名(或者 %M)

所以:

  • %5p [%t] (%F:%L) - %m%n 意思是:长度为 5 的日志级别 [线程名] (类名:行号) - 信息,然后再回车
  • %p %t %c - %m%n:长度不限的日志级别 线程名 类全名 - 信息,然后回车

2.log4j.xml

也可以只把 log4j.properties 文件,换成 log4j.xml 文件来配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/>
        </layout>
    </appender>

    <!-- 设置三方库的 logger -->
    <logger name="com.opensymphony">
        <level value="ERROR"/>
    </logger>
    <logger name="org.apache">
        <level value="ERROR"/>
    </logger>
    <logger name="org.hibernate">
        <level value="ERROR"/>
    </logger>

    <!-- rootLogger,除了上面指定的,对其他的都适用 -->
    <root>
        <!-- priority 和 level 一样,二者都可用 -->
        <priority value="ERROR"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>
posted @ 2019-06-13 02:30  不抛弃,不放弃  阅读(360)  评论(0编辑  收藏  举报