前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >动态设置 log4j2 日志的级别不能落

动态设置 log4j2 日志的级别不能落

作者头像
BUG弄潮儿
发布于 2021-05-17 07:40:49
发布于 2021-05-17 07:40:49
1.9K00
代码可运行
举报
文章被收录于专栏:JAVA乐园JAVA乐园
运行总次数:0
代码可运行

上篇[ SpringBoot 动态设置 logback 日志的级别 ] 说了 logback 动态设置日志级别。这篇来说下 log4j2 日志框架结合 SpringBoot 动态设置日志级别。因为 log4j2 日志框架也有非常多的公司采用,毕竟 logback 和 log4j2 是现在用的最多的两个日志框架。都不能落对吧。

0x01:pom.xml 引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.olive</groupId>
    <artifactId>valid-log4j2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath /> 
    </parent>
    <name>valid-demo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-web</artifactId>  
            <exclusions><!-- 去掉springboot默认配置 -->  
                <exclusion>  
                    <groupId>org.springframework.boot</groupId>  
                    <artifactId>spring-boot-starter-logging</artifactId>  
                </exclusion>  
            </exclusions>  
        </dependency> 

        <dependency> <!-- 引入log4j2依赖 -->  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-log4j2</artifactId>  
        </dependency> 
    </dependencies>
</project>

因为 SpringBoot 默认使用 logback 记录日志。所以要排查 logback 日志框架 spring-boot-starter-logging,在引入 log4j2 日志框架 spring-boot-starter-log4j2。

0x02:Controller 控制器编写

Controller 基本框架

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.olive.controller;

import java.util.HashMap;
import java.util.Map;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.impl.StaticLoggerBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class LoggerController {

    private final static  Logger logger = LoggerFactory.getLogger(LoggerController.class);

    // TODO 
}
  • 打印各级别日志
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping("/logger/print")
public Map loggerPrint(){
    Map result = new HashMap();
    result.put("code", 200);
    result.put("msg", "success");

    logger.debug("loggerPrint debug>>>>");
    logger.info("loggerPrint info>>>>");
    logger.warn("loggerPrint warn>>>>");
    logger.error("loggerPrint error>>>>");

    return result;
}
  • 打印所有日志对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping("/logger/printAllLogger")
public Map printAllLogger(){
    Map result = new HashMap();
    result.put("code", 200);
    result.put("msg", "success");

    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);

    Configuration config = ctx.getConfiguration();
    Map<String, LoggerConfig> loggerConfigs = config.getLoggers();
    System.out.println("printAllLogger begin>>>>>>>>");
    loggerConfigs.forEach((name, loggerConfig) -> {
        System.out.println("name = " + name);
       System.out.println("loggerConfig = " + loggerConfig);
    });
    System.out.println("printAllLogger end>>>>>>>>");
    return result;
}
  • 动态设置日志对象的日志级别
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping("/logger/level")
public Map loggerLevelChange(String level){
    Map result = new HashMap();
    result.put("code", 200);
    result.put("msg", "success");

    String loggerFactoryClassStr = StaticLoggerBinder.getSingleton().getLoggerFactoryClassStr();
    System.out.println("loggerFactoryClassStr>>>>" + loggerFactoryClassStr);    
    LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
    Configuration config = ctx.getConfiguration();
    LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);

    switch (level) {
    case "debug":
        loggerConfig.setLevel(Level.DEBUG);
        break;
    case "info":
        loggerConfig.setLevel(Level.INFO);
        break;
    case "warn":
        loggerConfig.setLevel(Level.WARN);
        break;
    case "error":
        loggerConfig.setLevel(Level.ERROR);
        break;
    default:
        break;
    }
    ctx.updateLoggers();
    return result;
}

0x04:log4j2-spring.xml 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
  <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

  <!--变量配置-->
  <Properties>
    <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
    <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
    <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
  </Properties>

  <appenders>
    <console name="ConsoleOut" target="SYSTEM_OUT">
      <!--输出日志的格式-->
      <PatternLayout pattern="${LOG_PATTERN}"/>
      <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
   <!--    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> -->
    </console>
  </appenders>

  <loggers>
    <root level="debug">
      <appender-ref ref="ConsoleOut"/>
    </root>
  </loggers>

</configuration>

这里只配置了打印到控制台的 ROOT logger。

0x05:编写引导类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
public class Application 
{
    public static void main( String[] args )
    {
        SpringApplication.run(Application.class, args);
    }
}

启动服务

  • 打印各级别日志

因为 log4j2-spring.xml 配置的级别是 debug,所以可以在控制台看到如下打印

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
21:08:52.298 [http-nio-8080-exec-1] DEBUG com.olive.controller.LoggerController - loggerPrint debug>>>>
21:08:52.298 [http-nio-8080-exec-1] INFO  com.olive.controller.LoggerController - loggerPrint info>>>>
21:08:52.298 [http-nio-8080-exec-1] WARN  com.olive.controller.LoggerController - loggerPrint warn>>>>
21:08:52.298 [http-nio-8080-exec-1] ERROR com.olive.controller.LoggerController - loggerPrint error>>>>
  • 打印所有日志对象

在控制台只看见打印了 ROOT logger 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printAllLogger begin>>>>>>>>
name = 
loggerConfig = root
printAllLogger end>>>>>>>>
  • 动态修改日志的级别

再次调用 http://127.0.0.1:8080/logger/print 接口打印日志,在控制台看到不在打印 debug 级别日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
21:19:25.756 [http-nio-8080-exec-6] INFO  com.olive.controller.LoggerController - loggerPrint info>>>>
21:19:25.756 [http-nio-8080-exec-6] WARN  com.olive.controller.LoggerController - loggerPrint warn>>>>
21:19:25.756 [http-nio-8080-exec-6] ERROR com.olive.controller.LoggerController - loggerPrint error>>>>
  • 修改 log4j2-spring.xml 配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <loggers>
    <root level="debug">
      <appender-ref ref="Console"/>
    </root>

     <logger name="org.springframework" level="info" additivity="true">
     </logger>

     <logger name="org.hibernate" level="warn" additivity="true">
     </logger>
  </loggers>

重启服务,再次调用 http://127.0.0.1:8080/logger/printAllLogger 接口打印日志对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printAllLogger begin>>>>>>>>
name = 
loggerConfig = root
name = org.springframework
loggerConfig = org.springframework
name = org.hibernate
loggerConfig = org.hibernate
printAllLogger end>>>>>>>>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot 动态设置 logback 日志的级别
SpringBoot 默认采用 Logback 日志作为记录日志的框架。在项目中,一般分为 dev 环境(开发环境)、test环境(测试环境)和 prd 环境(生产环境)。而一般开发环境和测试环境可以把日志级别设置成 info 级别,方便在联调与测试中解决遇到的bug,但是生产环境因为存在大量的业务,如果采用 info 级别的日志, 那么每一笔交易或者业务都打印大量的日志。这样的花需要大量的磁盘空间来保存日志。如果日志需要保存一年半载,或者有些业务场景,例如财务数据的日志需要保存更久。将给公司造成很大的财务浪费。今天分享一个小方案,动态改变日志的级别,方便在生产环境也能方便快捷的从 warn 或者 error 级别切换到 debug 或者 info 级别。
BUG弄潮儿
2021/05/17
1.4K0
SpringBoot 动态设置 logback 日志的级别
spring引入log4j2日志框架
Log4j2是Apache的一个开源项目,通过使用Log4j2,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
逍遥壮士
2020/09/18
1.7K0
spring引入log4j2日志框架
Springboot整合log4j2(按级别拆分)
创建log4j2.xml文件,放在工程resources目录里。这样就可以不加任何配置。如果你需要指定配置文件需要在Spring boot 配置文件application.yml中指定 logging.config 属性。
鱼找水需要时间
2023/02/16
6690
Springboot整合log4j2(按级别拆分)
Java日志体系(log4j2)
1 log4j2 1.1 简介 log4j2,一个日志的实现框架,是log4j的升级版本,于2014年7月正式亮相。与第一代log4j不同,log4j2完全重写了log4j的日志实现,并不是在原有基础
贾博岩
2018/05/11
2.9K0
Spring Boot 2 集成log4j2日志框架
Log4j2是 Log4j 的进化版本,并提供了许多 Logback 可用的改进,同时解决了 Logback 体系结构中的一些固有问题。而且日志处理中我们会用到kafka作为日志管道。而kafka客户端依赖与Logback的兼容不是很完美,你可以选择排除依赖冲突或者使用Log4j2 。
码农小胖哥
2019/12/05
7660
springboot06、log4j2日志配置
springboot06、log4j2日志配置 目录 前言: 1、pom配置 2、log4j2-spring.xml配置文件 3、在application.properties中引入log4j2的配置 4、log4j使用 ---- 前言: 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback)。 接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包
红目香薰
2022/11/30
3650
springboot06、log4j2日志配置
快速了解常用日志技术(JCL、Slf4j、JUL、Log4j、Logback、Log4j2)
JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。
ha_lydms
2023/08/09
1.3K0
快速了解常用日志技术(JCL、Slf4j、JUL、Log4j、Logback、Log4j2)
Springboot 整合 log4j2 日志详解
在项目推进中,如果说第一件事是搭 Spring 框架的话,那么第二件事情就是在 Sring 基础上搭建日志框架,我想很多人都知道日志对于一个项目的重要性,尤其是线上 Web 项目,因为日志可能是我们了解应用如何执行的唯一方式。
JavaFish
2020/01/02
1.2K0
Springboot整合log4j2日志全解
上述介绍的是一些日志框架的实现,这里我们需要用日志门面来解决系统与日志实现框架的耦合性。SLF4J,即简单日志门面(Simple Logging Facade for Java),它不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志实现。
用户1212940
2020/07/10
5.6K0
Springboot整合log4j2日志全解
Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL
注意:本次主要演示如何在 Spring-Boot 项目中配置 Log4j2 以及 Logback 输出日志到 ELK 中,并能够在 Kibana 中可以正确检索出来,Elasticsearch 及 Spring-Boot 项目底层需要 Java 环境,所以需要提前本地安装好 Java 环境,这里忽略 Java 安装过程。
哎_小羊
2019/05/25
3.5K0
​可观测性之Log4j2优雅日志打印
对于Log4j2大家应该都不是很陌生,听说最多的应该是2021年年底出现的安全漏洞了,不过最让大家头痛的应该不仅仅是这个安全漏洞的处理,安全漏洞通过升级最新的依赖版本即可快速解决,平时在使用过程中遇到过比较多的问题应该就是日志jar包不知道如何选择?日志jar冲突引起的日志不打印问题,日志配置太过复杂不知道如何配置只能百度CV粘贴一个配置。这些日志配置其实并不复杂,主要是因为日志组件的发展历史比较充满曲折,导致了很多地方不兼容。接下来就来通过日志组件的发展历史来入手,看看Log4j2是从什么背景下产生的。
宋小生
2023/01/06
1.3K0
​可观测性之Log4j2优雅日志打印
Springboot 2.x 使用 Log4j2 异步打印日志
目前常用的 Java 日志框架有 Log4j、Logback、Log4j2 ,性能方面推荐使用异步的 Log4j2,具体对比不多做分析,前人早已完成耕荒,我们就站在巨人的肩膀上来看看如何实操。
charmsongo
2020/12/31
2.3K0
Springboot 2.x 使用 Log4j2 异步打印日志
Apache Log4j2详解
在项目开发中,都不可避免的使用到日志。没有日志虽然不会影响项目的正确运行,但是没有日志的项目可以说是Java
Java架构师必看
2021/07/15
1.2K0
【Log4j2】Spring 整合 Log4j2 日志框架
.29.
2023/10/17
2400
【Log4j2】Spring 整合 Log4j2 日志框架
带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
使用过Log4J和LogBack的同学肯定能发现,这两个框架的设计理念极为相似,使用方法也如出一辙。其实这个两个框架的作者都是一个人,Ceki Gülcü,俄罗斯程序员。
码老思
2023/10/19
3.7K0
带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J
排查log4j不输出日志到文件的问题
但是在项目代码中输出的日志信息始终不输出到文件中,只在控制台输出。 一开始我以为是log4j的配置问题:只输出到控制台,不输出到文件,但是反复确认配置没问题。
编程随笔
2022/04/29
3.4K0
Spring Boot logback日志配置
Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。
技术从心
2019/09/05
1.2K0
日志级别动态调整——小工具解决大问题
背景 随着外卖业务的快速发展,业务复杂度不断增加,线上系统环境有任何细小波动,对整个外卖业务都可能产生巨大的影响,甚至形成灾难性的雪崩效应,造成巨大的经济损失。每一次客诉、系统抖动等都是对技术人员的重大考验,我们必须立即响应,快速解决问题。 如何提高排查问题的效率呢?最有效的方式是通过分析系统日志。如果系统日志全面,会为我们排查解决线上问题带来绝大的帮助,但是要想保证系统日志全面,就必须打印出所有的系统或业务日志。这样就会带来另一个问题,那就是日志量的暴涨,过多的日志除了能够帮助我们解决问题外,同时会直接造
美团技术团队
2018/03/12
2.5K1
日志级别动态调整——小工具解决大问题
springboot 整合log4j2 记录
很少写博客;看了很多网上的教程,自己也试过了很多,有些问题也记录下来了希望能帮到其他朋友。
用针戳左手中指指头
2021/01/29
8420
springboot 整合log4j2 记录
Log4j1升级Log4j2实战
新的Log4j 2.0版本有了大幅的性能提升、新的插件系统,以及配置设置方面的很多改善。Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback ——官方测试结果。
高广超
2018/12/12
3.1K0
相关推荐
SpringBoot 动态设置 logback 日志的级别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验