springboot系列教程(二):Log4j2日志信息(含源码)

news2024/9/22 9:40:59

一、Log4j2日志简介

日志打印是了解Web项目运行的最直接方式,所以在项目开发中是需要首先搭建好的环境。

1、Log4j2特点

  • 核心特点

相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高;并发的特性,减少了死锁的发生。

  • 性能测试
    在这里插入图片描述
    在这里插入图片描述

2、日志打印之外观模式

每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,增加应用程序代码和日志框架的耦合性。
《阿里巴巴Java开发手册》,其中有一条规范做了『强制』要求:
在这里插入图片描述

  • SLF4J

Java简易日志门面(Simple Logging Facade for Java,缩写SLF4J),是一套包装Logging 框架的界面程式,以外观模式实现。

二、配置日志打印

1、项目结构

在这里插入图片描述

2、不同环境的日志配置

使用最直接的方式,不同环境加载不同的日志配置。

  • 开发环境配置
logging:
  config: classpath:log4j2-boot-dev.xml
  • 生产环境配置
logging:
  config: classpath:log4j2-boot-pro.xml

3、Log4j2的配置文件

<!--?xml version="1.0" encoding="UTF-8"?-->
<!--monitorInterval:Log4j2 自动检测修改配置文件和重新配置本身,设置间隔秒数-->
<configuration monitorinterval="5">
    <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    <!--变量配置-->
    <properties>
        <!-- 格式化输出:
            %date表示日期,%thread表示线程名,
            %-5level:级别从左显示5个字符宽度
            %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
        <!-- 定义日志存储的路径,不要配置相对路径 -->
        <property name="FILE_PATH" value="E:/logs/dev" />
        <property name="FILE_NAME" value="boot-log4j2" />
    </properties>

    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <patternlayout pattern="${LOG_PATTERN}" />
            <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <thresholdfilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
        </console>

        <!--文件会打印出所有信息-->
        <file name="Filelog" filename="${FILE_PATH}/log4j2.log" append="true">
            <patternlayout pattern="${LOG_PATTERN}" />
        </file>

        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <rollingfile name="RollingFileInfo" filename="${FILE_PATH}/info.log" filepattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <thresholdfilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            <patternlayout pattern="${LOG_PATTERN}" />
            <policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <timebasedtriggeringpolicy interval="1" />
                <sizebasedtriggeringpolicy size="10MB" />
            </policies>
            <!-- DefaultRolloverStrategy同一文件夹下15个文件开始覆盖-->
            <defaultrolloverstrategy max="15" />
        </rollingfile>

        <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <rollingfile name="RollingFileWarn" filename="${FILE_PATH}/warn.log" filepattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <thresholdfilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
            <patternlayout pattern="${LOG_PATTERN}" />
            <policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <timebasedtriggeringpolicy interval="1" />
                <sizebasedtriggeringpolicy size="10MB" />
            </policies>
            <!-- DefaultRolloverStrategy同一文件夹下15个文件开始覆盖-->
            <defaultrolloverstrategy max="15" />
        </rollingfile>

        <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <rollingfile name="RollingFileError" filename="${FILE_PATH}/error.log" filepattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <thresholdfilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
            <patternlayout pattern="${LOG_PATTERN}" />
            <policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <timebasedtriggeringpolicy interval="1" />
                <sizebasedtriggeringpolicy size="10MB" />
            </policies>
            <!-- DefaultRolloverStrategy同一文件夹下15个文件开始覆盖-->
            <defaultrolloverstrategy max="15" />
        </rollingfile>
    </appenders>

    <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
    <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <appenderref ref="Console" />
        </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <logger name="org.springframework" level="info" additivity="false">
            <appenderref ref="Console" />
        </logger>
        <root level="info">
            <appender-ref ref="Console" />
            <appender-ref ref="Filelog" />
            <appender-ref ref="RollingFileInfo" />
            <appender-ref ref="RollingFileWarn" />
            <appender-ref ref="RollingFileError" />
        </root>
    </loggers>

</configuration>

三、测试日志打印

1、简单的测试程序

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Log4j2Controller {
    private static final Logger LOGGER = LoggerFactory.getLogger(Log4j2Controller.class);
    /**
     * 日志级别
     * OFF &gt; FATAL &gt; ERROR &gt; WARN &gt; INFO &gt; DEBUG &gt; TRACE &gt; ALL
     */
    @RequestMapping("/printLog")
    public String printLog (){
        LOGGER.error("ERROR 级别日志");
        LOGGER.warn("WARN 级别日志");
        LOGGER.info("INFO 级别日志");
        LOGGER.debug("DEBUG 级别日志");
        LOGGER.trace("TRACE 级别日志");
        return "success" ;
    }
}

2、测试效果图

在这里插入图片描述

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

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

相关文章

攻防世界 level3

这道题把附件下载下来发现一个libc(动态链接库)&#xff0c;那这道题估计需要利用libc来确定elf中函数的地址 国际惯例checksec&#xff0c;发现level3没开栈溢出保护和地址随机化&#xff0c;libc全开 拖入32位ida&#xff0c;没发现留后门和system函数&#xff0c;只有个writ…

SCI一区级 | Matlab实现GJO-CNN-LSTM-Multihead-Attention多变量时间序列预测

SCI一区级 | Matlab实现GJO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现GJO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GJO-CNN-LSTM-Mutilhead-Attention金豺优化算…

OrangePi AIpro在安防领域的深思和实战(旷视科技CNN模型ShuffleNetV1开发案例测试)

一、前言 公司最近有个项目是安防领域的&#xff0c;主要用在边缘结点&#xff0c;虽然已做成形&#xff0c;但是还是存在一些缺陷&#xff0c;例如&#xff1a;算力问题&#xff0c;开发板的成熟问题&#xff0c;已经各种技术的解决方案落地问题。目前我们集成了很多功能&…

在家上网IP地址是固定的吗?

在数字化时代&#xff0c;互联网已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都离不开网络的支持。然而&#xff0c;当我们在家中接入互联网时&#xff0c;可能会产生这样一个疑问&#xff1a;在家上网IP地址是固定的吗&#xff1f;下面一…

春招冲刺百题计划|双指针

Java基础复习 Java数组的声明与初始化Java ArrayListJava HashMapJava String 类Java LinkedListJava Deque继承LinkedListJava SetJava 队列优先队列:第二题用到了Java数组划分Java数组转ArrayListString 转数字String 这一部分&#xff0c;代码随想录写得超级好&#xff01…

哪些场景下适合使用人工智能作词软件来写歌词

以下是一些适合使用人工智能作词软件的场景&#xff1a; 软件我们选用“妙笔生词”智能写歌词软件&#xff08;veve299&#xff09;来操作。 1.创作灵感枯竭时&#xff1a;当创作者陷入思维困境&#xff0c;找不到新的创意和方向&#xff0c;人工智能作词软件可以快速提供一些…

Learning vtkjs之hello vtk

学习vtkjs 最近由于工作需要&#xff0c;开始学习vtkjs的相关内容&#xff0c;发现其实在医疗和工业领域&#xff0c;这个vtk的库的example还是非常有帮助&#xff0c;但是实际用的一些开发工具&#xff0c;或者研发生态却没有three的好&#xff0c;也就是能抄写的东西不多&am…

PanTools v1.0.27 多网盘批量管理、遍历分享、转存、重命名、复制...

一款针对多个热门网盘的文件管理、批量分享、批量转存、批量重命名、批量复制、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者、网盘拉新等&#xff0c;对于管理名下具有多个网盘多个账号具有…

昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换

模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。…

3D问界-深入理解骨骼绑定与蒙皮绑定在三维动画中的角色

问题提出&#xff1a;什么是蒙皮绑定&#xff0c;什么是骨骼绑定 蒙皮绑定&#xff08;Skinning&#xff09;和骨骼绑定&#xff08;Bone Binding&#xff09;通常是在计算机图形学和动画制作中使用的术语&#xff0c;用来描述将模型或角色的几何形状与骨骼系统相关联的过程。这…

层序遍历及其应用

我们先看一道问题&#xff0c;将一棵树按照层序遍历将他列出来&#xff0c;如下图所示&#xff1a; 我们想一下&#xff0c;按照层序遍历的顺序应该是 1243567 。按照这个设想&#xff0c;我给大家讲解一下这个整体过程。 层序遍历介绍 层序遍历就是将树放入队列中&#x…

springboot社区垃圾回收处理小程序-计算机毕业设计源码71905

摘要 在数字化高速发展的今天&#xff0c;随着Spring Boot等轻量级框架的广泛应用&#xff0c;各种小程序、微服务如雨后春笋般涌现&#xff0c;极大地丰富了我们的软件生态系统。然而&#xff0c;伴随着这些应用的迅速增加&#xff0c;垃圾回收处理成为了一个不可忽视的问题。…

TensorFlow系列:第四讲:MobileNetV2实战

一. 加载数据集 编写工具类&#xff0c;实现数据集的加载 import keras""" 加载数据集工具类 """class DatasetLoader:def __init__(self, path_url, image_size(224, 224), batch_size32, class_modecategorical):self.path_url path_urlself…

PostgreSQL日志文件配置,记录所有操作记录

为了更详细的记录PostgreSQL 的运行日志&#xff0c;我们一般需要修改PostgreSQL 默认的配置文件&#xff0c;这里整理了一些常用的配置 修改配置文件 打开 PostgreSQL 配置文件 postgresql.conf。该文件通常位于 PostgreSQL 安装目录下的 data 文件夹中。 找到并修改以下配…

1.10-改进CBOW模型的学习

文章目录 0引言1 cupy包的安装2解决VScode中matplotlib绘图不显示的问题3 CBOW模型学习的实现4 CBOW模型对更复杂模式的捕捉5单词向量的评价方法6总结 0引言 本节将前面实现的改进的CBOW模型在PTB数据集上跑一遍由于希望跟书上一样调用GPU&#xff0c;因此需要安装cupy包&…

前端Canvas入门——一些注意事项

创建渐变的三种方法&#xff1a; createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变&#xff08;放射性渐变&#xff09; createConicGradient() - 锥形渐变 这三种的核心观点都是&#xff1a; 创建一个gradient对象&#xff0c;然后调用addColorStop()方法…

【软件测试】自动化测试常用函数 -- 详解

一、WebDriver API 一个简单自动化脚本的构成&#xff1a; 脚本解析 # coding utf-8 from selenium import webdriver import time browser webdriver.Firefox() time.sleep(3) browser.get("http://www.baidu.com") time.sleep(3) browser.find_element_by_id(…

Photoshop

彩色转灰度&#xff1a;ctrlshiftu 背景转黑色&#xff1a; 魔术棒容差10 shift连选 shiftF5&#xff08;填充&#xff09;钢笔选择 路径 工作路径 将路径作为选区载入 点回图层 按ctrlx删除选区 待更新

[C++]——同步异步日志系统(5)

同步异步日志系统 一、日志消息格式化设计1.1 格式化子项类的定义和实现1.2 格式化类的定义和实现 二、日志落地类设计2.1 日志落地模块功能实现与测试2.2 日志落地模块功能功能扩展 一、日志消息格式化设计 日志格式化模块的作用&#xff1a;对日志消息进行格式化&#xff0c…

Windows 子系统WSL2 Ubuntu使用事项

Windows 子系统WSL2 Ubuntu使用事项 要使外部设备能够访问运行在 Windows 上的 WSL2 实例&#xff0c;你可以端口转发的方法。由于 WSL2 是在虚拟化环境中运行&#xff0c;直接访问比 WSL1 更为复杂. 1 如何实现子系统可以被外部系统SSH 1.1 端口转发: 通过windows代理WSL2的…