zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    Linux里的2>&1究竟是什么
    表锁操作
    日志rsyslog
    计划任务at cron
    rpm包管理和源码包管理
    自建yum源(只演示nginx服务,其它都一样)
    软件包管理yum
    文件打包及压缩
    查找文件which locate find
    lsof恢复进程打开的文件
  • 原文地址:https://www.cnblogs.com/shi-blog/p/4165350.html
Copyright © 2011-2022 走看看