Apache Log4j2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.

既然Log4j2相比Log4j和Logback有了这么多的优势,那么用就完事了。

log4j2 特点

  • The Log4j API supports logging Messages instead of just Strings.
  • The Log4j API supports lambda expressions.
  • The Log4j API provides many more logging methods than SLF4J.
  • Improved Performance,使用多线程,相比log4j和logback,效率提高18倍。
  • Automatic Reloading of Configurations

log4j2配置结构

一句话概括Loggers和Appenders之间的关系:Appenders指定输出文件的级别和输出文件的位置,Loggers指定哪些包的log由哪一个Appeders输出

  • Configuration

    • Appenders

      • RollingFile
      • File
      • Console
    • Loggers
  1. configuration

    根节点,有两个属性,status 和 monitorinterval

    • status

      status 用来指定打印的级别(trace,debug,info,warn,error,fatal)
    • monitorinterval

      用来默认加载log4j2配置文件,单位为秒,如设置

      <configuration monitorinterval="30">

      代表每30秒会加载一次配置文件,所以在30秒内修改配置文件可以修改log的使用
  2. Appenders

    输出源,定义日志输出的地方。

    • 输出方式:

      %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间

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

      %c : logger的名称(%logger)

      %t : 输出当前线程名称

      %p : 日志输出格式

      %m : 日志内容,即 logger.info("message")

      %n : 换行符

      %C : Java类名(%F)

      %L : 行号

      %M : 方法名

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

      hostName : 本地机器名

      hostAddress : 本地ip地址

      摘自https://www.cnblogs.com/keeya/p/10101547.html

    • 输出源类别

      Console,File,RollingFile等

      公共部分

      name:指定Appender的名字.

      fileName:指定输出日志的目的文件带全路径的文件名.

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

      RollingFile特有Policies 来确定什么时候生成文件。

       <RollingFile name="RollingFileRoot" fileName="/opt/logs/api/root.log"
      filePattern="/opt/logs/api/root-%d{yyyy-MM-dd}-%i.log">
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <PatternLayout charset="UTF-8"
      pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
      <Policies>
      <!--按天分配-->
      <TimeBasedTriggeringPolicy interval="1"/>
      <!--按大小分配-->
      <SizeBasedTriggeringPolicy size="1GB"/>
      </Policies>
      </RollingFile>
  3. Loggers

    给不同的包自定义日志级别。在Loggers中配置哪些包输出到哪些文件里(使用AppenderRef去指定appender中设置的输出位置)

    • root

      • root为根记录器,不手动设置默认在 LoggerConfig,级别为ERROR且输出在 Console(控制台)
      • root 没有name和additivity属性
    • Logger
      • Logger 有name属性,为具体的包(com.xxx.api.dao)
      • Logger level属性(trace/warn/error等) 可以控制输出的级别
      • Logger additivity属性(true/false) 可以控制是否将这些包中输出的信息也写到root对应的Log中去。建议使用false来不写入。

springboot 使用 log4j2

在maven 中引入依赖

<!--取消在starter.web中自带的spring-boot-starter-logging,在starter.web中采用的是logback-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加log4J2依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFileRoot" fileName="/opt/logs/api/root.log"
filePattern="/opt/logs/api/root-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="/opt/logs/api/warn.log"
filePattern="/opt/logs/api/warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
<!--<DefaultRolloverStrategy max="20"/>-->
</RollingFile>
<RollingFile name="RollingFileError" fileName="/opt/logs/api/error.log"
filePattern="/opt/logs/api/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
<RollingFile name="MyBatisFile" fileName="/opt/logs/api/dao.log"
filePattern="/opt/logs/api/dao-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile> <RollingFile name="requestLog" fileName="/opt/logs/api/request.log"
filePattern="/opt/logs/api/request-%d{yyyy-MM-dd}-%i.log">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="1GB"/>
</Policies>
</RollingFile>
</Appenders> <Loggers>
<Root level="info">
<AppenderRef ref="RollingFileRoot"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Root>
<Logger name="com.xxx.api.dao" level="WARN" additivity="false">
//为dao mapper所在的包,level为TRACE
<AppenderRef ref="MyBatisFile"/>
</Logger> <Logger name="requestLogger" level="TRACE" additivity="false">
<AppenderRef ref="requestLog"/>
</Logger>
</Loggers>
</Configuration>

log4j2 springboot 特点与使用方法的更多相关文章

  1. Slf4j与log4j及log4j2的关系及使用方法

    Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ...

  2. 【异常处理】Springboot对Controller层方法进行统一异常处理

    Controller层方法,进行统一异常处理 提供两种不同的方案,如下: 方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionH ...

  3. Springboot对Controller层方法进行统一异常处理

    Controller层方法,进行统一异常处理 提供两种不同的方案,如下: 方案1:使用 @@ControllerAdvice (或@RestControllerAdvice), @ExceptionH ...

  4. (三)SpringBoot停止服务的方法

    SpringBoot停止服务的方法 第一种:actuator 第二种:context 第三种:进程号 第四种:SpringApplication.exit() 第五种:自定义Controller Sp ...

  5. springBoot启动时让方法自动执行的几种实现方式

    一.开篇名义 在springBoot中我们有时候需要让项目在启动时提前加载相应的数据或者执行某个方法,那么实现提前加载的方式有哪些呢?接下来我带领大家逐个解答 1.实现ServletContextAw ...

  6. Springboot第二篇:与前端fetch通信(附springboot解决跨域方法)

    说到与前端通信,明白人都知道这章肯定会写两部分的东西啦. 关于后台 ①首先回顾前文,上一章环境搭建如图: ②我们在maven.example.controller下添加一个文件,并附上如图代码: ③: ...

  7. springboot项目执行controller方法时进入慢的问题

    今天在部署springboot项目到阿里云时,出现登录方法执行特别慢的问题.刚开始以为是卡死了,等了3,4分钟才进去,最后会出现如下信息: 2018-01-28 15:38:36.958 INFO 4 ...

  8. SpringBoot 参数校验的方法

    Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...

  9. springboot 启动时执行方法

    Springboot提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner.下面简单介绍下ApplicationRunner 1.创建个Tests ...

随机推荐

  1. 继承Exception⭐⭐

    public class ECOrderException : Exception { //第一种类型: throw new ECOrderException { ErrorCode = " ...

  2. js强制限制输入允许两位小数

    <input type="text" value="@item.CostCash.Value.ToString("#0.00")" c ...

  3. Unable to open debugger port (127.0.0.1:57046): java.net.SocketException "so

    原因分析: 出现这个报错的原因是因为端口被占用导致的. 解决方法: 解决方法主要两种:修改端口配置(推荐).关闭占用端口的进程(不推荐). 方式一:修改端口配置(推荐) 被占用的端口可能是本地端口,也 ...

  4. Java设计模式之三种工厂模式

    工厂模式实现了创建者和调用者的分离,实现了更好的解耦.   详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1)       OC ...

  5. 使用zipwithindex 算子给dataframe增加自增列 row_number函数实现自增,udf函数实现自增

    DataFrame df = ...StructType schema = df.schema().add(DataTypes.createStructField("id", Da ...

  6. java面试题-spring篇

    这次是关于spring的面试题,和上次一样依旧挑了几个具有代表性的. 一.  谈谈你对 Spring 的理解 Spring 是一个开源框架,为简化企业级应用开发而生.Spring 可以是使简单的 Ja ...

  7. (分块暴力)Time to Raid Cowavans CodeForces - 103D

    题意 给你一段长度为n(1 ≤ n ≤ 3·1e5)的序列,m (1 ≤ p ≤ 3·1e5)个询问,每次询问a,a+b,a+2b+...<=n的和 思路 一开始一直想也想不到怎么分,去维护哪些 ...

  8. [bzoj4417] [洛谷P3990] [Shoi2013] 超级跳马

    Description 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可 ...

  9. NSQ源码剖析——主要结构方法和消息生产消费过程

    目录 1 概述 2 主要结构体及方法 2.1 NSQD 2.2 tcpServer 2.3 protocolV2 2.4 clientV2 2.5 Topic 2.6 channel 3 启动过程 4 ...

  10. CSS-08-边框属性设置

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...