Log4j学习笔记

(一)Log4j的三个主要组件:Loggers、Appenders 和 Layouts,这三个组件协同工作,使得开发人员能够根据消息的类型和级别来记录消息,并且在程序的运行期控制消息的输出格式及位置。

      1. Logger:日志记录器,负责日志记录的大部分工作,是一个核心组件。

      2. Appender: 日志信息的输出目的地,负责日志记录的输出控制。

      3. Layout: 日志格式化器,负责格式化 Appender 的输出。

他们的关系图如下所示:

     

(二)日志的级别:

        Log4j中的日志级别从低到高依次为: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF,他们被定义在

org.apache.log4j.Level当中,通常日志级别是在日志的配置文件中设置(log4j.properties文件中配置的,后面会讲到的)。

     OFF: 它的日志级别最高,表示不进行日志的记录。

     FATAL: 表示严重的错误,会导致应用程序退出。

     ERROR:表示一般可以纠正的错误,不影响应用程序的继续执行。

     WARN: 警告级别的信息。

     INFO: 应用程序执行的必要信息记录。

     DEBUG: 便于调试的日志记录。

     TRACE: 程序代码执行轨迹的日志记录。

     ALL: 级别最低,所有的日志信息都将记录。

     要实现这些日志级别,我们需要通过调用 Logger 的方法来实现日志请求,常用的方法有:debug(),info(),warn(),error(),fatal()。

(三)Log4j的使用案例

     1. 导入开发包:log4j-1.2.17.jar

     2. 在需要日志记录的程序中定义 Logger 的实例变量,通常的做法是:

private static final Logger logger = Logger.getLogger(XXX.class);

     

     3. 在程序中调用相应的日志请求方法。

     4. 编写配置文件,以此来说明日志的显示方式和级别(在src下创建log4j.properties文件)

        (1) 首先创建Appenders

               log4j.appender.A1=org.apache.log4j.ConsoleAppender

              表示创建了一个appender,且名字为A1,使用输出策略是org.apache.log4j.ConsoleAppender(该类可以在 log4j API中找到)

             (2) 说明日志的展示布局

              log4j.appender.A1.layout=org.apache.log4j.PatternLayout

              表示字为A1的appender以何种布局来展示,这里常用的默认布局是PatternLayout

             (3) 说明通过什么样的格式来完成日志的展示

               log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

               它在控制台中展示的结果如下形式(其中的%-4r %-5p中的数字表示信息之间的间隔):

              

               【

                        Log4j提供的layout有以下几种:

                              org.apache.log4j.HTMLLayout(以HTML表格形式布局)

                              org.apache.log4j.PatternLayout(可以灵活地指定布局模式)

                              org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)

                              org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

                        Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

                              %m :输出代码中指定的消息
                              %p :输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
                              %r :输出自应用启动到输出该log信息耗费的毫秒数
                              %c :输出所属的类目,通常就是所在类的全名
                              %t :输出产生该日志事件的线程名
                              %n :输出一个回车换行符,Windows平台为" ",Unix平台为" "
                              %d :输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,

                        比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
                              %l :输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

                】

                (4) 在什么时候输出日志

                 log4j.rootLogger=DEBUG, A1(DEBUG日志级别,A1表示的是appender)

                 rootLogger表示根目录的 Logge r,每个项目的classpath就是根目录。表示只要有大于或等于DEBUG级别的日志,都会输出A1。

                 log4j.logger.log4j.dao=DEBUG,A1

                       表示在 log4j.dao 这个包中只要找到使用Logger logger = Logger.getLogger(XX.class)注入的类都会输出日志

         5. 案例代码如下:

              工程的目录结构:

                    

                配置文件(log4j.properties)信息:

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ss} [%t] %37c %3x - %m%n

#使用FileAppender将日志输出到文件中
#log4j.appender.fout=org.apache.log4j.FileAppender

#按日期产生一个新的文件
#log4j.appender.fout=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.fout.datePattern='.'yyyy-MM-dd-HH-mm

#按日志文件大小产生一个新文件
log4j.appender.fout=org.apache.log4j.RollingFileAppender
log4j.appender.fout.MaxFileSize=10
#产生新文件时,标记新文件的索引
log4j.appender.fout.MaxBackupIndex=50

log4j.appender.fout.layout=org.apache.log4j.PatternLayout
#通常在实际项目开发中,我们使用的是相对路径。常使用的方法是将路径设置到System.setProperty()方法
#然后${key}来获取System.setProperty()中的值
log4j.appender.fout.file=${LOG_DIR}/file.log
log4j.appender.fout.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

#表示classpath下的所有使用了日志记录的都会输出
#log4j.rootLogger=DEBUG, A1

#创建一个名称为test的logger,这个是基于名称的访问,即在你需要日志记录的类中使用
#Logger logger = Logger.getLogger("test")来创建logger,但不建议使用这种方式
#log4j.logger.test=WARN,fout

#表示在log4j.service这个包中只要找到使用Logger logger = Logger.getLogger(XX.class)注入的类都会输出日志
log4j.logger.log4j.service=WARN,fout
log4j.logger.log4j.dao=DEBUG,A1

             dao 包中的类:

package log4j.dao;

import org.apache.log4j.Logger;

public class UserDao {
    private static final Logger logger = Logger.getLogger(UserDao.class);
    
    public void logInfo() {
        logger.debug("debug---用户信息");
        logger.error("error---错误信息");
        logger.warn("warn---警告信息");
        logger.fatal("fatal---大量数据信息");
    }
}

             service 包中的代码:

package log4j.service;

import org.apache.log4j.Logger;

public class UserService {
    private static final Logger logger = Logger.getLogger(UserService.class);

    public void logInfo() {
        logger.debug("debug---用户信息");
        logger.error("error---错误信息");
        logger.warn("warn---警告信息");
        logger.fatal("fatal---大量数据信息");
    }
}

            test 包中测试代码:

package log4j.test;

import log4j.dao.UserDao;
import log4j.service.UserService;

import org.junit.Test;

public class TestLog4j {
    @Test
    public void testOne() {
        UserDao dao = new UserDao();
        dao.logInfo();
    }
    
    @Test
    public void testService() {
        //设置相对路径的操作,对应到配置文件中的:log4j.appender.fout.file=${LOG_DIR}/file.log
        String uri = this.getClass().getClassLoader().getResource("").getPath();
        uri = uri.replaceAll("bin/", "log");
        System.setProperty("LOG_DIR", uri);
        System.out.println(uri);
        
        UserService service = new UserService();
        service.logInfo();
    }
}
原文地址:https://www.cnblogs.com/shi-blog/p/4165350.html