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. 区间 dp

    以一个经典题目引入到正题 : 有 n 堆石子 , 每两堆石子合并会花费一定的价值,所花费的价值即为 两堆石子上的价值和 , 问合并所有的石子后的最小花费 ? 思路分析 : 因为题干可以看成是对每个区间 ...

  2. document.visibilityState 监听浏览器

    document.hidden:表示页面是否隐藏的布尔值.页面隐藏包括 页面在后台标签页中 或者 浏览器最小化 (注意,页面被其他软件遮盖并不算隐藏,比如打开的 sublime 遮住了浏览器). do ...

  3. KVM虚拟化基础

    关于虚拟化 什么是虚拟化 在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器等),予以抽象. ...

  4. Django项目运行

    1.图像界面 2.配置ip和端口 2.命令行 python manage.py runserver ip:端口号 ip:端口号可以不写,为默认 也可以只修改端口号

  5. python self用法

    在定义类的过程中,无论是显式的创建类的构造方法,还是向类中添加实例方法,都要将self参数作为方法的第一个参数. class Person: def __init__(self): print(&qu ...

  6. Python-logging模块简单使用

    logging模块只要用于日志的打印.模块的源码在:Lib/logging/__init__.py 其中,logging.basicConfig(**kwargs)方法用于进行基本的属性配置,它的参数 ...

  7. python3操作PyMySQL笔记

    python3操作mysql需要先安装PyMySQL pip install PyMySQL 在linux登录mysql ,并且在安装数据库时设置了数据库的用户名“root”和密码“root”,mys ...

  8. TryCatchFinallyReturn

    public class TryCatchFinallyReturnTest { public int test(){ try { int i=1; int j=2/i; return 1; }cat ...

  9. JUC中的原子操作类及其原理

    昨天简单的看了看Unsafe的使用,今天我们看看JUC中的原子类是怎么使用Unsafe的,以及分析一下其中的原理! 一.简单使用AtomicLong 还记的上一篇博客中我们使用了volatile关键字 ...

  10. 使用Razor 使用Razor表达式处理命名空间 精通ASP-NET-MVC-5-弗瑞曼