文档章节

学习笔记—log4j2

o
 osc_a22drz29
发布于 2019/03/27 16:51
字数 1752
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

概念

什么是日志

  日志是系统运行过程中的后台输出信息,方便程序员进行系统运行的管控以及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>

 控制台显示

日志文件显示

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
如何在MyBatis-3.2.7中使用Log4j2 rc2——MyBatis学习笔记之十九

前天我上传了我的MyBatis系列课程(http://edu.51cto.com/course/course_id-1110.html)的第六讲,主要内容是如何使用Log4j2(具体版本为v2.0-rc1)为MyBatis 3.2.7配置日志。实际上目前最新...

NashMaster2011
2014/07/09
0
0
如何在MyBatis-3.2.7中使用Log4j2 rc2——MyBatis学习笔记之十九

前天我上传了我的MyBatis系列课程(http://edu.51cto.com/course/course_id-1110.html)的第六讲,主要内容是如何使用Log4j2(具体版本为v2.0-rc1)为MyBatis 3.2.7配置日志。实际上目前最新...

NashMaster2011
2014/07/09
0
0
【系统日志笔记一】——丰富Log4j2配置

log4j大家应该再熟悉不过了,log4j2则是log4j的一次比较大的升级,底层使用disruptor重写优化了异步输出日志,性能得到极大提高。笔者曾将log4j、logback、log4j2做过性能对比,log4j2的确表...

Bingo许
2019/05/29
20
0
MyBatis多对多保存示例——MyBatis学习笔记之十七

前几天有网友问到MyBatis多对多的问题,不过愧对网友厚爱的是,最近一直忙,直到现在才有时间处理此事。今天就先写一个多对多保存的示例,算是对这位网友的初步回应,以后会有更多相关的博文...

NashMaster2011
2013/08/11
0
0
MyBatis学习笔记系列教程

【MyBatis学习笔记】系列之预备篇一:ant的下载与安装 【MyBatis学习笔记】系列之预备篇二:ant入门示例 【MyBatis学习笔记】系列之一:MyBatis入门示例 【MyBatis学习笔记】系列之二:MyBat...

HenrySun
2016/10/15
227
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊rocketmq-client-go的TraceInterceptor

序 本文主要研究一下rocketmq-client-go的TraceInterceptor TraceInterceptor rocketmq-client-go-v2.0.0/producer/interceptor.go // WithTrace support rocketmq trace: https://github.c......

go4it
50分钟前
0
0
如何在Android文本视图周围添加边框? - How do I put a border around an Android textview?

问题: 是否可以在textview周围绘制边框? 解决方案: 参考一: https://stackoom.com/question/EfXR/如何在Android文本视图周围添加边框 参考二: https://oldbug.net/q/EfXR/How-do-I-put...

法国红酒甜
今天
10
0
设计模式(4) 建造者模式

什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了...

zhixin9001
今天
14
0
ArrayList源码分析 —— JDK8

ArrayList的特性 ArrayList内部使用数据作为存储结构,ArrayList可以理解为数组的扩展对象,封装了常用的和非常用的操作数组的方法。以及当数组长度不足以保存数组时,自动扩容数组,通常Arr...

XuePeng77
今天
56
0
__slots__的用法? - Usage of __slots__?

问题: Python中__slots__的目的是什么-尤其是关于何时以及何时不使用它的目的? 解决方案: 参考一: https://stackoom.com/question/1ymu/slots-的用法 参考二: https://oldbug.net/q/1ym...

富含淀粉
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部