概述

我们在平时开发项目的时候想知道程序运行情况一般可以使用sysout.print();打印一些关键的代码或者通过debug查看运行状态,但是对于这种sysout.print();很现任出现代码多余。市场上也就出现许多记录运行状态的框架。例如Log4j、JUL、logback等,我们在项目中选择一个使用即可,但是如果过段时间出来一个新的日志框架,我们去掉之前框架,使用新的框架,又的修改api,我们是不是可以采用面向接口开发的思想,定制一个抽象层的日志接口层,分装统一的api,使用指定的日志框架,但是抽象层的接口一直使用日志抽象层,这样,我们想换日志框架的时候,直接导入新的依赖,无需修改已有的api。

1、市面上的日志框架以及日志抽象层类

日志抽象层框架:JCL、SLF4j、jboss-logging

日志实现层框架:log4j、logback、JUL、log4j2

开发中我们从日志抽象层框架选一个作为抽象接口层,再从日志实现层框架选一个作为实现类,用来记录我们项目中的日志

2、Springboot默认日志记录

在springboot中,boot默认抽象接口层使用slf4j,实现层用logback,当我们我们可以从项目中查看,如下

我创建了一个demo项目,pom中引入的依赖文件如下

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
</dependencies>

项目中如果使用logback作为日志处理框架,logback 包括,logback-core、logback- classic、logback-access。logback-core是其它两个模块的基础模块,如果项目中引入了spring-boot-starter-web的依赖树,不再单独导入logback,可以看web依赖树

Springboot项目引入web模块后,底层默认配置好了slf4j+logback日志记录,我们只需通过日志记录器根据需要选择不同级别的日志打印输出即可,也可以同时使用spring的AOP思想自定义一个日志记录类记录日志

记录器方式如下,需要的地方记录即可

public class TestController{//记录器Logger logger = LoggerFactory.getLogger(getClass());@Testpublic void contextLoads() {//日志级别,由低到高,调整日志级别,只输出高级别日志,logger.trace("这是trace跟踪信息");logger.debug("这是debug调试信息");//springboot默认输出info以后的级别,也就是root级别logger.info("这是info自定义信息");logger.warn("这是warn警告信息");logger.error("这是error错误信息");}
}

通过AOP思想记录日志

@Aspect//切面
@Component//组件
public class LogAspect {private final Logger logger = LoggerFactory.getLogger(this.getClass());/*** 这里把切点切再controller(web)层下的每个方法*/@Pointcut("execution(* com.javayihao.myweb.controller.*.*(..))")public void log() {}/*** 执行com.javayihao.myweb.controller下所有的方法之前执行这个方法*  获取要记录的url ip 请求的方法 以及请求时候所带的参数* @param joinPoint*/@Before("log()")public void doBefore(JoinPoint joinPoint) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String url = request.getRequestURL().toString();String ip = request.getRemoteAddr();//类名.方法String classMethod = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();//参数Object[] args = joinPoint.getArgs();//调用自己封装的对象RequestLog requestLog = new RequestLog(url, ip, classMethod, args);logger.info("Request : {}", requestLog);}@After("log()")public void doAfter() {
//        logger.info("--------doAfter--------");}//执行com.javayihao.myweb.controller下所有的方法之后要执行的方法@AfterReturning(returning = "result",pointcut = "log()")public void doAfterRuturn(Object result) {logger.info("Result : {}", result);}private class RequestLog {private String url;private String ip;private String classMethod;private Object[] args;public RequestLog(String url, String ip, String classMethod, Object[] args) {this.url = url;this.ip = ip;this.classMethod = classMethod;this.args = args;}@Overridepublic String toString() {return "{" +"url='" + url + ''' +", ip='" + ip + ''' +", classMethod='" + classMethod + ''' +", args=" + Arrays.toString(args) +'}';}}}

我们没有配置任何其它配置,就看到在控制台下打印日志,Logback默认打印debug级别日志,但是我们注意到debug级别的日志没有记录下来,那是因为Spring Boot为Logback提供了默认的配置文件,base.xml,另外Spring Boot 提供了两个输出端的配置文件console-appender.xml和file-appender.xml,base.xml引用了这两个配置文件。所以Springboot默认日志级别是info,可以看到base.xml引用两个配置,

以下是从git上找到spring-boot用的base.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included><include resource="org/springframework/boot/logging/logback/defaults.xml" /><property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/><include resource="org/springframework/boot/logging/logback/console-appender.xml" /><include resource="org/springframework/boot/logging/logback/file-appender.xml" /><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></root>
</included>

在这里, 您可以看到 Spring boot已通过将根记录器设置为INFO来覆盖 Logback 的默认日志记录级别, 这是我们在上面的示例中没有看到调试消息的原因。

可以简单的在application.properties中对logback配置

#修改指定包下的日志输出级别
logging.level.com.javayihao=trace
#当前项目下生成mylog.log日志记录输出的日志
#logging.file=mylog.log
#在指定的路径下输出日志
#logging.file=f:/mylog.log
#当前的磁盘根路径下创建spring文件家和里面的log文件夹,以spring.log作为日志文件名字
logging.path=/spring/log
#指定控制台输出日志的格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS}+++[%thread] %-5level %logger{50} - %msg%n
#执行日志文件中输出日志的格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS}===[%thread] %-5level %logger{50} - %msg%n

通过application.properties文件配置Logback,对于大多数Spring Boot应用来说已经足够了,但是对于一些大型的企业应用来说似乎有一些相对复杂的日志需求。在Spring Boot中你可以在logback.xml或者在logback-spring.xml中对Logback进行配置,相对于logback.xml,logback-spring.xml更加被偏爱。如果是其他名字,只需在application.propertions

中配置logging.config=classpath:logback-boot.xml使用自己的日志配置文件即可

这里贴上我自己常用的logback-spring.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<configuration><!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, --><!-- appender是configuration的子节点,是负责写日志的组件。 --><!-- ConsoleAppender:把日志输出到控制台 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d %p (%file:%line)- %m%n</pattern><!-- 控制台也要使用UTF-8,不要使用GBK,否则会中文乱码 --><charset>UTF-8</charset></encoder></appender><!--RollingFileAppender把日志写到文件中--><!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 --><!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是sys.log --><!--             2.如果日期没有发生变化,但是当前日志的文件大小超过1KB时,对当前日志进行分割 重命名--><appender name="syslog"class="ch.qos.logback.core.rolling.RollingFileAppender"><!--当前项目下生成sys.log日志记录输出的日志--><File>log/sys.log</File><!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 --><!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 --><!-- 文件名:log/sys.2017-12-05.0.log --><fileNamePattern>log/sys.%d.%i.log</fileNamePattern><!-- 每产生一个日志文件,该日志文件的保存期限为30天 --><maxHistory>30</maxHistory><timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- maxFileSize:这是活动文件的大小,默认值是10MB,可以设置为1KB,查看演示 --><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><!-- pattern节点,用来设置日志的输入格式 --><pattern>%d %p (%file:%line)- %m%n</pattern><!-- 记录日志的编码 --><charset>UTF-8</charset> <!-- 此处设置字符集 --></encoder></appender><!-- 控制台输出日志级别 --><root level="info"><appender-ref ref="STDOUT" /></root><!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 --><!-- com.javayihao为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG --><!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  --><logger name="com.javayihao" level="DEBUG"><appender-ref ref="syslog" /></logger>
</configuration>

当然,我们也可以按部署环境配置日志级别,如下生产环境和测试环境使用不同的方式

<?xml version="1.0" encoding="UTF-8"?>
<configuration><include resource="org/springframework/boot/logging/logback/base.xml" /><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></root><!-- 测试环境+开发环境. 多个使用逗号隔开. --><springProfile name="test,dev"><logger name="org.springframework.web" level="INFO"><appender-ref ref="FILE"/></logger><logger name="com.example" level="INFO" /></springProfile><!-- 生产环境. --><springProfile name="prod"><logger name="org.springframework.web" level="ERROR"><appender-ref ref="FILE"/></logger><logger name="com.example" level="ERROR" /></springProfile>
</configuration>

3.总结

通过上面我们知道以后项目中如果要记录日志,不应该直接使用一个日志实现类记录,而是通过一个日志抽象层+一个日志抽象实现类,然后调用抽象层里面的接口记录接口,如下使用日志抽象类SLF4j

boot就是这么做的,这里主要总结一下日志抽象类SLF4j和其他日志实现类的使用

官网:https://www.slf4j.org/

使用方法,官网的一张图说的很明白

问题:x系统使用Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis、xxxx框架实现,每个框架有不同的日志记录框架,如何统一使用都使用slf4j

解决方法

1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、我们导入slf4j其他的实现

比如我们要使用slf4j+log4j的方式来记录日志,依赖如下

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback‐classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j‐over‐slf4j</artifactId>

<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j‐log4j12</artifactId>
</dependency>

再如我们要使用slf4j+log4j2的方式来记录日志,依赖如下

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring‐boot‐starter‐logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐log4j2</artifactId>
</dependency>

但是在boot项目中不推荐slf4j+log4j2或者slf4j+log4j组合来记录日志,springboot官方推荐slf4+logback

公众号 java一号 更多java实战项目资料、技术干活。更重要的是小猿愿成为你编程路上的一个朋友!

文章首发地址: www.javayihao.top

首发公众号: java一号

springboot获取当前服务ip_springboot(6)——整合日志相关推荐

  1. springboot获取当前服务ip_springboot免费的IP定位服务

    简介 ip2region 是准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java,php,c,python,nodejs,golang,c#查询绑定和Bin ...

  2. springboot 获取web服务端口_我是这样使用SpringBoot(WEB服务)

    前面完成了API服务(虽然这个API没什么用).接下去来个WEB服务,在前面项目中加上个页面.这章目标是通过访问一个URL展示一个界面,从服务端传递参数值到界面中展示动态数据.这里还会涉及到webja ...

  3. 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践

    目录导读 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践 1. 开源代码整体架构设计 2. 微服务逻辑架构设计 3. 微服务熔断降级与限流规划 3.1 微服务熔断 ...

  4. Spring Cloud构建微服务架构:分布式服务跟踪(整合zipkin)【Dalston版】

    通过上一篇<分布式服务跟踪(整合logstash)>,我们虽然已经能够利用ELK平台提供的收集.存储.搜索等强大功能,对跟踪信息的管理和使用已经变得非常便利.但是,在ELK平台中的数据分析 ...

  5. (附源码)springboot厨到家服务平台 毕业设计 063133

    springboot厨到家服务系统 摘  要 在社会快速发展的影响下,餐饮迅速发展,大大增加了餐饮服务信息管理的数量.多样性.质量等等的要求,使餐饮的管理和运营比过去十年更加困难.依照这一现实为基础, ...

  6. 2021/04/25 SpringBoot + SpringCloud微服务项⽬交付案例

    第1章 SpringBoot + SpringCloud微服务项⽬交付案例 1.1 微服务概念 传统的是用户通过终端链接到应用里 现在服务往越来越小的方向做,把每个服务做成一个独立的功能,每个服务完成 ...

  7. SpringBoot+Dubbo+环信(即时通信)整合

    SpringBoot+Dubbo+环信(即时通信)整合 1.注册环信账号 官网:https://www.easemob.com/ 稳定健壮,消息必达,亿级并发的即时通讯云 2. 了解平台架构 文档地址 ...

  8. spring的发展||springboot和微服务的介绍

    spring的发展 1,Spring1.x时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置 ...

  9. SpringBoot使用Slf4j+Log4j2完成项目的日志记录

    SpringBoot使用Slf4j+Log4j完成项目的日志记录 前言 本示例采用SpringBoot项目使用SpringAOP记录日志,Slf4j作为日志门面,Log4j2作为日志实现实,实现开发中 ...

最新文章

  1. c# 自定义控件使其填充方格且自动变换大小
  2. VTK:可视化之MovableAxes
  3. 贪心算法———房间搬桌子
  4. Spring学习(八)AOP详解
  5. 进程间通信:管道和命名管道(FIFO)
  6. 基于 Flink+Iceberg 构建企业级实时数据湖 | 附 PPT 下载
  7. socket编程介绍
  8. linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞
  9. ROS学习——2编写简单的发布者和订阅者
  10. 为什么要使用git pull --rebase?
  11. 商用平板 移动金融潜力巨大的应用平台
  12. 【学校集训】【USACO15DecG】Bessie's Dream
  13. PHP算法 参数组合,多个分类不同组合列表
  14. cf 1183B equalize prices
  15. 从零手写VIO(三)——LM算法
  16. 强力推荐!五款能让你成为Excel“高手”的Excel插件
  17. QT制作一个串口调试助手出现乱码问题
  18. python股票量化交易学习目录
  19. antd里面select组件mode为tags时,输入重复按回车键做保留处理
  20. Aspect Level Sentiment Classification with Deep Memory Network

热门文章

  1. 基于ADS的c语言程序设计实验,实验一:基于ADS软件传输线理论仿真设计与分析.docx...
  2. Python编程基础10:列表
  3. 16软件1班安卓第二学期学习总结
  4. 【Tyvj1185】【codevs1296】【BZOJ1588】营业额统计,Splay练习
  5. cpp mqtt paho 使用_MQTT--Paho C Client 的实现和详解
  6. sublime 如何使用less_Sublime Text3 使用教程
  7. 2017.10.29 软件安装 思考记录
  8. Bzoj 1566: [NOI2009]管道取珠(动态规划-神题)
  9. html禁止页面左右滑动,js阻止移动端默认事件以及只阻止横向滚动事件方法
  10. mysql 可以承受多少人_多少人曾羡慕“双 11”时的爆单 可知谁在承受库存积压的风险...