您的位置:首页 > 财经 > 金融 > 苹果手机app安装下载_网站制作厂家电话多少_google adwords关键词工具_宁波网站建设优化企业

苹果手机app安装下载_网站制作厂家电话多少_google adwords关键词工具_宁波网站建设优化企业

2025/7/3 11:15:58 来源:https://blog.csdn.net/2303_80341387/article/details/147256484  浏览:    关键词:苹果手机app安装下载_网站制作厂家电话多少_google adwords关键词工具_宁波网站建设优化企业
苹果手机app安装下载_网站制作厂家电话多少_google adwords关键词工具_宁波网站建设优化企业

文章目录

  • 1. 日志概述
    • 1.1 日志的用途
  • 2. 日志使用
    • 2.1 打印日志
      • 2.1.1 在程序中得到日志对象
      • 2.1.2 使用日志对象打印日志
    • 2.2 日志框架(了解)
      • 2.2.1 门面模式(外观模式)
        • 2.2.1.1 门面模式定义
        • 2.2.1.2 门面模式的实现
        • 2.2.1.3 门面模式的优点
      • 2.2.2 SLF4J框架介绍
        • 2.2.2.1 不引入日志门面
        • 2.2.2.2 引入日志门面
    • 2.3 日志格式的说明
    • 2.4 日志级别
      • 2.4.1 日志级别的分类
      • 2.4.2 日志级别的使用
    • 2.5 日志配置
      • 2.5.1配置日志级别
      • 2.5.2 日志持久化
      • 2.5.3 配置日志文件分割
  • 3. 更简单的日志输出
    • 3.1 添加lombok依赖
    • 3.2 输出日志
  • 4. 总结

1. 日志概述

通过打印日志来发现和定位问题,或者根据日志日志来分析程序的运行过程。

随着项目的复杂度提升,我们对日志的打印也有了更高的需求,不仅仅是定位排查问题。

随着项目的复杂度提升,我们对日志的打印也有了更高的需求,而不仅仅是定位排查问题,比如需要记录一些用户的操作记录(一些审计公司会要求),也可能需要使用日志来记录用户的一些喜好,把日志持久化,后续进行数据分析等.但是System.out.print不能很好的满足我们的需求,我们就需要使用一些专门日志框架(专业的事情交给专业的人去做).

1.1 日志的用途

  1. 系统监控
    监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,每一个方法的响应时间,响应状态等,对数据进行分析,设置不同的规则,超过阈值时进行报警.比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之一。
  2. 数据采集
    数据采集是一个比较大的范围,采集的数据可以作用在很多方面,比如数据统计,推荐排序等.
  • 数据统计:统计页面的浏览量(PV),访客量(UV),点击量等,根据这些数据进行数据分析,优化公司运营策略.
  • 推荐排序:目前推荐排序应用在各个领域,我们经常接触的各行各业很多也都涉及推荐排序,比如购物,广告,新闻等领域.数据采集是推荐排序工作中必须做的一环,系统通过日志记录用户的浏览历史,停留时长等,算法人员通过分析这些数据,训练模型,给用户做推荐.
    下图中的数据源,其中一部分就来自于日志记录的数据。
    在这里插入图片描述

2. 日志使用

2.1 打印日志

打印日志的步骤:

  1. 在程序中得到日志对象
  2. 使用日志对象输出要打印的内容

2.1.1 在程序中得到日志对象

在程序中获取日志对象需要使用日志工厂LoggerFactory

private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

LoggerFactory.getLogger需要传递一个参数,标识这个日志的名称.这样可以更清晰的知道是哪个类输出的日志。我们通常将该类座位参数,当有问题时,可以更方便直观的定位到问题类。

【注意】:Logger对象是属于org.slf4j包下的:
在这里插入图片描述

2.1.2 使用日志对象打印日志

日志对象的打印方法有很多种,我们可以先使用info()方法来输出日志,如下代码所示:

package com.example.ioc.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/logger")
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/print1")public String print1(){logger.info("我打印日志---logger");System.out.println("我打印日志---sout");return "1";}
}

输出结果:
在这里插入图片描述
可以看到,我们通过 System.out.print打印的日志,比SpringBoot打印的日志缺少了很多信息.

2.2 日志框架(了解)

在这里插入图片描述
SLF4J不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层,是对日志框架制定的一种规范,标准,接口.所有SLF4J并不能独立使用,需要和具体的日志框架配合使用。

2.2.1 门面模式(外观模式)

SLF4J是门面模式的典型应用(但不仅仅使用了门面模式).

2.2.1.1 门面模式定义

门面模式(FacadePattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用.
在这里插入图片描述
门面模式主要包含2种角色:
子系统角色(SubSystem):可以同时有一个或多个SubSystem.每个SubSytem都不是一个单独的类,而是一个类的集合.SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)。

2.2.1.2 门面模式的实现

场景:回家,我们会开各个屋的灯.离开家时,会关闭各个屋的灯;
如果家里设置一个总开关,来控制整个屋的灯就会很方便

使用门面模式实现:

package com.example.ioc.facade;public class BedRoomLight implements Light{@Overridepublic void on() {System.out.println("打开卧室灯");}@Overridepublic void off() {System.out.println("关闭卧室灯");}
}
package com.example.ioc.facade;public class FacadeClient {BedRoomLight bedRoomLight = new BedRoomLight();LivingRoomLight livingRoomLight = new LivingRoomLight();HallRoomLight hallRoomLight = new HallRoomLight();void lightOn(){bedRoomLight.on();livingRoomLight.on();hallRoomLight.on();}void lightOff(){bedRoomLight.off();livingRoomLight.off();hallRoomLight.off();}
}
package com.example.ioc.facade;public class HallRoomLight implements Light{@Overridepublic void on() {System.out.println("打开走廊灯");}@Overridepublic void off() {System.out.println("关闭走廊灯");}
}
package com.example.ioc.facade;public interface Light {void on();void off();
}
package com.example.ioc.facade;public class LivingRoomLight implements Light{@Overridepublic void on() {System.out.println("打开客厅灯");}@Overridepublic void off() {System.out.println("关闭客厅灯");}
}
package com.example.ioc.facade;public class Main {public static void main(String[] args) {
//        BedRoomLight bedRoomLight = new BedRoomLight();
//        LivingRoomLight livingRoomLight = new LivingRoomLight();
//        HallRoomLight hallRoomLight = new HallRoomLight();
//        bedRoomLight.on();
//        livingRoomLight.on();
//        hallRoomLight.on();FacadeClient facadeClient = new FacadeClient();facadeClient.lightOn();facadeClient.lightOff();}
}
2.2.1.3 门面模式的优点
  1. 减少了系统的相互依赖.实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;
  2. 提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可.
  3. 提高了安全性.可以灵活设定访问权限,不在门面对象中开通方法,就无法访问

2.2.2 SLF4J框架介绍

SLF4J就是其他日志框架的门面.SLF4J可以理解为是提供日志服务的统一API接口,并不涉及到具体的日志逻辑实现.

2.2.2.1 不引入日志门面

常见的日志框架有log4J,logback等.如果一个项目已经使用了log4j,而你依赖的是另一个类库,假如是ApacheActiveMQ,它依赖于另外一个日志框架logback,那么你就需要把logback也加载进去.
在这里插入图片描述

但是这样就会存在问题:

  1. 同日志框架的API接口和配置文件不同,如果多个日志框架共存,那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件).
  2. 如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在一些代码冲突。
  3. 如果引入的第三方框架,使用了多套,那就不得不维护多套配置。
2.2.2.2 引入日志门面

引入门面日志框架之后,应用程序和日志框架(框架的具体实现)之间有了统一的AP接口(门面日志框架实现),此时应用程序只需要维护一套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序代码.
在这里插入图片描述

2.3 日志格式的说明

打印日志的信息分析:
![在这里插在这里插入图片描述
从上图可以看到,日志输出内容元素具体如下:

  1. 时间日期:精确到毫秒
  2. 日志级别:ERROR,WARN,INFO,DEBUG或TRACE
  3. 进程ID
  4. 线程名
  5. Logger名(通常使用源代码的类名)
  6. 日志内容

2.4 日志级别

日志级别代表着日志信息对应问题的严重性,为了更快的筛选符合目标的日志信息。
有了日志级别之后就可以过滤自已想看到的信息了,比如只关注error级别的,就可以根据级别过滤出来error级别的日志信息,节约开发者的信息筛选时间,

2.4.1 日志级别的分类

日志的级别从高到低依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE

  1. FATAL:致命信息,表示需要立即被处理的系统级错误.
  2. ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行.
  3. WARN:警告信息,不影响使用,但需要注意的问题
  4. INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等.
  5. DEBUG:调试信息,需要调试时候的关键信息打印.
  6. TRACE:追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)

日志级别通常和测试人员的Bug级别没有关系。
日志级别是开发人员设置的,用来给开发人员看的。日志级别的正确设置,也与开发人员的工作经验有关。如果开发人员把error级别的日志设置成了info,就很有可能会影响开发人员对项目运行情况的判断。出现error级别的日志信息较多时,可能没有任何问题。测试的bug级别更多是依赖现象和影响范围来判断。

日志级别的顺序:
在这里插入图片描述

2.4.2 日志级别的使用

日志级别是开发人员自己设置的,开发人员根据自己的理解来判断该信息的重要程度。

针对这些级别,Logger对象分别提供了对应的方法,来输出日志:

package com.example.ioc.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/logger")
public class LoggerController {private static Logger logger = LoggerFactory.getLogger(LoggerController.class);@RequestMapping("/print")public String print(){logger.info("我打印日志---logger");logger.error("我是error级别日志");logger.warn("我是warn级别日志");logger.info("我是info级别日志");logger.debug("我是debug级别日志");logger.trace("我是追踪级别日志");return "1";}
}

输出结果:
在这里插入图片描述
SpringBoot默认的日志框架是Logback,Logback没有FATAL级别,它被映射到ERROR
出现fatal日志,表示服务已经出现了某种程度的不可用,需要需要系统管理员紧急介入处理.通常情况下,一个进程生命周期中应该最多只有一次FATAL记录。

上面的输出结果中,只打印了info,warn和error级别的日志。
这与日志级别的配置有关,日志的输出级别默认是info级别,所以只会打印大于等于此级别的日志,也就是info, warn和error.

2.5 日志配置

2.5.1配置日志级别

日志级别配置只需要在配置文件中设置"logging.level"配置项即可。properties和yml只需要配置其中一个即可。

二者转换方式:Properties文件的点(·)对应yml文件中的换行

Properties配置

lgging.level.root=debug

yml配置

logging:level:root: debug

重新运行上述代码,观察结果:

在这里插入图片描述

2.5.2 日志持久化

以上的日志都是输出在控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题.把日志保存下来就叫持久化.

日志持久化的两种方式:

  1. 配置日志文件名
  2. 配置日志的存储目录

1. 配置日志文件的路径和文件名
Properties配置

logging.file.name=logger/springboot.log

yml配置

logging:
# 第一种日持久化方式file:path: logger/app.log

在path后面可以跟绝对路径或者相对路径。

运行结果:
在这里插入图片描述

2. 配置日志文件的保存路径
Properties配置

logging.file.path=D:/temp
logging:file:name: logger/springboot.log

在这里插入图片描述
【注意】:logging.file.namelogging.file.path 两个都配置的情况下,只生效其一,以logging.file.name为准.

2.5.3 配置日志文件分割

如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割.

当然,日志框架也帮我们考虑到了这一点,所以如果不进行配置,就走自动配置,默认日志文件超过10M就进行分割。

配置项说明默认值
logging.logback.rollingpolicy.file-name-pattern日志分割后的文件名格式$[LOG_FILE}.%d[yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.max-file-size日志文件超过这个大小就自动分割10MB

配置日志文件分割:

Properties配置

ogging.logback.rollingpolicy.file-name-pattern=${LoG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=lKB

yml配置

logging:logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i #配置日志分割的文件名格式
  1. 日志文件超过1KB就分割(设置1KB是为了更好展示.企业开发通常设置为200M,500M等,此处没有明确标准)
  2. 分割后的日志文件名为:日志名.日期.索引

项目运行,日志分割结果:
在这里插入图片描述

3. 更简单的日志输出

每次都使用LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加一遍,lombok给我们提供了一种更简单的方式.

  1. 添加lombok框架支持
  2. 使用用@slf4j注解输出日志。

3.1 添加lombok依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

3.2 输出日志

package com.example.ioc.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
@RequestMapping("/logger2")
public class LoggerControler2 {@RequestMapping("/print")public String print(){log.info("我打印日志---logger");log.error("我是error级别日志");log.warn("我是warn级别日志");log.info("我是info级别日志");log.debug("我是debug级别日志");log.trace("我是追踪级别日志");return "1";}
}

输出结果:
在这里插入图片描述
使用lombok提供的@Slf4j注解,会帮我们提供一个日志对象log,我们直接使用就可以。

4. 总结

  1. 日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,SpringBoot内容了日志框架,默认情况下使用的是info日志级别将日志输出到控制台的,我们可以通过lombok提供的@Slf4j注解和og 对象快速的打印自定义日志.
  2. 日志包含6个级别,日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志持久化.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com