SpringBoot 项目中使用Log4j2详细(避坑)

SpringBoot 项目中使用Log4j2详细(避坑)以下大部分内容转载整理自 https blog csdn net vbirdbest article details 感谢 vbirdbest 的相关知识分享首先 认识一下三胞胎 log4j 是 apache 实现的一个开源日志组件 logback 同样是由 log4j 的作者设计完成的 拥有更好的特性 用来取代 log4j 的一个日志框架 是 slf4j 的原生实现 Log4j2 是

以下大部分内容转载整理自 log4j2 实际使用详解_vbirdbest的博客-CSDN博客_log4j2 ,感谢 vbirdbest 的相关知识分享

首先,认识一下三胞胎

  • log4j 是apache实现的一个开源日志组件
  • logback 同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现
  • Log4j2 是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活

然后,了解一下,使用slf4j+log4j和直接用log4j的区别

slf4j 是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback),使用接口的好处是当项目需要更换日志框架的时候,只需要更换jar和配置,不需要更改相关java代码

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestSlf4j { // Logger和LoggerFactory导入的是org.slf4j包 private final static Logger logger = LoggerFactory.getLogger(TestSlf4j .class); }

log4j、logback、log4j2都是一种日志具体实现框架,所以既可以单独使用也可以结合slf4j一起搭配使用

import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TestLog4j { // Logger和LogManager导入的是org.apache.logging包 private static final Logger LOG = LogManager.getLogger(TestLog4j.class); }

一、导入需要使用的jar包(slf4j+log4j2)

springboot项目中需导入

 
   
   
     org.springframework.boot 
    
   
     spring-boot-starter-log4j2 
    
  

绕坑:如项目中有导入spring-boot-starter-web依赖包记得去掉spring自带的日志依赖spring-boot-starter-logging,如下:

 
   
   
     org.springframework.boot 
    
   
     spring-boot-starter-web 
    
    
     
     
       org.springframework.boot 
      
     
       spring-boot-starter-logging 
      
     
    
  

二、开始配置

springboot方式:

application.properties中添加配置 logging.config=classpath:log4j2_dev.xml,  log4j2_dev.xml是你创建的log4j2的配置文件名,放在resources下,如放在其他路径则对应修改

Web工程方式:

 
   
   
     log4jConfiguration 
    
   
     /WEB-INF/conf/log4j2.xml 
    
   
   
   
     org.apache.logging.log4j.web.Log4jServletContextListener 
    
   

纯Java方式:

public static void main(String[] args) throws IOException { File file = new File("D:/log4j2.xml"); BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); final ConfigurationSource source = new ConfigurationSource(in); Configurator.initialize(null, source); Logger logger = LogManager.getLogger("myLogger"); } 

配置文件的格式:log2j配置文件可以是xml格式的,也可以是json格式的, 
配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件,如果都没有找到,则会按默认配置输出,也就是输出到控制台,也可以对配置文件自定义位置(需要在web.xml中配置),一般放置在src/main/resources根目录下即可 

贴上log4j2_dev.properties的配置再来讲解

 
   
   
    
    
      D:/logs 
     
    
      mylog 
     
    
      info 
     
    
    
     
      
     
     
      
      
       
       
      
      
     
    
    
     
      
      
     
     
      
     
    
  

log4j2.xml文件的配置大致如下:

  • Configuration 
    • properties
    • Appenders 
      • Console 
        • PatternLayout
      • File
      • RollingRandomAccessFile
      • Async
    • Loggers 
      • Logger
      • Root 
        • AppenderRef

  • Configuration:为根节点,有status和monitorInterval等多个属性
    • status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用于控制log4j2日志框架本身的日志级别,如果将stratus设置为较低的级别就会看到很多关于log4j2本身的日志,如加载log4j2配置文件的路径等信息
    • monitorInterval,含义是每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置
  • Appenders:输出源,用于定义日志输出的地方 
    log4j2支持的输出源有很多,有控制台Console、文件File、RollingRandomAccessFile、MongoDB、Flume 等

    • Console:控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,以便调试
    • File:文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/mylog.log)
    • RollingRandomAccessFile: 该输出源也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则 
      这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。

      • fileName 指定当前日志文件的位置和文件名称
      • filePattern 指定当发生Rolling时,文件的转移和重命名规则
      • SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling
      • DefaultRolloverStrategy 指定最多保存的文件个数
      • TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟
      • TimeBasedTriggeringPolicy 指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件
    • NoSql:MongoDb, 输出到MongDb数据库中
    • Flume:输出到Apache Flume(Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。)
    • Async:异步,需要通过AppenderRef来指定要对哪种输出源进行异步(一般用于配置RollingRandomAccessFile)

    PatternLayout:控制台或文件输出源(Console、File、RollingRandomAccessFile)都必须包含一个PatternLayout节点,用于指定输出文件的格式(如 日志输出的时间 文件 方法 行数 等格式),例如 pattern=”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”

    %d{HH:mm:ss.SSS} 表示输出到毫秒的时间 %t 输出当前线程名称 %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 %logger 输出logger名称,因为Root Logger没有名称,所以没有输出 %msg 日志文本 %n 换行 其他常用的占位符有: %F 输出所在的类文件名,如Log4j2Test.java %L 输出行号 %M 输出所在方法名 %l 输出语句所在的行数, 包括类名、方法名、文件名、行数 
  • Loggers:日志器 
    日志器分根日志器Root和自定义日志器,当根据日志名字获取不到指定的日志器时就使用Root作为默认的日志器,自定义时需要指定每个Logger的名称name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别level,相加性additivity(是否继承下面配置的日志器), 对于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源AppenderRef;

    每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR

    additivity指定是否同时输出log到父类的appender,缺省为true。

 
    
     
   
  • properties: 属性 
    使用来定义常量,以便在其他配置的时候引用,该配置是可选的,例如定义日志的存放位置 
    D:/logs




三、验证日志内容

以下为练习写的excel数据存入数据库的controller层代码,其中加入Log4j2

import cn.tbj.service.ExcelService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @RestController @RequestMapping("/user") public class UserController { public final static Logger logger = LoggerFactory.getLogger(UserController.class); @Autowired private ExcelService excelService; @PostMapping("/import") public boolean addUser(@RequestParam("file") MultipartFile file) { boolean a = false; String filename = file.getOriginalFilename(); System.out.println("++++++++++++文件名++++++++"+filename); logger.trace("trace level"); logger.debug("debug level"); logger.info("info level"); logger.warn("warn level"); logger.error("error level"); long beginTime = System.currentTimeMillis(); logger.info("请求处理结束,耗时:{}毫秒", (System.currentTimeMillis() - beginTime)); //第一种用法 logger.info("请求处理结束,耗时:" + (System.currentTimeMillis() - beginTime) + "毫秒"); //第二种用法 try { a = excelService.batchImport(filename, file); } catch (Exception e) { e.printStackTrace(); } return a ; } }

尝试一些正常和错误的操作,以下为反馈的日志信息

SpringBoot 项目中使用Log4j2详细(避坑)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227567.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午9:01
下一篇 2026年3月16日 下午9:01


相关推荐

  • web图书销售管理系统_图书管理系统的主要功能有哪些?

    web图书销售管理系统_图书管理系统的主要功能有哪些?我们都已经了解到图书管理系统使用带来的好处,那么图书管理系统到底能给图书管理实现哪些功能。1、基础资料商品信息齐全,易学易用商品信息,供货商,客户,员工,仓库等基本参数的设置。支持一品多码管理。可快速检索商品,提高收银效率。可按岗位角色分组、分层、分级进行自定义权限管理。2、采购管理按需采购商商品,节省库存成本系统提出按需采购,市场拉动采购理念,减少库存积压,提高存货流转率。系统按照库存上下限来建…

    2022年6月11日
    39
  • vim编辑器显示行数过多_vim查看指定行

    vim编辑器显示行数过多_vim查看指定行设置ubuntu的vim编辑器显示行数,方法如下:1.打开终端输入:sudovi/etc/vim/vimrc,打开vim的配置文件(使用sudo可忽视vimrc文件的readonly属性);2.在配置文件中,找到最底行,点击键盘a键,打开输入模式;3.输入:setnu,设置显示行数;4.点击键盘esc键,退出输入模式,点击shift+:,输入:wq,保存退出;至此所有用vim打开的…

    2025年7月21日
    7
  • Ubuntu18.04下命令行安装Microsoft Edge[通俗易懂]

    Ubuntu18.04下命令行安装Microsoft Edge[通俗易懂]Ubuntu18.04下安装MicrosoftEdge一、命令行启用MicrosoftEdge存储库二、使用安装软件包apt三、出错原因一、命令行启用MicrosoftEdge存储库1.以sudo特权身份运行以下命令来更新程序包索引并安装依赖项sudoaptupdatesudoaptinstallsoftware-properties-commonapt-transport-httpswget2.导入MicrosoftGPG密钥wgetwget-qhttps://p

    2022年7月21日
    27
  • 阿里云 ddns

    阿里云 ddns需求 外网 公司 网吧 小黑屋 想访问自己家 闺蜜男友 家庭宽带 没有固定 IP 重启一次猫 路由器 换一个 IP 分析需求 家里的宽带是动态公网 IP 还是小区局域网 IP 检查方式 浏览器打开 ip138 com 看看自己的 IP 记录下来浏览器打开自己路由器 例如 192 168 1 1 账号密码 两个红框相等是公网动态 IP 傻瓜式简单的愉快玩耍 两个红框不等是你们小区或者运营商的局域网 IP 我劝你放弃 因为内网穿透 你会怀疑人生

    2026年3月19日
    2
  • http数据协商

    http数据协商

    2021年6月13日
    116
  • Springboot源码解读

    Springboot源码解读1 解读源码的意义 为什么要解读源代码 直接使用别人封装好的框架不香吗 答案如下 随着互联网的快速发展 加上 java 跨平台等强大特性 导致 java 程序员需求日益剧增 很多高校 培训机构都为了填补市场需求 大批量的培养 java 程序员 导致很多 java 程序员只知其然 不知其所以然 java 程序员有种饱和的趋势 加上疫情的原因 很多中小型公司的收入大幅下降 他们可能选择缩招或者裁员 很多只会写增删改查 只会调用 api 接口 只会使用框架对其原理不深入的 java 程序员都会面临淘汰的趋势 解读源码的

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号