Spring Boot 笔记 (2) - 使用 log4j2 记日志
日志框架的选用
Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考:
一个日志框架, 重点就是产生日志、控制台输出日志、存储日志和归档日志这几项工作. 而想要实现这些功能核心就是配置. 因此, 假如想要使用其他日志框架, 比如 log4j2 的话, 就需要自行创建配置文件.
配置文件
Java 项目大量使用 xml 作为配置文件, log4j也一样, 那样繁琐的配置几乎是不可接受的, 但好在 SpringBoot 增加了 json 和 yml 格式的支持.
Maven - 依赖管理
- 首先要排除原有的 spring-boot-starter-logging
 - 其次要增加 spring-boot-starter-log4j2 依赖
 - 添加两个工具库用于 
log4j2.yml文件解析 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <!--排除原有的 spring-boot-starter-logging -->
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 增加  spring-boot-starter-log4j2 依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- log4j2.yml 文件解析工具库 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
log4j2.yml
配置文件 log4j2.yml 应保存于 resources 文件夹下, 主要配置的内容有 Configuration 下的 status、Properties、Appenders.Console、Appenders.RollingFile 和 Loggers.
Properties主要是为了定义字段在之后的配置中使用;Appenders.Console主要是为了对输出到控制台中的日志内容的格式进行配置;Appenders.RollingFile则是为了对输出到文件中的日志内容的存储和格式进行配置;Loggers则对目前启用的策略进行声明.
不难看出, 控制台输出中的 ThresholdFilter 是一个过滤器, 其中的 level 字段规定了当前输出的日志的级别, 下面的 RollingFile 也是同理. 同时两个 level 分别受到 Properties 所定义的变量的控制.
因为需要保存, 因此 RollingFile 对文件名和文件命名进行了规定, 其中 Policies 则是对归档策略进行规定, 归档也就是对一些较为早期的日志进行压缩处理. 而两个不同的 Trigger 则代表了不同的归档判断方法——一个是基于时间, 一个是基于大小. 而如下的配置, 就是在当前根目录下的 log 文件夹中存储日志.
Configuration:
  status: warn
  Properties: # 定义全局变量
    Property:
      - name: CONSOLE_LEVEL
        value: info
      - name: ROLLING_FILE_LEVEL
        value: warn
      - name: LOG_PATH
        value: log
      - name: LOG_FILENAME
        value: tcm-health-log
  Appenders:
    Console: #输出到控制台
      - name: CONSOLE
        target: SYSTEM_OUT
        PatternLayout:
          pattern: "%d{yyyy-MM-dd HH:mm:ss} : %4p %t (%F:%L) - %m%n"
        ThresholdFilter:
          level: ${sys:CONSOLE_LEVEL} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
          onMatch: ACCEPT
          onMismatch: DENY
    RollingFile: # 输出到文件,超过128MB归档
      - name: ROLLING_FILE
        ignoreExceptions: false
        fileName: "${LOG_PATH}/${LOG_FILENAME}.log"
        filePattern: "${log.path}/$${date:yyyy-MM}/${project.name}-%d{yyyy-MM-dd}-%i.log.gz"
        PatternLayout:
          pattern: "%d{yyyy-MM-dd HH:mm:ss} : %4p %t (%F:%L) - %m%n"
        Policies:
          TimeBasedTriggeringPolicy:  # 基于时间的归档策略
            interval: "1"
            modulate: "true"
#          SizeBasedTriggeringPolicy: # 基于大小的封存策略
#            size: "128 MB"
        ThresholdFilter:
          level: ${sys:ROLLING_FILE_LEVEL} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值
          onMatch: ACCEPT
          onMismatch: DENY
        DefaultRolloverStrategy:
          max: 100
  Loggers:
    Root:
      level: info
      AppenderRef:
        - ref: CONSOLE
        - ref: ROLLING_FILE
更多
或许有些人会不明白为什么要在 properties 中配置变量, 其实重要目的是为了便于配置, 可以在执行时通过传参来改变配置, 这样可以使日志的使用更加灵活.
# 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:
## 测试:
-DCONSOLE_LEVEL=warn -DROLLING_FILE_LEVEL=trace
## 生产:
-DCONSOLE_LEVEL=warn -DROLLING_FILE_LEVEL=info
使用
首先是在 Spring 容器中注册, 简单的方法如下, 在Application.java 文件中直接注册.
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Bean
    public Logger getLog4jLogger(){
         return LogManager.getLogger(this.getClass());
    }
}
接着就可以使用了, 使用方法非常简单, 下面是一个简单的例子.
@AutoWired
private Logger logger;
@GetMapping("/test")
public String test() {
    logger.info("connect to api server successfully");
    logger.warn("connect to api server successfully");
    logger.error("connect to api server successfully");
    return "connect to api server successfully";
}
参考
log4j2教程【RollingFileAppender】 - 山鬼谣的专栏 - CSDN博客: 对 log4j2 的配置做了详细阐述
Log4j 2使用教程 - 天外的星星 - 博客园: 对 log4j2 的用法进行了比较完整的介绍
Spring Boot 笔记 (2) - 使用 log4j2 记日志的更多相关文章
- 从零一起学Spring Boot之LayIM项目长成记(五)websocket
		
前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能 ...
 - spring boot 笔记--第三章
		
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
 - 从零一起学Spring Boot之LayIM项目长成记(四) Spring Boot  JPA 深入了解
		
前言 本篇内容主要是一些关于JPA的常用的一些用法等.内容也是很多是看其他博客学来的,顺道在本系列博客里抽出一篇作为总结.下面让我们来看看吧. 不过我更推荐大家读本篇:https://lufficc. ...
 - 从零一起学Spring Boot之LayIM项目长成记(三) 数据库的简单设计和JPA的简单使用。
		
前言 今天是第三篇了,上一篇简单模拟了数据,实现了LayIM页面的数据加载.那么今天呢就要用数据库的数据了.闲言少叙,书归正传,让我们开始吧. 数据库 之前有好多小伙伴问我数据库是怎么设计的.我个人用 ...
 - 从零一起学Spring Boot之LayIM项目长成记(二) LayIM初体验
		
前言 接上篇,已经完成了一个SpringBoot项目的基本搭建.那么现在就要考虑要做什么,怎么做的问题.所以本篇内容不多,带大家一起来简单了解一下要做的东西,之前有很多人不知道从哪里下手,那么今天我带 ...
 - 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot
		
项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...
 - Spring Boot 2.X(十四):日志功能 Logback
		
Logback 简介 Logback 是由 SLF4J 作者开发的新一代日志框架,用于替代 log4j. 主要特点是效率更高,架构设计够通用,适用于不同的环境. Logback 分为三个模块:logb ...
 - 10、Spring Boot 2.x 集成 Log4j2
		
1.10 Spring Boot 2.x 集成 Log4j2 完整源码: Spring-Boot-Demos
 - Spring Boot笔记四:日志框架介绍
		
我是一名程序员,我喜欢写System.out.println来打印一些重要的信息...后来我学了面向对象,我把这些输出语句整合到了一个工具类里面,可以打印,也可以保存日志. 我是一名积极思考的程序员, ...
 
随机推荐
- shell关闭指定进程
			
例如要关闭jupyter-notebook这个进程: ps -ef | grep jupyter-notebook | grep -v grep | cut -c 9-15 | xargs kill ...
 - ubuntu18 maven
			
user1@user1-ThinkPad-W540:~$ user1@user1-ThinkPad-W540:~$ sudo mkdir /opt/maven[sudo] password for u ...
 - depth wise CNN
			
depth wise cnn相对于传统的CNN,区别在于:它是逐通道做卷积操作! 例子如下: (1)使用传统卷积,输入:H*W*C_in,最终输出h*w*C_out:卷积核尺寸为K*K*C_in*C_ ...
 - Oracle Spatial分区应用研究之三:县市省不同分区粒度的效率比较
			
在<Oracle Spatial分区应用研究之一:分区与分表查询性能对比>中已经说明:按县分区+全局空间索引效率要优于按县分区+本地空间索引,因此在该实验报告中,将不再考虑按县分区+本地空 ...
 - 基于 appium 的 UI 自动化测试
			
其中主要的目录和文件为: /MPTestCases ----------- 存放测试用例 /errorScreenShot ------------ 用例执行失败生成的错误截图 startTest.p ...
 - 【RSR】RSR如何配置BGP与BFD联动(动态路由)
			
应用场景 企业租用运营商MSTP线路,配置BGP路由协议上网,由于企业本端出口路由器无法检测到运营商中间链路通信中断,导致路由收敛缓慢,无法快速的切换到其它备份线路,此时可以在路由器上启用BGP与BF ...
 - Java多线程-同步:synchronized 和线程通信:生产者消费者模式
			
大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...
 - Redis专栏
			
后端开发都应该掌握的Redis基础 Redis实用监控工具一览
 - bzoj 4500 矩阵 题解
			
题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ ...
 - 简单的python爬虫教程:批量爬取图片
			
python编程语言,可以说是新型语言,也是这两年来发展比较快的一种语言,而且不管是少儿还是成年人都可以学习这个新型编程语言,今天南京小码王python培训机构变为大家分享了一个python爬虫教程. ...