zoukankan      html  css  js  c++  java
  • 学习笔记—log4j2

    概念

    什么是日志

      日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及Bug的查找。

    log4j2的概念

      log4j2是一个日志输出的插件,专门用来进行日志的管理。

      Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

      Log4j2是Log4j的升级版。

    log4j2的优势

    1. 日志可以单独保存在文件中
    2. 可以获取完整的日志信息
    3. 可以进行日志显示的筛选
    4. 格式友好

    log4j2的使用流程

    导入log4j2的jar包

      1、下载压缩包(下载地址:https://logging.apache.org/log4j/2.x/download.html)

      2、解压压缩包,并向项目导入两个jar包

      

      3、将jar包添加到配置环境中

    配置log4j2的配置文件

      1.配置文件名称及存放路径。

      log4j 2.x版本不再支持.properties后缀的文件配置方式。2.x版本的配置文件后缀只能是“.xml”,".json"或者“.jsn”。

      log4j2的配置文件必须放置在classpath(src文件夹)下。

      系统选择配置文件的优先级(从前到后):

    •   log4j2-test.json 或者log4j2-test.jsn文件
    •        log4j2-test.xml 文件
    •        log4j2.json 或者 log4j2.jsn 文件
    •        log4j2.xml 文件

      2.配置文件内容

      (1)根节点 Configuration 有两个属性:status、monitorinterval,有两个子节点:Appenders(输出端)、Loggers(日志记录器)。

        status:用来指定log4j本身的级别。

        monitorinterval:用来指定自动重新读取配置文件的间隔时间,单位是s。

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN" monitorInterval="30">
      <Appenders>
        
      </Appenders>
      <Loggers>
        
      </Loggers>
    </Configuration>

      (2) Appenders节点(输出端),用来指定日志输出到那个位置,常见的有三种子节点 Console、RollingFile、File

        Console节点 将日志输出到控制台

        属性:name:取名字。

           target:SYSTEM_OUT 或 SYSTEM_ERR 表示输出到控制台

        节点:PatternLayout:输出格式,不设置默认为:%m%n

    <console name="Console" target="SYSTEM_OUT">
     <!--输出日志的格式-->
           <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
     </console>

        File节点 将日志输出到文件

        属性:name:取名字。

           fileName:指定输出日志的接收文件。

           append:false或true。表示是否追加

        节点:PatternLayout:输出格式,不设置默认为:%m%n

     <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File>

        RollingFile节点 将日志输出到文件,并指定文件大小,如果超过文件大小,则自动将文件改名,并产生新的日志文件

        属性:name:取名字。

           fileName:指定输出日志的接收文件

           filePattern:当文件达到最大时,指定新建日志的名称格式

        节点:ThresholdFilter:指定输出级别

           PatternLayout:输出格式,不设置默认为:%m%n

           Policies:

              SizeBasedTriggeringPolicy  指定当文件体积大于size指定的值时,触发Rolling

              TimeBasedTriggeringPolicy  这个配置需要和filePattern结合使用,interval属性用来指定多久滚动一次

           DefaultRolloverStrategy  指定最多保存的文件个数

     <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log" filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
          <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
          <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
          <Policies>
              <TimeBasedTriggeringPolicy/>
              <SizeBasedTriggeringPolicy size="100 MB"/>
          </Policies>
          <DefaultRolloverStrategy max="20"/>
     </RollingFile>

      (3) Loggers节点(日志记录器)控制日志的输出级别与日志是否输出,只有定义了logger并引入的appender,appender才会生效。

        logger节点 单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

        属性:name:指定logger所适用的类

           level:指定日志等级

        节点:AppenderRef:用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。

        root节点:用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

    <Loggers>
      <Logger name="com.shangyang" level="DEBUG"/>
      <Root level="ERROR">
        <AppenderRef ref="STDOUT">
      </Root>
    </Loggers>

      3.log4j2的日志级别(从低到高)

        All:最低级别,打开所有日志记录

        Trace:只要程序运行过程,即只要程序运行一条命令,即可输出一条日志

        Debug:调试(代码级别)

        Info:信息(方法级别)

        Warn:警告

        Error:异常错误,但不影响程序的继续运行

        Fatal:致命的错误,将会导致程序退出

        OFF:最高级别,关闭所有日志

      注意:一般只使用5个级别,优先级从低到高为:Debug < Info < Warn < Error < Fatal

      程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。

       4.Layout(格式转换器)  

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

        %t 输出当前线程名称

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

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

        %msg 日志文本

        %n 换行

        其他常用的占位符有:

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

        %L 输出行号

        %M 输出所在方法名

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

    在使用log4j2的类中声明全局的Logger对象

      调用LogManager类的 getLogger() 方法

    private static Logger logger = LogManager.getLogger(类名.class);

    使用logger对象调用日志方法进行日志输出语句声明

    logger.trace("我是trace信息");
    logger.debug("我是debug信息");
    logger.info("我是info信息");
    logger.warn("我是warn信息");
    logger.error("我是error信息"); 
    logger.fatal("我是fatal信息"); 

    实例

    java代码

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class TestLog {
        public static void main(String[] args) {
            Hello hello = new Hello();
            Hi hi = new Hi();
            hello.getHello();
            hi.getHi();
        }
    }
    
    class Hello {
        private static Logger logger = LogManager.getLogger(Hello.class.getName());
        public void getHello() {
            logger.trace("我是trace信息");
            logger.debug("我是debug信息");
            logger.info("我是info信息");
            logger.warn("我是warn信息");
            logger.error("我是error信息"); 
            logger.fatal("我是fatal信息"); 
        }
    }
    
    class Hi {
        private static Logger logger = LogManager.getLogger(Hi.class);
        public void getHi() {
            logger.trace("我是trace信息");
            logger.debug("我是debug信息");
            logger.info("我是info信息");
            logger.warn("我是warn信息");
            logger.error("我是error信息"); 
            logger.fatal("我是fatal信息"); 
        }
    }

     配置文件

    <?xml version="1.0" encoding="UTF-8"?>
     <configuration status="WARN" monitorInterval="30">
         <appenders>
             <console name="Console" target="SYSTEM_OUT">
                 <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             </console>
         <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
         </File>
         </appenders>
         <loggers>
             <logger name="com.shangyang.test.Hello" level="info">
             </logger>
             <root level="error">
                <appender-ref ref="Console"/>
                <appender-ref ref="log"/>
             </root>
         </loggers>
     </configuration>

     控制台显示

    日志文件显示

  • 相关阅读:
    jupyterlab数据处理
    系统监测模块
    登录验证码的实现
    编码格式检测chardet模块
    图像处理pillow模块
    内存数据的读取
    力扣(LeetCode)728. 自除数
    力扣(LeetCode)709. 转换成小写字母
    Java 层序创建和遍历二叉树
    力扣(LeetCode) 849. 到最近的人的最大距离
  • 原文地址:https://www.cnblogs.com/shangyang/p/10594336.html
Copyright © 2011-2022 走看看