设置springboot日志级别_Spring Boot 日志框架实践

概述

Java应用中,日志一般分为以下5个级别:

  • ERROR 错误信息
  • WARN 警告信息
  • INFO 一般信息
  • DEBUG 调试信息
  • TRACE 跟踪信息

Spring Boot使用Apache的Commons Logging作为内部的日志框架,其仅仅是一个日志接口,在实际应用中需要为该接口来指定相应的日志实现。

Spring Boot默认的日志实现是Java Util Logging,是JDK自带的日志包,此外Spring Boot当然也支持Log4J、Logback这类很流行的日志实现。

统一将上面这些日志实现统称为日志框架

下面我们来实践一下!


使用Spring Boot Logging插件

  • 首先application.properties文件中加配置:

logging.level.root=INFO

  • 控制器部分代码如下:
com.hansonwang99.controller;
import
com.hansonwang99.K8sresctrlApplication;
import
org.slf4j.
Logger
;
import
org.slf4j.
LoggerFactory
;
import
org.springframework.web.bind.annotation.
GetMapping
;
import
org.springframework.web.bind.annotation.
RequestMapping
;
import
org.springframework.web.bind.annotation.
RestController
;
@RestController
@RequestMapping
(
"/testlogging"
)
public
class
LoggingTestController
{
private
static
Logger
logger =
LoggerFactory
.getLogger(K8sresctrlApplication.
class
);
@GetMapping
(
"/hello"
)
public
String
hello() {http://logger.info(
"test logging..."
);
return
"hello"
;
}
}
  • 运行结果

4f70749414c99a4d9759e8cbc5f7a24e.png

由于将日志等级设置为INFO,因此包含INFO及以上级别的日志信息都会打印出来

这里可以看出,很多大部分的INFO日志均来自于SpringBt框架本身,如果我们想屏蔽它们,可以将日志级别统一先全部设置为ERROR,这样框架自身的INFO信息不会被打印。然后再将应用中特定的包设置为DEBUG级别的日志,这样就可以只看到所关心的包中的DEBUG及以上级别的日志了。

  • 控制特定包的日志级别

application.yml中改配置

logging:level:root: errorcom.hansonwang99.controller: debug

很明显,将root日志级别设置为ERROR,然后再将 com.hansonwang99.controller包的日志级别设为DEBUG,此即:即先禁止所有再允许个别的 设置方法

  • 控制器代码
packagecom.hansonwang99.controller;
importorg.slf4j.
Logger
;
importorg.slf4j.
LoggerFactory
;
importorg.springframework.web.bind.annotation.
GetMapping
;
importorg.springframework.web.bind.annotation.
RequestMapping
;
importorg.springframework.web.bind.annotation.
RestController
;
@RestController
@RequestMapping
(
"/testlogging"
)
publicclassLoggingTestController{privateLoggerlogger = 
LoggerFactory
.getLogger(
this
.getClass());@GetMapping
(
"/hello"
)publicStringhello() {logger.info(
"test logging..."
);return"hello"
;}
}
  • 运行结果

2e6764e80867d25f5c978dd8692311c9.png

可见框架自身的INFO级别日志全部藏匿,而指定包中的日志按级别顺利地打印出来

  • 将日志输出到某个文件中
logging:level:root: errorcom.hansonwang99.controller: debugfile: ${user.home}/logs/hello.log
  • 运行结果

cc5c71ac82b62a14666ccbdfbd512e4a.png

855ec5492585d3ae1ede848110db9bb1.png

使用Spring Boot Logging,我们发现虽然日志已输出到文件中,但控制台中依然会打印一份,发现用 org.slf4j.Logger是无法解决这个问题的

dbf84d67a78c337e5231dde740b53bb5.png

集成Log4J日志框架

  • pom.xml中添加依赖
<dependency><groupId>
org.springframework.boot
</groupId><artifactId>
spring-boot-starter-web
</artifactId><exclusions><exclusion><groupId>
org.springframework.boot
</groupId><artifactId>
spring-boot-starter-logging
</artifactId></exclusion></exclusions></dependency><dependency><groupId>
org.springframework.boot
</groupId><artifactId>
spring-boot-starter-log4j2
</artifactId></dependency>
  • 在resources目录下添加 log4j2.xml文件,内容如下:
<?xml version=
"1.0"encoding=
"UTF-8"
?>
<configuration><appenders><Filename
=
"file"fileName
=
"${sys:user.home}/logs/hello2.log"
><PatternLayoutpattern
=
"%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"
/></File></appenders><loggers><rootlevel
=
"ERROR"
><appender-refref
=
"file"
/></root><loggername
=
"com.hansonwang99.controller"level
=
"DEBUG"/></loggers>
</configuration>
  • 其他代码都保持不变

运行程序发现控制台没有日志输出,而hello2.log文件中有内容,这符合我们的预期:

030abe3551eb2772bf1bbed061c55fbd.png

ea0dd8ed31fadd885018d8a07e5d61c1.png

b9c5f55fb75b07278bdc717badd65dee.png

而且日志格式和 pattern="%d{HH:mm:ss,SSS} %p %c (%L) - %m%n"格式中定义的相匹配


Log4J更进一步实践

  • pom.xml配置:
<dependency><groupId>
org.springframework.boot
</groupId><artifactId>
spring-boot-starter-web
</artifactId><exclusions><exclusion><groupId>
org.springframework.boot
</groupId><artifactId>
spring-boot-starter-logging
</artifactId></exclusion></exclusions></dependency><dependency><groupId>
org.springframework.boot
</groupId><artifactId>
spring-boot-starter-log4j2
</artifactId></dependency>
  • log4j2.xml配置
<?xml version=
"1.0"encoding=
"UTF-8"
?>
<configurationstatus
=
"warn"
><properties><Propertyname
=
"app_name"
>
springboot-web
</Property><Propertyname
=
"log_path"
>
logs/${app_name}
</Property></properties><appenders><consolename
=
"Console"target
=
"SYSTEM_OUT"
><PatternLayoutpattern
=
"[%d][%t][%p][%l] %m%n"/></console><RollingFilename
=
"RollingFileInfo"fileName
=
"${log_path}/info.log"filePattern
=
"${log_path}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz"
><Filters><ThresholdFilterlevel
=
"INFO"/><ThresholdFilterlevel
=
"WARN"onMatch
=
"
DENY
"onMismatch
=
"
NEUTRAL
"/></Filters><PatternLayoutpattern
=
"[%d][%t][%p][%c:%L] %m%n"/><Policies><!-- 归档每天的文件 --><TimeBasedTriggeringPolicyinterval
=
"1"modulate
=
"true"/><!-- 限制单个文件大小 --><SizeBasedTriggeringPolicysize
=
"2 MB"/></Policies><!-- 限制每天文件个数 --><DefaultRolloverStrategycompressionLevel
=
"0"max
=
"10"
/></RollingFile><RollingFilename
=
"RollingFileWarn"fileName
=
"${log_path}/warn.log"filePattern
=
"${log_path}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz"
><Filters><ThresholdFilterlevel
=
"WARN"/><ThresholdFilterlevel
=
"ERROR"onMatch
=
"
DENY
"onMismatch
=
"
NEUTRAL
"/></Filters><PatternLayoutpattern
=
"[%d][%t][%p][%c:%L] %m%n"/><Policies><!-- 归档每天的文件 --><TimeBasedTriggeringPolicyinterval
=
"1"modulate
=
"true"/><!-- 限制单个文件大小 --><SizeBasedTriggeringPolicysize
=
"2 MB"/></Policies><!-- 限制每天文件个数 --><DefaultRolloverStrategycompressionLevel
=
"0"max
=
"10"
/></RollingFile><RollingFilename
=
"RollingFileError"fileName
=
"${log_path}/error.log"filePattern
=
"${log_path}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz"
><ThresholdFilterlevel
=
"ERROR"/><PatternLayoutpattern
=
"[%d][%t][%p][%c:%L] %m%n"/><Policies><!-- 归档每天的文件 --><TimeBasedTriggeringPolicyinterval
=
"1"modulate
=
"true"/><!-- 限制单个文件大小 --><SizeBasedTriggeringPolicysize
=
"2 MB"/></Policies><!-- 限制每天文件个数 --><DefaultRolloverStrategycompressionLevel
=
"0"max
=
"10"
/></RollingFile></appenders><loggers><rootlevel
=
"info"
><appender-refref
=
"Console"/><appender-refref
=
"RollingFileInfo"/><appender-refref
=
"RollingFileWarn"/><appender-refref
=
"RollingFileError"/></root></loggers>
</configuration>
  • 控制器代码:
packagecom.hansonwang99.controller;
importorg.apache.logging.log4j.
LogManager
;
importorg.apache.logging.log4j.
Logger
;
importorg.springframework.web.bind.annotation.
GetMapping
;
importorg.springframework.web.bind.annotation.
RequestMapping
;
importorg.springframework.web.bind.annotation.
RestController
;
@RestController
@RequestMapping
(
"/testlogging"
)
publicclassLoggingTestController{privatefinalLoggerlogger = 
LogManager
.getLogger(
this
.getClass());@GetMapping
(
"/hello"
)publicStringhello() {for
(
inti=
0
;i<
10
_0000;i++){logger.info(
"info execute index method"
);logger.warn(
"warn execute index method"
);logger.error(
"error execute index method"
);}return"My First SpringBoot Application"
;}
}
  • 运行结果

d289a72f0514d42b003193422ba26011.png

33bf83c2412ac610b28903b33116763a.png

aa2dce0a7823951a61eea65ba96c5fa6.png

日志会根据不同的级别存储在不同的文件,当日志文件大小超过2M以后会分多个文件压缩存储,生产环境的日志文件大小建议调整为20-50MB。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单的类来测量延迟

这是我编写的用于测量延迟的非常简单的类。 HDRHistogram并不是劳斯莱斯解决方案&#xff0c;但是如果您只想向项目添加一个类&#xff0c;则可以很好地解决问题。 这是一个简单的测试程序&#xff0c;向您展示其用法&#xff1a; package util;public class LatencyMeasureE…

计算机加分乘法套用,8+8+8+8+8写成乘法算式要怎样写?小学数学为何这么死板?...

88888写成乘法算式只能写8x5不能写5x8吗&#xff1f;小学数学为何这么死板&#xff1f;这个题目来自于某小学的期考试卷&#xff0c;是个填空题&#xff0c;88888写成乘法算式时给了两个空( )和( )&#xff0c;就有人提出来只能写8x5不能写5x8&#xff0c;所以应该只给一个空。…

债券价格和通胀率

一般规律&#xff0c;通胀率于债券收益率正相关。 当通胀率较高时&#xff0c;市场会降低对债券的需求&#xff08;固定息票&#xff09; 》 导致债券价格下跌&#xff0c;收益率上升。转载于:https://www.cnblogs.com/xispace/p/3383357.html

净值:测试编码器/解码器

我最近与Netty进行了一些合作&#xff0c;并且按照此出色的教程中的说明构建了编码器/解码器管道&#xff0c;以测试编码器和解码器是否在正常工作而不必发送真实的消息。 幸运的是&#xff0c;有一个EmbeddedChannel确实使我们的生活变得非常轻松。 假设我们有一条消息“ Fo…

投影元素直接隔离_摸着夜色上露台开投影,是巴塞罗那设计师的浪漫

总有人说&#xff0c;世界为你关上一扇门&#xff0c;定会为你留有一扇窗。在家闷上个把月&#xff0c;窗户直接担起了连接人们与外界的通道。既然观众出不了门&#xff0c;那不如让加油打气的海报们&#xff0c;自己爬上墙好了——人们打开窗子就能撞上。平面设计师Ral Goi一直…

天涯明月刀7月4号服务器维护,7月8日服务器例行维护公告

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼亲爱的玩家&#xff1a;青龙乱舞区、大地飞鹰区、沧海云帆区、把酒邀月区、边城浪子区全部服务器将在7月8日6:00~10:00停机维护更新&#xff0c;&#xff0c;维护完成后上述各服务器客户端版本更新至2.1.20.23&#xff0c;给您带来…

关于ecshop中jquery与js冲突解决的方案

ECShop把AJAX事件和JSON解析的模块放在common/transport.js之中&#xff0c;可以说它也有自己封装的一套工具&#xff0c;这其实是很正常的。但恰恰的&#xff0c;在封装JSON各种方法的同时对object的模型进行了重写&#xff0c;这个就跟jQuery冲突了。因为众所周知的&#xff…

Apache Lucene的结构

不可估量的高贵的Apache软件基金会&#xff08;Apache Software Foundation&#xff09;产生了许多重要产品&#xff08;Ant&#xff0c;CouchDB&#xff0c;Hadoop&#xff0c;JMeter&#xff0c;Maven&#xff0c;OpenOffice&#xff0c;Subversion等&#xff09;&#xff0c…

comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现

基于FPGA 的MXN维字符识别的实现1 概述本文的灵感来源于杨淑英老师的一张PPT&#xff08;手写数字识别&#xff09;&#xff0c;在此特别鸣谢杨淑英老师。一般机器视觉对事物是没有感知的&#xff0c;比如摄像头采集到一张苹果的图片&#xff0c;它本身是不知道那是什么东西&am…

嵌套的json ajax,通过jquery或javascript通过AJAX读取嵌套的JSON并输出到表中

我真的很想有一个快速便捷的方法来遍历JSON中的多个记录&#xff0c;每个记录都有潜在的深层嵌套。我只想输出到表。我不确定$ .each()或$ .ajax()成功的javascript方法需要通过function()传递哪些参数。所有示例似乎都使用通用词“data”或“ obj”&#xff0c;但它们使我感到…

难题:嵌套computeIfAbsent

总览 Java 8库在地图上有一个新方法&#xff0c;computeIfAbsent。 这是一种非常有用的将地图变成与键关联的对象的缓存的方法。 但是&#xff0c;您可能没有考虑过一种组合。 如果您在内部调用computeIfAbsent会发生什么。 map.computeIfAbsent(Key.Hello, s -> {map.com…

python扩展文件_1. 使用 C 或 C++ 扩展 Python

1.12.给扩展模块提供C API很多扩展模块提供了新的函数和类型供Python使用&#xff0c;但有时扩展模块里的代码也可以被其他扩展模块使用。例如&#xff0c;一个扩展模块可以实现一个类型 "collection" 看起来是没有顺序的。就像是Python列表类型&#xff0c;拥有C AP…

swal ajax,Sweetalert详细介绍

好长时间没有更新文章了&#xff0c;年底工作比较忙&#xff0c;确实是没有时间来写文章。今天忙里偷闲&#xff0c;总结了一款前端提示框的插件——sweetalert——推荐给大家。Sweetalert安装Sweetalert官方为我们提供了三种安装方式&#xff1a;方法一 通过bower安装$ bower …

构造函数必须没有代码

构造函数中应完成多少工作&#xff1f; 在构造函数内部进行一些计算然后封装结果似乎是合理的。 这样&#xff0c;当对象方法需要结果时&#xff0c;我们将准备好它们。 听起来是个好方法&#xff1f; 不&#xff0c;这不对。 这是一个坏主意&#xff0c;原因有一个&#xff1a…

一个路由器两个网段互通_如何判断两个IP地址是否在同一个网段?什么是子网掩码?...

前几天咱们了解&#xff1a;三种方法告诉你项目超过255个摄像机怎么设置IP?什么是公网ip&#xff1f;什么又是内网ip&#xff1f;为什么ip地址通常以192.168开头&#xff1f;也学习了&#xff1a;二、三层交换机与路由器的区别&#xff01;但是有好多人对IP这个概念还是不太清…

服务器appcrash的问题怎么修复,win7的ie出现APPCRASH问题怎么处理?

问题事件名称: APPCRASH 怎么解决?这是Win7或者是Vista特有的一个棘手的问题.APPCRASH(app是程序的意思&#xff0c;crash是坠机的意思。就是程序崩溃了/程序撞车……)(APPCRASH是Win7和Vista中特有的故障&#xff0c;就是程序崩溃引起APPCRASH错误的问题很多 如dll加载错误 软…

Jira 随便总结

一、JIRA与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 JIRA创建的问题类型包括New Feature、Bug、Task和Improvement四种&#xff0c;还可以自己定义&#xff0c;所以它也一是过程管理系统。 JIR…

http 路径 |_HTTP 请求與响应的格式及 curl 命令使用

介绍 HTTP&#xff0c;主要内容有HTTP 请求包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 请求内容HTTP 响应包括哪些部分&#xff0c;如何用Chrome开发者工具查看 HTTP 响应内容如何使用 curl 命令HTTP 请求的格式1 动词 路径 协议/版本 2 Key1: value1 2 Key2: v…

A new start!

从今天起&#xff0c;开始每天晚上拿出来半个小时到一个小时的时间来总结今天我做的那些事情&#xff0c;有哪些进步&#xff0c;有哪些不足&#xff0c;有哪些心得和笔记。 以前的学习都是每天学完就往脑袋后面一放&#xff0c;导致很多东西当时学会了&#xff0c;但是后面就都…

华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...

众所周知&#xff0c;无论是手机&#xff0c;还是电脑&#xff0c;我们所使用的系统到了一定的时间&#xff0c;都会进行“系统更新”&#xff0c;尤其是我们使用的苹果手机、华为手机等&#xff0c;就经常会跳出提示&#xff0c;提醒用户“更新系统”&#xff0c;尤其是当我们…