设置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,一经查实,立即删除!

相关文章

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

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

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

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

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…

构造函数必须没有代码

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

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

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

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

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

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

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

Apache骆驼丝攻示例

如果您想监视&#xff0c;调试&#xff0c;排除流经路由的消息&#xff0c;而又不必从通道中永久消耗消息&#xff0c;那么就需要使用电线 。 有线分流器充当接收者列表&#xff0c;该列表消耗输入通道之外的消息并将其发布到两个输出通道。 第一个是作为主要信道的实际目的地…

参考文献中会议名称怎么缩写_期刊缩写查询总结

介绍英文论文写作中&#xff0c;经常会插入参考文献。那么参考文献中的期刊名称&#xff0c;时常需要使用缩写。但是有时候&#xff0c;查了半天&#xff0c;怎么也查不着&#xff0c;让人抓狂。今天小编总结了几个查询期刊缩写的网址&#xff0c;方便大家进行期刊缩写的查询。…

7. SVM松弛变量

我们之前讨论的情况都是建立在样例线性可分的假设上&#xff0c;当样例线性不可分时&#xff0c;我们可以尝试使用核函数来将特征映射到高维&#xff0c;这样很可能就可分了。然而&#xff0c;映射后我们也不能100%保证可分。那怎么办呢&#xff0c;我们需要将模型进行调整&…

mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上

简介今天在迁移zabbix的数据库&#xff0c;每次链接到自己的mysql都报错&#xff0c;mysqlAuthentication plugin caching_sha2_password cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_passwordzabbix总是提示**** MySQL server is not available. Waiting 5 secon…

ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

近期项目中可能要用到Flash存取数据&#xff0c;并与JS互调&#xff0c;所以就看了一下ActionScript 3.0&#xff0c;现把学习结果分享一下&#xff0c;希望对新手有帮助。 目录 ActionScript 3.0简介 Hello World 文件读写 数据存储(SharedObject) 与JS互调 ActionScript 3.0简…

Quasar和Akka –比较

actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块&#xff0c;仅通过消息传递与其他角色进行通信&#xff0c;可以与其他角色隔离而失败&#xff0c;但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单&#xff0c;孤立但…

dlgdata.cpp错误提示 解决方案

1、在测试编写继承CStatic类组件时候&#xff0c;发现在调用调试过程中弹出一个错误&#xff0c;点忽略还可以继续运行。如下图&#xff1a; 2、dlgdata.cpp此文件是VS安装目录\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc中的文件&#xff0c;而出现此错误一般是所…

mysql主从复制时间配置_MySQL主从复制配置

环境CentOS 7.5Docker 1.13.1MySQL 8.0.16基于以上环境启动三个mysql容器&#xff0c;一个为master&#xff0c;二个为slavemaster和slave使用的mysql版本是完全一致的&#xff0c;未测试不同版本的mysql配置master编辑配置文件编辑master的配置文件my.cnf$ vim /usr/mysql/con…

C语言操作符优先级

转自&#xff1a;http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运算符 1 (单目运算符)…

Win7下硬盘安装Redhat双系统

Win7下硬盘安装Redhat Linux 形成双系统过程详解 需要软件 EasyBCD2.0 和 linux ISO 系统镜像 RedHat linux下载地址&#xff1a;http://www.linuxidc.com/Linux/2013-01/78017.htm 安装前准备工作: 1 一个 Windows 盘 D E F 任选其一都可以&#xff0c;将其格式化为FAT32 格式…

java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...

学生会私房菜学生会私房菜是通过学生会信箱收集同学们的来稿&#xff0c;挑选其中的优质文档&#xff0c;不定期进行文档推送的主题。本期文档内容为&#xff1a;Weblogic WLS核心组件反序列化命令执行突破(CVE-2018-2628)漏洞复现》作者介绍&#xff1a;ChowChow&#xff0c;一…

ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法

一直都在使用微软URLRewriter&#xff0c;具体的使用方法我就不多说了&#xff0c;网上文章很多。 但最近遇到一个问题&#xff0c;就是当web.config文件里面设置伪静态规则过多&#xff0c;大于2M的时候&#xff0c;就报错&#xff1a;无法读取配置文件&#xff0c;因为它超过…