前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2014年智能电视一超多强局面将形成
在《乐观主义者眼中的2014年中国互联网22条趋势》中,关于智能电视我认为2014年智能电视将形成一超多强的局面。现在分析一下何谓一超多强,谁又最有机会成为这一个“超”。 乱战之后,一超多强 “一超多强”与“寡头格局”、“乱战格局”和“联合垄断”格局对应。 典型的寡头市场,如PC操作系统、中文搜索市场、PC安全市场、IM市场、PC电商即网络支付市场,均是一个巨无霸占据超过70%甚至更高的市场,形成7-2-1或者6-3-1的市场份额格局,一旦形成将十分稳固。 联合垄断则是几个寡头占据
罗超频道
2018/04/28
6730
智能电视的未来在哪儿
  最近一段时间,不少软件公司侵入硬件市场。从Google到戴尔,从阿里、360到早已登场的小米和乐视……一个新的蓝海正在浮现。如果说电脑早已日落西山,智能手机和平板刚过正午,那么,电视机旁边的争夺,则是八九点钟的太阳,充满朝气和想象。
阳光岛主
2019/02/19
1.4K0
智能电视的未来在哪儿
国内智能电视战场:国外玩家输给本地货
导读:Apple TV虎视眈眈,Chromcast已开始国际化进程,iTV呼之欲出,索尼等日韩厂商也准备大干一场,智能电视市场,国外玩家有戏吗?没戏!且看解读。 Apple中国官网短暂出现了Apple TV机顶盒,让人们对Apple TV进入中国市场更多了一分期待。众多果粉翘首以盼的iTV更是呼之欲出。 Google Chromecast 电视棒则走出美国,将从 3 月 1 日起正式在英国开卖。Chromecast 已经向所有开发者开放了 SDK,开发者可为其开发家庭互联网应用,开始全面商
罗超频道
2018/04/28
1.4K0
智能电视智而不能,谁来破局?
华数传媒从2月25日停牌至今,源于阿里巴巴将入股华数,或持有后者20%的股份。阿里抢占客厅的心情愈发急切。百度、腾讯、小米、360甚至苏宁在客厅领域都有所布局。智能电视想象空间太大, 谁也不敢怠慢。 智能电视的本质:家庭应用平台 智能电视意义不亚于智能手机。它正在重新塑造一个新的生态。在视听内容上会带来全新的体验;可加载第三方应用则赋予智能电视无穷的想象空间。 在乐视、小米、百度和阿里这几个互联网鲶鱼进入后,2013年智能电视突飞猛进。人们通过智能电视、盒子、影棒、机顶盒等多种方式享受更加
罗超频道
2018/04/28
1.3K0
2016年智能电视数据报告
“序言 o 传统电视似乎逐渐淡出我们的生活,沉寂已久的家电红海因为互联网智能电视的出现,开辟出了一个新战场。 o 智能电视相当于开放式的交互平台,搭载了操作系统,用户除了能收看正常电视节目外,也支持APP的安装与使用、网络浏览、智能操控等。 o 目前智能电视行业并不能像以前单纯地靠售卖硬件获取利润,而是将利润点延伸到内置的APP,内容应用服务去抢占市场的份额。 “报告背景 研究分析: 数据来源于 腾讯云分析(mta.qq.com)数据中心、应用市场等多方渠道,精确筛选重复数据。 网络公开资料。 在线约1
腾讯大数据
2018/01/26
1.4K0
互联网电视大考:挑战百万销量
在刚刚过去的2013年,雷军和贾跃亭均声称要用互联网来改变电视产业,他们画的饼迎来互联网从业者一片叫好声,贾跃亭和雷军昨天又在一个大会上获了奖。电视行业确实被互联网电视玩家所改变。 电视行业被放进几条鲶鱼 互联网电视引发的“鲶鱼效应”十分明显,传统电视行业均如临大敌。 有的开始鼓捣家庭互联网,如长虹;有的与互联网企业合作,如爱奇艺与TCL合作TV+;有的则加入智能电视产业联盟,如创维。 客厅开始变得热闹,盒子、影棒、路由器、App、视频客户端。媒体也开始热闹,除了连篇累牍的报
罗超频道
2018/04/28
6450
智能电视前传——盒子
导读:关于盒子究竟是不是半成品,其出现是否只是为未来一体化的智能电视铺路的争论,自 2007 年苹果推出 Apple TV 就已经开始了。巨头们目前正争相推出智能电视,苹果也有计划推大屏幕的 iTV,他们并非瞄准的电视本身,而是电视作为客厅的中心,可能也是整个智能家居的核心。毕竟,当智能电视价格比同等高清电视价格还低,同时它的扩展性够强,不仅能够提供高清画质,还能提供新型交互体验,为何不挑一台智能电视呢?
阳光岛主
2019/02/19
1.1K0
智能电视前传——盒子
从伪智能到真智能,家电智能化要闯几关?
2012年知乎上曾有一个问题曾引发过热议:“云电视、网络电视、智能电视,这些概念有什么区别?”当时我在答案中做了一个总结:“智能电视是一个很不错的概念,未来客厅看智能电视。”8年后我的答案被验证了,今天市面上所有电视全都是智能电视。
罗超频道
2020/03/11
5800
智能电视将进入4.0时代,内容版权共享化成为大势所趋
双11不只是交易额值得关注,细化到不同品类上我们还能看到市场趋势。作为每年双11重点品类的电视,每年都有不同的变化。今年的电视市场,与往年最大不同便是:智能电视成了电视的主流品类。几大主要参战电商平台的电视榜单上的单品,清一色具有智能化特征,表现尤为亮眼的是互联网电视品牌,比如苏宁易购O2O购物节上,PPTV智能电视在11天的促销期实现了产品销量同比增长221%的成绩;再比如天猫等平台上的电视榜单,同样是互联网电视独占鳌头。 可以说,中国电视行业已全面进入智能电视时代。 2017年智能电视大洗牌 智能
罗超频道
2018/04/25
7780
智能电视将进入4.0时代,内容版权共享化成为大势所趋
百度撞上小米,引爆互联网电视盒子
今天百度在五道口一家酒店发布了影棒3——准确地说,是一款电视盒子。不过,百度认为他们的产品既不是电视盒子也不是棒子,而是一个主打4K超清和客厅游戏的智能硬件。也就是说,它是独一无二的产品。 百度影棒3的主要卖点 1、支持4K超清视频。在乐视发布X50 Air超级电视高调进入4K市场之后,小米在它的发布会上推出了主打4K的小米盒子增强版。百度影棒3的亮点便是对4K视频的支持。雷科技在现场看到一些演示视频画面相当精细。 2、硬件配置大幅升级。CPU升级为Amlogic S802,主频2GHz;内存升级到2
罗超频道
2018/04/25
9060
百度撞上小米,引爆互联网电视盒子
盒子的未来:客厅不死,互联网永生
家里的乐视盒子和有线机顶盒的点播套餐纷纷到期,朋友送的百度影棒才刚用没几天,今天百度又发布影棒2了。在外观设计、硬件配置和视频内容支持等方面均有所提升,会在光棍节在天猫开放预售,售价228元。由于距离影棒一代发布间隔两个月,时间较短,百度面向一代影棒用户特推出了178元的特惠价,希望用户能用更便宜的价格购得最新的产品。影棒2一点不像棒子,而是一个盒子的形状,这或许意味着百度正式进入盒子市场了。 在我印象中将家庭娱乐中心的概念普及的,还得归功于国外两大科技巨头Apple和Google。Appl
罗超频道
2018/04/27
8400
盒子的未来:客厅不死,互联网永生
TCL的“互联网+”方法论,是否可复制?
记得两年前,电视厂商最喜欢将网络电视、智能电视或者互联网电视这些当做噱头,搞得用户云里雾里。已经被训练得非常清醒的用户开始回归理性:只为自己需要的东西买单。或许正是看到这样的用户觉醒意识,TCL在20
罗超频道
2018/04/28
7270
TCL的“互联网+”方法论,是否可复制?
智能电视的未来:让所有人平等获取信息
我眼中的智能电视应该怎样? 智能电视回归电视本身 首先它应该是一台能满足观看直播节目的电视,然后才是扩展丰富的家庭应用和获取互联网内容。它有不同的形式,独立电视机、互联网电视盒子、智能机顶盒、影棒,甚至将来出现一机多屏的产品,让你可以在客厅、厨房、浴室和卧室共享一台电视。 智能电视是内容显示屏幕,然后才是应用获取设备,最后它才是一台计算机,它有机会成为智能家居的计算和存储中心,但它更应该是家庭公共的娱乐和信息消费中心。 就跟安卓、iOS生态一样,智能电视能完成什么任务由开发者
罗超频道
2018/04/28
8730
为什么选择智能电视?
近年来,彩电业开始从规模竞争转向结构竞争,并向生态系统竞争转变。为什么会如此?凡需要获取信息显示的地方,都有视像显示屏存在,伴随者屏幕技术、应用操作系统、应用兼容及创新等发展,电视开始迈向了进化为智能电视的道路。
火爆的小茶壶
2022/07/27
7450
为什么选择智能电视?
响铃:从TCL、阿里、腾讯的合作,看传统厂商与互联网企业的压力与焦急
如果说几年前小米乐视之间的互撕是互联网电视大战的“第一阶段”,那TCL在前不久推出定位年轻人市场的互联网电视品牌“雷鸟”,并作为子公司独立运营应该算是互联网电视大战的“终结者”,从此国内电视行业再无传统电视厂商、互联网电视厂商之分,全体进入智能电视时代。
曾响铃
2018/08/20
5740
响铃:从TCL、阿里、腾讯的合作,看传统厂商与互联网企业的压力与焦急
乐视下沉,传统电视还有得玩吗?
乐视昨天发布超级电视S40 Air和S50Air,最大的亮点是价格:两款电视分别定价999元+980(两年服务费)和1999+980(两年服务费),这一次乐视超级电视选择QQ空间首发,意图明显:三四线城市及低端市场。一位电视行业资深从业者在知道这个数字后,直接说如果乐视产能跟得上,TCL、创维们没得玩了。事实真是如此吗?雷科技的结论是:传统电视厂商们如果再不改变自己,恐怕真没得玩了。 传统电视厂商对互联网电视的不屑 相关数据显示,2013年电视出货量高达4781万台,智能电视约为2600万台,这2600万台
罗超频道
2018/04/25
7330
智能家居,中国巨头这一次能否逆袭?
智能手机中国企业未能真正翻身,纵使联想真如它所追求的那样做到智能手机出货量的第一,但Google和Apple凭着对操作系统的掌控进而拥有顶端话语权是不争的事实。智能家居这一场竞赛却给中国的科技巨头带来转机。 良好的本土基础 以智能电视为例,在功能电视时代中国本土厂商创维,TCL,长虹等本土品牌便有着不俗的表现,而智能电视大潮来临时,在乐视和小米等互联网玩家入侵后,传统家电厂商反弹,在智能电视上争先恐后。智能电视并不需要一套新的操作系统,基于安卓的改装门槛并不高。同时,它对内容的依赖又帮助国产品牌建立了壁垒
罗超频道
2018/04/25
8730
OTT TV IPTV网络电视为何能如此快速的占领市场?
OTT TV是“Over The Top TV”的缩写,是指基于开放互联网的视频服务,终端可以是电视机、电脑、机顶盒、PAD、智能手机等等。为满足消费者的需求,集成互动电视功能的全功能的互联网电视。,
点量小崔
2018/07/23
7690
OTT TV  IPTV网络电视为何能如此快速的占领市场?
智能电视赛道,如何一马当先?
如今,随着移动设备、互联网技术的发展,电视似乎逐渐淡出人们的视野。近期,与电视相关的热门讨论似乎都是对于各大视频平台的会员投屏制度,这似乎更加减少了大众对于电视的使用欲望。那么电视领域是否真的趋于淘汰了呢?并非如此,
Lydiasq
2023/01/16
3950
智能电视赛道,如何一马当先?
TCL TV+量子点电视H9700会成爆款吗?
2014年智能电视产业因为政策影响,被拖慢了脚步。不过这并未妨碍两大智能电视的火爆:一个是TCL TV+,一个是乐视系列电视,只有这两家的出货量进入了100万台俱乐部。TCL TV+的核心优势有两个,一个是老牌电视厂商TCL的硬件底子,另一个则是TV+的内容合作方爱奇艺的内容优势。年底TCL再放大招:发布量子点电视H9700,看形势是要将之作为2015年的旗舰产品来推。 H9700:量子屏成最大卖点,业界最优视觉体验 TV+系列电视过去的卖点是智能、是互联网内容,到了H9700则回归“看电视”本身,“中国首
罗超频道
2018/04/28
7620
TCL TV+量子点电视H9700会成爆款吗?
推荐阅读
相关推荐
2014年智能电视一超多强局面将形成
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文