Java日志简介及SpringBoot日志

2023-11-19

一、什么是日志

  1. 日志:就是介绍一个过程和经历的详细记录。
  2. 项目日志:就是项目开发过程的详细记录,一般由项目经理记录。
  3. 代码里的日志:就是程序员记录某个开发过程的详细情况,这是项目里每个程序员需要做的工作。
  4. 日志和异常处理结合得当的话,会给项目维护带来非常大的价值。

二、日志的重要性

  1. 日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节。但是,这丝毫不影响它在任何一个系统中的重
    要地位。
  2. 为了保证服务的高可用,发现问题一定要及时,解决问题一定要迅速,所以生产环境一旦出现问题,预警系统就会通过邮件、短信甚至
    电话的方式实施多维轰炸模式,确保相关负责人不错过每一个可能的 bug。预警系统判断疑似 bug 大部分源于日志。当该错误日志达到一
    定次数出现的时候,就会触发报警。

三、日志在项目中的作用

主要用于记录程序运行的情况,以便于程序在部署之后的排错调试等,也有利于将这些信息进行持久化(如果不将日志信息保存到文件或
数据库,则信息便会丢失)。

  1. 查看程序当前运行状态
  2. 查看程序历史运行轨迹
  3. 排查系统问题
  4. 优化系统性能
  5. 安全审计的基石

四、Java 日志使用的困惑

大多数的程序员都能认识到日志在项目中的重要性,可是对日志记录具体要怎么做、做到什么程度、日志记录用什么工具,会有很多困惑。

  1. 工具困惑:作为 Java 程序员,幸运的是,Java 拥有功能和性能都非常强大的日志库;不幸的是,日志库不止一个,JUL(
    java.util.logging), JCL( Jakarta Commons Logging,Spring 框架默认使用的),Log4j, Log4j2, Logback、 SLF4j、 jboss-logging
    (Hibernate 框架默认使用的) 等,这么多的日志工具到底使用什么感到困惑。
  2. 使用困惑:有的程序员即使知道写 Java 程序用什么日志工具,可能对日志记录具体应该怎么写,写什么东西,什么情况下要写,这些仁
    者见仁智者见智的东西也会产生困惑。

五、Java 日志演化历史

  1. 最先出现的是 Apache 开源社区的 Log4j,这个日志确实是应用最广泛的日志工具,成为了 Java 日志的事实上的标准。
  2. 然而,当时 Java 的开发主体 Sun 公司认为自己才是正统,在 Jdk1.4 中增加了 JUL 日志实现,企图对抗 Log4j,但是却造成了 Java 目
    前开发者记录日志局面的混乱,迄今为止仍饱受诟病。
  3. 想象下你的项目应用使用 Log4j,然后使用了一个第三方库,而第三方库使用了 JUL,那么,你的应用就得同时使用 Log4j 和 JUL 两个
    日志工具了,然后又有需要使用另外一个第三方库,但是这个第三方库使用了 Log4j 和 JUL 之外的simplelog。这个时候你的应用里各种log
    工具满天飞,这势必会使你的程序员感到崩溃。因为这些日志工具互相没有关联,替换和统一日志工具也就变成了比较 棘手的一件事情。
  4. 为了搞定这个日常开发中比较棘手的问题,Apache 提供了一个日志框架作为日志的抽象,名字为 JCL。JCL 对各种日志接口进行抽象,
    抽象出一个接口层,对每个日志实现都进行适配,这样这些提供给别人的库都直接使用抽象层即可,确实出色地完成了兼容主流的日志实
    现(Log4j、JUL、simplelog 等),较好的解决了上述问题,基本一统江湖,就连顶顶大名的 Spring 也是依赖了 JCL。
  5. 但是美好的日子并不长,作为元老级日志 Log4j 的作者 (Ceki Gülcü),他觉得JCL 不够优秀,所以他再度出山,搞出了一套更优雅的日
    志框架 SLF4J(这个也是抽象层),即简单日志门面(Simple Logging Facade for Java),并为 SLF4J实现了一个亲儿子——logback,
    确实更加优雅了。
  6. 最后,Ceki Gülcü 觉得还是得照顾下自己的 “大儿子”——Log4j,又把 Log4j进行了改造,就是所谓的 Log4j2,同时支持 JCL 以及
    SLF4J。
  7. SLF4J 的出现,又使 Java 日志体系变得混乱起来。
  8. 下面是一张目前 Java 日志体系的示意图:
    在这里插入图片描述
  9. 日志库 Log4j,JUL,logback 是互相不兼容的,没有共同的 Interface,通过适配器模式,抽象出来一个共同的接口,然后根据具体的日
    志框架来实现日志。
  10. java common logging 和 SLF4J 都是日志的接口,供用户使用,而没有提供实现,Log4j,JUL,logback 等等才是日志的真正实现。
  11. 通常情况下,日志是由一个抽象层+实现层的组合来搭建的。
  12. Spring Boot 的日志框架:默认情况下,Spring Boot 会用 Logback 来记录日 志,并用 INFO 级别输出到控制台。

六、Logback 的介绍

  1. Logback 是 log4j 框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持 SLF4J。
  2. 官方网站: http://logback.qos.ch。
  3. 它当前分为下面下个模块:
  1. logback-core:其它两个模块的基础模块
  2. logback-classic:它是 log4j 的一个改良版本,同时它完整实现了 slf4j API 使你可以很方便地更换成其它日志系统如 log4j 或 JDK1.4 Logging
  3. logback-access:与 Servlet 容器集成提供通过 Http 来访问日志的功能

七、Spring Boot 中整合 Logback

  1. Spring Boot 为我们提供了很多默认的日志配置,只要将 spring-boot-starter-logging 作为依赖加入到当前应用的 classpath,则“开 箱即用”。
  2. 添加日志依赖(默认已经添加了,不需要添加)
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
  1. 默认的输出格式
    在这里插入图片描述
    日志的输出项目
    日期和时间:毫秒精度且易于排序。
    日志级别:ERROR,WARN,INFO,DEBUG,或 TRACE。
    进程标识。
    一个—分离器来区分实际日志消息的开始。
    线程名称:括在方括号中(可能会被截断以用于控制台输出)。
    记录器名称:这通常是源类名称(通常缩写)。
    日志消息。
  2. 彩色编码输出
  1. 如果您的终端支持 ANSI,则使用颜色输出来提高可读性。

  2. 下表描述了日志级别到颜色的映射
    在这里插入图片描述

  3. 支持的颜色:blue、cyan、faint、green、magenta、red、yellow

  1. 日志级别
  1. 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为 WARN,则低于 WARN 的信息都不会输出。
  2. 在 Spring 中设置日志级别,方法是使用 logging.level.=。
  1. 文件输出
  1. 默认情况下,Spring Boot 只记录到控制台,不写入日志文件。如果你想写入日志文件,你需要设置 logging.file.name 或 logging.file.path 属性

  2. 属性设置
    logging.file:设置日志文件,可以是绝对路径,也可以是相对路径。如:
    logging.file=my.log。
    logging.path:设置目录,会在该目录下创建 spring.log 文件,并写入日志内容,如:logging.path=D:/var/log。
    注:二者不能同时使用,如若同时使用,则只有 logging.file 生效
    在这里插入图片描述

  3. 日志文件在达到 10 MB 时会旋转,并且与控制台输出一样,默认情况下会 记录 ERROR-level、WARN-level 和 INFO-level 消息。可以
    使用该 logging.file.max-size 属性更改大小限制。除非 logging.file.max-history 已设置该属性,否则默认情况下会保留最近 7 天的轮换日志
    文件。日志档案 的总大小可以使用 logging.file.total-size-cap. 当日志档案的总大小超过 该阈值时,将删除备份。要在应用程序启动时强制
    清除日志存档,请使用该 logging.file.clean-history-on-start 属性。

八、Logback 的定制化配置

logback彩色字符编码说明
支持的颜色字符编码
%black 黑色
%red 红色
%green 绿色
%yellow 黄色
%blue 蓝色
%magenta 洋红色
%cyan 青色
%white 白色
%gray 灰色
以下为对应加粗的颜色代码
%boldRed
%boldGreen
%boldYellow
%boldBlue
%boldMagenta
%boldCyan
%boldWhite
%highlight 高亮色

  1. 可以看到上述方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了。
  2. 由于日志服务一般都在 ApplicationContext 创建前就初始化了,它并不是通过Spring 的配置文件控制。因此通过系统属性和传统的
    Spring Boot 外部配置文 件依然可以很好的支持日志控制和管理。
    在这里插入图片描述
  3. Spring Boot 官方推荐优先使用带有 xx-spring.xml 的文件名作为你的日志配置(比如:logback-spring.xml),命名为 logback-
    spring.xml 的日志配置文件, Spring Boot 可以为它添加一些特有的配置项。
  4. 创建 logback-spring.xml 文件,放在 src/main/resources 下面即可。
  5. 创建示例
<?xml version="1.0" encoding="UTF-8"?>
<configuration >
    <!--contextName说明:每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,
           用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。-->
    <contextName>logback-spring</contextName>
    <!-- name的值是变量的名称,value的值是变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="log"/>
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--输出日志到控制台-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--ThresholdFilter:临界值过滤器,打印大于等于level标签设置的级别,小的舍弃-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <!--日志输出格式-->
        <layout>
            <!--指定日志格式-->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </layout>
    </appender>

    <!--输出日志到文件-->
    <appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--LevelFilter:只打印level标签设置的日志级别-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <!--匹配到就允许-->
            <onMatch>ACCEPT</onMatch>
            <!--没有匹配到就禁止-->
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
        <!--指定文件的输出位置-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>d:/${log.path}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!--日志文档保留天数-->
            <maxHistory>30</maxHistory>
            <!--配置日志文件不能超过100M,若超过100M,日志文件会以索引0开始,命名日志文件-->
            <maxFileSize>100MB</maxFileSize>
            <!--总大小-->
            <totalSizeCap>2GB</totalSizeCap>
            <!--appender启动的时候,归档文件将会被删除。默认的值为 false-->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileLog"/>
    </root>
    <!--有logger的配置,不指定级别,不指定appender-->
    <!--将org.springframework.web包下的所有类的日志的打印-->
    <logger name="org.springframework.web" level="debug"/>
    <!--单独对某个类进行设置-->
    <logger name="cn.kgc.controller.ConfigurationPropertiesController" level="debug">
        <appender-ref ref="consoleLog"/>
    </logger>
</configuration>

九、程序中输出自己的日志

  1. 方式一:手动创建 Logger 对象
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    private Logger logger = LoggerFactory.getLogger(HelloController.class);
    
    @GetMapping("/")
    public void hello() {
        logger.info("读取配置信息");
    }
}
  1. 方式二:使用@slf4j 注解
  1. 添加依赖
<dependency> 
    <groupId>org.projectlombok</groupId> 
    <artifactId>lombok</artifactId> 
</dependency>
  1. 安装插件
    在这里插入图片描述
  2. 实现案例
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class TestController {
    @GetMapping("/")
    public String index(){
        log.info("记录日志使用 lombok 插件提供注解@Slf4j");
        return "";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java日志简介及SpringBoot日志 的相关文章

随机推荐

  • mysql database uri,未设置SQLALCHEMY_DATABASE_URI

    I tried to work with CURD operation using Flask and SQLAlchemy But getting Error while connecting to database Here is th
  • springboot+vue教室图书馆预约管理系统、

    下载地址 https download csdn net download ouyangxiaobai123 22176771 项目介绍 springboot vue教室图书馆预约管理系统 系统说明 聪慧物联网教室预定系统 后台系统 项目简
  • 多维数组变成一维数组

    这个问题来源于一个朋友曾经问过我的问题 当时是一个二维数组变成一维数组 后面我想整理一下 整理一个多维 并且是不定维的数组 一 二维数组变成一维数组 1 遍历数组 将元素一个个放入新数组 结果 如果元素不是数组 将会报错 下面是改良版 这样
  • 信号量和自旋锁

    信号量和自旋锁 为了避免并发 防止竞争 内核提供了一组同步方法来提供对共享数据的保护 我们的重点不是介绍这些方法的详细用法 而是强调为什么使用这些方法和它们之间的差别 Linux 使用的同步机制可以说从2 0到2 6以来不断发展完善 从最初
  • python编程实验,模拟聪明版的尼姆游戏设计原理

    实验原理与内容 本实验完成一个模拟聪明版的尼姆游戏功能 尼姆游戏是个著名的游戏 有很多变种玩法 两个玩家轮流从一堆物品中拿走一部分 在每一步中 玩家可以自由选择拿走多少物品 但是必须至少拿走一个并且最多只能拿走一半物品 然后轮到下一个玩家
  • Python SQLAlchemy ( ORM )、dictalchemy、Flask-SQLAlchemy、Flask-migrate、flask-script、flask-upload

    From Python中强大的通用ORM框架 SQLAlchemy https zhuanlan zhihu com p 444930067 Python ORM之SQLAlchemy全面指南 https zhuanlan zhihu co
  • ubuntu 18.04安装wireshark及网卡接口权限问题

    1 安装 sudo apt fast install wireshark 第一次安装过程中可能会提示Should non superusers be able to capture packets 选是即可 默认是否 2 待安装成功后 你会
  • MFC 菜单栏的使用

    MFC 菜单栏的使用 主要介绍两种比较简单和常用的创建方法 一 在资源视图中添加菜单资源 通过鼠标点击添加菜单项 菜单栏设计好 以后就是添加了 介绍两种方法 1 很简单 鼠标右击想显示菜单栏的对话框属性 可以看到有一个menu的属性 点击就
  • Linux 宝塔面板的安装

    Ptw cwl 登录宝塔官网 查看宝塔的详情 www bt cn 安装 linux服务器图形化界面管理器 安装 宝塔面板 在xshell当中执行宝塔面板的安装命令 yum install y wget wget O install sh h
  • python批量处理

    python opencv图像二值化批量处理 from skimage import data dir io transform color filters import numpy as np import cv2 def convert
  • 红帽Redhat—Linux网卡聚合

    文章目录 一 实验环境设置 二 网卡聚合nmcli 配置步骤 1 创建聚合接口 2 配置网络属性 3 添加物理接口 4 激活端口 5 查看聚合接口状态 一 实验环境设置 在已经安装好的RHEL8 3添加两个新网卡 1 点击虚拟机 gt 设置
  • 机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现

    前言 这几天一直都在研究模糊聚类 感觉网上的文档都没有一个详细而具体的讲解 正好今天有时间 就来聊一聊模糊聚类 一 模糊数学 我们大家都知道计算机其实只认识两个数字0 1 我们平时写程序其实也是这样if 1 then do 永远这种模式 在
  • C++实现String类

    C 实现String类 还没有完成 待继续 有以下注意的点 1 赋值操作符返回的是一个MyString 而重载的 返回的是一个MyString 其中的原因参看 effective c 主要是返回引用的时候 必须返回必须在此函数之前存在的引用
  • Android Studio安装教程+打包APK

    前言 这是一篇给新人的教程 如果你觉得简单啰嗦请保持冷静 同时如果本篇能给予到你帮助 是我的荣幸 Android Studio安装教程 点击链接下载Android Studio Android Studio官网下载 下载完成后双击 exe文
  • [实验三]LZW 编解码算法实现与分析

    目录 一 LZW算法 1 1 编码步骤 1 2 解码步骤 1 3 关于有可能出现当前码字CW不在词典中的情况说明 二 代码实现 2 1 程序说明 2 2 数据结构 2 3 bitio h 2 4 bitio c 2 5 lzw c 三 实验
  • VC++ FTP文件上传(断点续传)

    include
  • vue项目设置ip访问

    1 只用ip访问 打开config gt index 文件 host 172 16 1 95 新增host 改成IP地址 最后重新运行项目 2 既可以IP访问 由可以localhost访问 将config gt index 中host 该为
  • 嵌入式学习(第二周)

    目录 二 C语言基础 2 运算符和表达式 2 1 运算分类 2 2 算数运算符 2 3 关系运算符 2 4 逻辑运算符 2 5 条件运算符 2 6 位运算符 2 7 运算符的运用实例 3 程序结构和过程控制 3 1 C语言程序结构 3 2
  • 2021-03-30 maven

    1 maven父子工程 3 maven环境优化 1 修改web xml为最新的 2 将maven结构搭建完整 4 编写一个servlet Javaweb下载文件的头
  • Java日志简介及SpringBoot日志

    一 什么是日志 日志 就是介绍一个过程和经历的详细记录 项目日志 就是项目开发过程的详细记录 一般由项目经理记录 代码里的日志 就是程序员记录某个开发过程的详细情况 这是项目里每个程序员需要做的工作 日志和异常处理结合得当的话 会给项目维护