Logback动态修改日志级别的方法

问题提出:

一般在生产环境上,日志的级别是INFO以上,但有时候程序出现问题(如SQL报错),少量日志不能尽快定位问题,这时候可以动态修改日志级别到DEBUG,打印更多日志后可以快速定位到问题。

解决方法:

定义动态修改日志级别的接口:这种方法的好处是不用修改配置文件,排错后再次调用接口把日志级别修改回去;坏处是需要在代码中写死指定哪些包要修改日志级别。示例代码如下:

@RestController
public class LogController {
  private static Logger logger = LoggerFactory.getLogger(LogController.class);

  @RequestMapping(value = "logLevel/{logLevel}")
  public String changeLogLevel(@PathVariable("logLevel") String logLevel) {

    try {
      LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
      loggerContext.getLogger("org.mybatis").setLevel(Level.valueOf(logLevel));
      loggerContext.getLogger("org.springframework").setLevel(Level.valueOf(logLevel));
    } catch (Exception e) {
      logger.error("动态修改日志级别出错", e);
      return "fail";
    }

    return "success";
  }
}

修改logback.xml配置文件:在configuration根节点配置属性scan和scanPeriod,scan为true时,配置文件被修改会被重新加载,scanPeriod定义了扫描文件变化的周期,默认6000毫秒,即一分钟。这种做法的好处是不用自己写修改日志级别的逻辑;坏处是要手动更改配置文件,排错完成后需改回原来的配置。示例配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="6000">
  <property name="LOG_HOME" value="/export/logs/cmdb/" />
  <property name="APP_NAME" value="cmdb" />
  <property name="LOG_FILE_EXPIRE_TIME" value="180" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | ${APP_NAME} - %p | %thread | %c | line:%L - %m%n</pattern>
    </encoder>
  </appender>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${LOG_HOME}${APP_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>${LOG_FILE_EXPIRE_TIME}</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | ${APP_NAME} - %p | %thread | %c | line:%L - %m%n</pattern>
    </encoder>
  </appender>

  <root>
    <level value="INFO" />
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Spring Boot 使用slf4j+logback记录日志配置

    在学校的时候使用Java进行开发,工作之后由于项目组采用.net进行开发就转到.net了.最近开始学习Java,对一些新东西进行学习.开始看SpringBoot,对遇到的问题进行记录. 学习新的东西最好从例子开始,只看文档太枯燥,但是文档还是必须要看的. spring boot主要的目的是: 为 Spring 的开发提供了更快更广泛的快速上手 使用默认方式实现快速开发 提供大多数项目所需的非功能特性,诸如:嵌入式服务器.安全.心跳检查.外部配置等 SLF4J是为各种loging APIs提供一个

  • 基于Spring Boot的Logback日志轮转配置详解

    在生产环境下,日志是最好的问题调试和跟踪方法,因此日志的地位是十分重要的.我们平时经常使用的log4j,slf4j,logback等等,他们的配置上大同小异.这里就结合Spring Boot配置一下Logback的日志. 默认最简单的配置 默认情况下,如果对日志没有特殊处理,可以直接基于application.properties进行配置. 常用的参数有: logging.level 配置日志的级别 logging.file logging.path 这两个参数只能配置一个生效,一个是文件(可以

  • 详解Spring Boot下使用logback 记录多个文件日志

    背景 这两天遇到一个比较有意思的日志问题. 近期对我之前的python代码进行java的重构, 一方面是因为java使用的医疗库非常健全稳定, 可以商用. 另一方面是因为java速度快, 这个库的实现的效率也高, 性能是Python版本的好几倍. 但是作为这个项目的唯一作者, 我的癖好也成为这个项目的风格. 这个项目会给很多部署工程师使用. 当然项目的可用性和性能作为第一考虑的因素, 但是作为一个懒人, 对使用软件时候的复杂部署过程和混乱调试信息深恶痛绝. 所以我在项目中使用了高度可配置/易用和

  • 详解Spring Boot配置使用Logback进行日志记录的实战

    spring Boot实战之配置使用Logback进行日志记录 ,分享给大家 在这篇文章中我们将讨论在Spring Boot中使用Logback,在Spring Boot中使用Logback很简单 1.为了测试我们新建两个类 package com.xiaofangtech.sunt.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.an

  • Spring Boot 使用 logback、logstash、ELK 记录日志文件的方法

    Spring Boot 下,尝试使用 log4j 记录日志到 logstash,在src/main/resources 目录下添加 log4j.properties 文件进行自定义输出日志文件,未能成功.在 application.yml 中 配置 logging path 打印日志成功了,但是未能调试成功日志分文件记录.网上查阅资料,说是 Spring Boot 默认使用 logback 记录日志.log4j 多次尝试后无果,遂改为使用 logback 记录,最终测试成功. 1. 关于 Spr

  • Spring如何动态自定义logback日志目录详解

    问题场景 一般情况下,日志打印的内容都是根据配置文件中配置的pattern格式指定好的.在我们调用logger.info(), logger.debug()等日志打印方法时,打印的内容格式与配置文件中的pattern格式一致. 例如,在logback.xml配置文件中指定了日志打印格式: %d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}-%L] %msg%n". 这些格式的意义在官网的文档上都有说明.其中%msg就是我们调用日志打印方法时输入的内容.

  • 在SpringBoot中使用Logback管理记录日志

    SpringBoot的默认日志配置 SpringBoot 开箱即用,默认帮你配置了日志框架,使用 Commons Logging ,但是默认配置也提供了对常用日志的支持,如: Java Util Logging , Log4J , Log4J2 和 Logback.每种Logger都可以通过配置使用控制台或者文件输出日志内容. 控制台输出 关于log日志,首先说说的5个日志级别 LEVEL: 从高到低分别是 ERROR . WARN . INFO . DEBUG . TRACE 低级别的会输出高

  • spring boot使用logback实现多环境日志配置详解

    软件生存周期中,涉及代码运行的环节有编码.测试和维护阶段,而一套成熟的代码,在此三个阶段,数据库.日志路径.日志级别.线程池大小等配置一般会不一样.作为开发人员,希望将代码与配置解耦合,不同的环境,代码一套,而配置多套. 针对于多环境的配置,可以使用maven的profile及filter配置,在打包环节通过打包命令 mvn clean package -P dev/test/product决定所打环境的war/jar包.此种解决方案,产生的war\jar包在不同环境的是不同的,因此MD5校验和

  • 如何修改覆盖spring boot默认日志策略logback详解

    背景 Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback.每种Logger都可以通过配置使用控制台或者文件输出日志内容. 默认日志Logback SLF4J--Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象.Java日志框架众多--常用的有java.util.logging, log

  • SpringBoot中logback日志保存到mongoDB的方法

    Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计. 自定义Appender非常简单,继承一下AppenderBase类即可. 可以看到有个AppenderBase,有个UnsynchronizedAppenderBase,还有个AsyncAppenderBase继承了UnsynchronizedAppenderBase.从名字就能看出来区别,异步的.普通的.不加锁的. 我们定义一个MongoDBAppend

随机推荐