log4j2基础入门(超详细)

一.导包

  (1)到官网下载log4jar包 https://logging.apache.org/log4j/2.x/download.html

     (2)将下载的.zip(windows中)加压,并将

    1.    log4j-api-×××.jar
    2.    log4j-core-×××.jar

    导入项目中,并BuildPath

二.调用

  (1)log4j的级别

    log4j规定了默认的几个级别:all<trace<debug<info<warn<error<fatal<off  (off是最高等级,即关闭所有日志记录;all是最低等级,即打开所有日志记录)

Level描述
ALL 各级包括自定义级别
DEBUG 指定细粒度信息事件是最有用的应用程序调试
ERROR 错误事件可能仍然允许应用程序继续运行
FATAL 指定非常严重的错误事件,这可能导致应用程序中止
INFO 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息
OFF 这是最高等级,为了关闭日志记录
TRACE 指定细粒度比DEBUG更低的信息事件
WARN 指定具有潜在危害的情况

 

    

  (2)log4j测试

    导包后测试一下log4j。

 

    代码如下:    

public class Log4jTest {
    private static Logger logger = LogManager.getLogger(Log4jTest.class.getName());
    public static void main(String[] args) {
        logger.trace("entry");    //trace级别的信息,和logger.entry() 基本一个意思,但已经过时
        logger.debug("我是debug信息");
        logger.info("我是info信息");
        logger.warn("我是warning信息");
        logger.error("我是error信息");
        logger.fatal("我是fatal信息");
        logger.trace("exit");// //和entry()对应的结束方法,和logger.exit()一个意思,同样已经过时
    }
}

    输出信息:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'log4j2.debug' to show Log4j2 internal initialization logging.
09:48:26.531 [main] ERROR com.sp.test.Log4jTest - 我是error信息
09:48:26.533 [main] FATAL com.sp.test.Log4jTest - 我是fatal信息

  结果只输出了error和fatal的信息,并且给出了原因,原因就是:没有找到log4j2的配置文件,便使用了默认的配置,仅仅显示error及以上级别的日志。那么,我们便需要创建一个配置文件,并且log4j2默认会在classpath目录下寻找log4j.json、log4j.jsn、log4j2.xml等名称的文件

  在src下创建log4j2.xml文件

  

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"></PatternLayout>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">//此处级别
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

  再次运行,显示:

10:15:17.001 [main] ERROR com.sp.test.Log4jTest - 我是error信息
10:15:17.004 [main] FATAL com.sp.test.Log4jTest - 我是fatal信息

  没有了第一行的没有找到配置文件的信息,说明配置文件已经找到,但是还是只显示error和fatal的输出信息,那是因为配置文件中的level设置的是error---和默认配置中的一样,现在改成trace则我们写的代码中要输出的日志信息全部打印出来:

  

10:18:37.898 [main] TRACE com.sp.test.Log4jTest - entry
10:18:37.901 [main] DEBUG com.sp.test.Log4jTest - 我是debug信息
10:18:37.901 [main] INFO  com.sp.test.Log4jTest - 我是info信息
10:18:37.901 [main] WARN  com.sp.test.Log4jTest - 我是warning信息
10:18:37.901 [main] ERROR com.sp.test.Log4jTest - 我是error信息
10:18:37.901 [main] FATAL com.sp.test.Log4jTest - 我是fatal信息
10:18:37.901 [main] TRACE com.sp.test.Log4jTest - exit

  另,对log4j.xml的PatternLayout 节点中的pattern属性的解释如下:

  

  %d{HH:mm:ss.SSS} 表示输出到毫秒的时间(.SSS即是毫秒)

  %t 输出当前线程名称

  %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补空格

  %logger 输出logger名称,因为Root Logger没有名称,所以没有输出

  %msg 日志文本

  %n 换行

  其他常用的占位符有:

  %F 输出所在的类文件名,如Client.java

  %L 输出行号

  %M 输出所在方法名

  %l  输出语句所在的行数, 包括类名、方法名、文件名、行数

  (3)自定义Appender及logger

    1.log4j2.xml在loggers节点下新建一个logger   2.在Appenders节点下新建一个File(将日志输出到文件)

    添加以后log4j2.xml代码如下:

    

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"></PatternLayout>
        </Console>
        <File name="myFile" fileName="./mylog.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"></PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <logger name="mylogger" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <Root level="trace">
            <AppenderRef ref="myFile"/>
        </Root>
    </Loggers>
</Configuration>

      在测试类中测试新的logger

    

public class Log4jTest {
    private static Logger myLogger = LogManager.getLogger("myLogger");//此处mylogger即为xml文件中的mylogger
    public static void main(String[] args) {    
        myLogger.trace("entry");    //trace级别的信息,和logger.entry() 基本一个意思,但已经过时
        myLogger.debug("我是debug信息");
        myLogger.info("我是info信息");
        myLogger.warn("我是warning信息");
        myLogger.error("我是error信息");
        myLogger.fatal("我是fatal信息");
        myLogger.trace("exit");// //和entry()对应的结束方法,和logger.exit()一个意思,同样已经过时
    }
}

  由于myFile中的fileName设置的路径为当前目录下,查看项目所在文件夹,发现已经自动创建了一个mylog文件并写入了log信息

                                    

参考博客:https://www.cnblogs.com/sa-dan/p/6837225.html

     http://blog.csdn.net/moonpure/article/details/51034656

                 http://blog.csdn.net/duruiqi_fx/article/details/52689130

 

posted @ 2018-01-23 11:07  饮冰丶  阅读(661)  评论(0)    收藏  举报