Log4j2不同级别的日志写入到不同文件+扩展日志级别实现业务日志分类

学习笔记:日志的分类以及LogCenter 网络设备在运行过程中输出的信息称为日志,实时了解网络中各种业务的运行状态,掌握网络设备上各个功能模块的运行情况。 • 防火墙支持输出如下日志: 会话日志: o 报文经过防火墙处理后将会在防火墙上建立会话。防火墙支持会话信息的输出,管理员可以根据实际需要,选择在会话老化后输出、新建会话时输出、或者定期输出会话信息。 丢包日志: o 报文被防火墙丢弃后,防火墙支持将报文的信息以及被丢弃的原因输出。报文... 阅读详情

目录

前言

1.不同级别的日志输出到不同的文件

1.1    自定义RollingFile配置

1.2    自定义Console

1.3    Async异步输出

1.4    自定义Logger配置

1.5    自定义统一日志类LogUtil.java

1.6    使用说明

1.6.1.1 通过LogUtil创建业务类日志对象

1.6.1.2 使用业务类日志对象

1.7    日志输出样式

2.扩展日志级别

2.1    自定义日志级别

2.2    自定义RollingFile配置

2.3    Async异步输出

2.4    root引入扩展日志级别

2.5    自定义统一日志类LogUtil.java

2.6    StandardLevel

2.7    使用说明

2.7.1 通过LogUtil创建业务类日志对象

2.7.2 使用业务类日志对象

 

2.8    日志输出样式

3.动态Appender

4.扩展log4j2自定义Appender


前言

该篇适合于工程项目已有对info、warn、error等不同级别日志的统一拦截,仍需要根据业务将不同业务的日志分级别输出到不同的文件中,这些日志文件只有该业务的日志,不含有系统其它业务、框架等的日志;网上很多都是千篇一律的东西,内容老旧,错误百出,不能解决问题,该篇文章是将实际的集成过程整理,并将遇到的问题进行了说明,另外java代码实现动态日志附加器是根据log4j2的新方法实现,不是网上都在转的log4j(很多方法会显示已启用),可供大家参考。

设计思路:

  • 首先定义业务名称,日志输出的时候带有该业务的名称(日志格式可以灵活设置)
  • 其次通过统一的LogUtil工具类进行输出,并将logger标签配置到LogUtil,这样做的目的是避免系统已存在的日志附加器RollingFile配置输出的日志写入到业务日志文件,造成日志混乱,
  • 统一的LogUtil类,通过集成原生的ExtendedLoggerWrapper既实现了日志级别的扩展,也可以在业务类使用LogUtil的时候通过工厂模式获取到当前业务类的日志对象,从而通过该对象获取到业务类的全路径,方便日志输出的灵活改造。
  • 最后扩展日志级别,扩展的日志级别主要用于补充业务场景,更多的用在公共组件、中间件内部进行输出(根据实际情况和要求设计)。

这里再说一下,如果对整个系统实现不同级别的日志写入到不同的文件,以下的配置修改一下即可,而且不需要创建LogUtil,也不需要扩展日志级别,配置好RollingFile,Console,直接引入到root(实际上是使用了默认的日志检测路径)就可以实现。

1.不同级别的日志输出到不同的文件

1.1    自定义RollingFile配置

自定义Customer类型、INFO级别日志输出

名称:CustomerInfoLog

存储路径:项目配置路径+ /logs/Customer/CustomerInfo.log

日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"

其他内容参考以下配置:LOG_HOME是自己配置的项目日志路径property;FILE_DEADLINE是自己配置的保存时间property。

 

 

<!-- 自定义Customer类型INFO级别日志附加器 -->
<!-- 滚动文件生成 fileName日志文件名称,filePattern压缩文件路径 -->
<RollingFile name="CustomerInfoLog" fileName="${LOG_HOME}/logs/Customer/CustomerInfo.log"
filePattern="${LOG_HOME}/logs/Customer/CustomerInfo/CustomerInfo-%d{MM-dd-yyyy}-%i.log.gz">
    <!-- 过滤日志级别 info及以上 -->
    <Filters>
        <ThresholdFilter onMismatch="NEUTRAL" onMatch="DENY" level="WARN"/>
        <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
    </Filters>
    <!-- 指定日志输出格式 -->
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
    <!-- 新文件生成策略,每100M生成一个新文件 -->
    <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB" />
    </Policies>
    <!-- 默认过度策略,不设置,则默认为最多同一文件夹下7个文件 大于此值会删除旧的日志文件 -->
    <DefaultRolloverStrategy>
        <!-- 文件删除策略,basePath扫描路径,maxDepth目录的最大级别数,IfFileName文件名称,IfLastModified指定持续时间(7天前)-->
        <Delete basePath="${LOG_HOME}" maxDepth="4">
            <IfFileName glob="*/Customer/CustomerInfo/CustomerInfo-*.log.gz" />
            <IfLastModified age="${FILE_DEADLINE}" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

自定义Customer类型、WARN级别日志输出

名称:CustomerWarnLog

存储路径:项目配置路径+ /logs/Customer/CustomerWarn.log

日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"

其他内容参考以下配置:LOG_HOME是自己配置的项目日志路径property;FILE_DEADLINE是自己配置的保存时间property。

<!-- 自定义WARN级别日志附加器 -->
<!-- 滚动文件生成 fileName日志文件名称,filePattern压缩文件路径 -->
<RollingFile name="CustomerWarnLog" fileName="${LOG_HOME}/logs/Customer/CustomerWarn.log"
filePattern="${LOG_HOME}/logs/Customer/CustomerWarn/CustomerWarn-%d{MM-dd-yyyy}-%i.log.gz">
    <!-- 过滤日志级别 info及以上 -->
    <Filters>
        <ThresholdFilter onMismatch="NEUTRAL" onMatch="DENY" level="ERROR"/>
        <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
    </Filters>
    <!-- 指定日志输出格式 -->
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
     <!-- 新文件生成策略,每100M生成一个新文件 -->
     <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB" />
    </Policies>
    <!-- 默认过度策略,不设置,则默认为最多同一文件夹下7个文件 大于此值会删除旧的日志文件 -->
    <DefaultRolloverStrategy>
        <!-- 文件删除策略,basePath扫描路径,maxDepth目录的最大级别数,IfFileName文件名称,IfLastModified指定持续时间(7天前)-->
        <Delete basePath="${LOG_HOME}" maxDepth="4">
            <IfFileName glob="*/Customer/CustomerWarn/CustomerWarn-*.log.gz" />
            <IfLastModified age="${FILE_DEADLINE}" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

自定义Customer类型、ERROR级别日志输出

名称:CustomerErrorLog

存储路径:项目配置路径+ /logs/Customer/CustomerError.log

日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"

其他内容参考以下配置:LOG_HOME是自己配置的项目日志路径property;FILE_DEADLINE是自己配置的保存时间property。

<!-- 自定义ERROR级别日志附加器 -->
<!-- 滚动文件生成 fileName日志文件名称,filePattern压缩文件路径 -->
<RollingFile name="CustomerErrorLog" fileName="${LOG_HOME}/logs/Customer/CustomerError.log"
filePattern="${LOG_HOME}/logs/Customer/CustomerError/CustomerError-%d{MM-dd-yyyy}-%i.log.gz">
    <!-- 过滤日志级别 info及以上 -->
    <Filters>
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
    </Filters>
    <!-- 指定日志输出格式 -->
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
    <!-- 新文件生成策略,每100M生成一个新文件 -->
    <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB" />
    </Policies>
    <!-- 默认过度策略,不设置,则默认为最多同一文件夹下7个文件 大于此值会删除旧的日志文件 -->
    <DefaultRolloverStrategy>
        <!-- 文件删除策略,basePath扫描路径,maxDepth目录的最大级别数,IfFileName文件名称,   IfLastModified指定持续时间(7天前)-->
        <Delete basePath="${LOG_HOME}" maxDepth="4">
            <IfFileName glob="*/Customer/CustomerError/CustomerError-*.log.gz" />
            <IfLastModified age="${FILE_DEADLINE}" />
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

1.2    自定义Console

自定义Customer类型、CONSOLE(控制台)日志输出

名称:CustomerCONSOLE

日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"

<Console name="CustomerCONSOLE" target="system_out">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
</Console>

日志输出格式如下:

2020-11-22 20:07:06.927 |-INFO  [http-nio-9991-exec-1] Customer [] com.xxx.controller.TestController -|  xxxxxxxxx

1.3    Async异步输出

将Customer日志类型的INFO、WARN、ERROR的RollingFile以及自定义的CONSOLE引入

<Async name="AsyncCustomerInfoLog">
    <AppenderRef ref="CustomerInfoLog"/>
</Async>
<Async name="AsyncCustomerWarnLog">
    <AppenderRef ref="CustomerWarnLog"/>
</Async>
<Async name="AsyncCustomerErrorLog">
    <AppenderRef ref="CustomerErrorLog"/>
</Async>
<Async name="AsyncCustomerCONSOLE">
	<AppenderRef ref="CustomerCONSOLE"/>
</Async>

1.4    自定义Logger配置

name:com.xxx.util.LogUtil     指向统一日志类,由该类统一输出日志

level:info   级别不能高于引入的附加器(appender)的最低等级

<!-- 使用LogUtil输出日志的,写入到指定的文件 -->
<Logger name="com.xxx.util.LogUtil" level="info" additivity="false">
    <AppenderRef ref="AsyncCustomerCONSOLE" />
    <AppenderRef ref="AsyncCustomerInfoLog"/>
    <AppenderRef ref="AsyncCustomerWarnLog"/>
    <AppenderRef ref="AsyncCustomerErrorLog"/>
</Logger>

注意:自定义的异步RollingFile和Console不能引入到root中,否则,导致其他路径下的同级别日志也会写入到自定义的文件中。

loggers配置说明

  • name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。一般是项目包名或者框架的包名
  • level:日志输出级别,未指定级别,则默认为 ERROR
  • AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出

1.5    自定义统一日志类LogUtil.java

关键代码:

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MessageFactory;
im
Web项目中Log4j日志集成实战案例 Log4j作为Apache基金会开源的日志记录工具,自诞生以来便成为Java应用中最广泛使用的日志框架之一。其设计目标是高效、灵活、可配置地记录应用程序运行过程中的关键信息。本章将系统阐述Log4j的基本架构与三大核心组件——Logger、Appender和Layout的工作机制,深入剖析其线程安全、异步日志支持以及性能优化策略。根Logger是整个日志系统的起点,所有未明确指定Logger名称的记录请求都将继承其配置。其基本语法如下:# 设置根Logger级别和关联的Appender。 阅读详情

相关推荐

【VAX 小番茄安装详细步骤】

本文详细介绍了在VS2022环境下安装Visual Assist X(番茄助手)的步骤及常见问题解决方案。主要内容包括:安装前的兼容性设置(需修改为Windows7兼容模式)、安装流程(卸载旧版本、勾选对应VS版本、替换关键dll文件)以及常见问题处理(如安装失败、工具栏图标缺失等)。文章提供了完整的下载链接和操作截图,特别强调了安装失败后的清理方法(注册表、安装目录和残余文件删除)。最后给出了安装成功后的测试运行指引。

qq_23962581的博客 1702

基于vue2的echarts3D地球

采用vue2+js实现了echarts3D地球的放大、缩小和旋转

qq_44699269的博客 1129

防止加入域主机脱离域的控制(管理员权限)

一、简介   当公司所有主机加入到域后,SA首要工作就是防止加入域的主机脱离域的控制。让我发现该工作的必要性是一程序猿,前一天刚配完禁止执行QQ、微信执行,第二天就看到那家伙在用微信聊天,肯定是用回旧的本地账号登陆了。   本人所在公司安装软件的类型繁杂,无管理员权限运行不少软件会报错,不得不授予「域账号」本地管理员权限。过大的权限带也来了一系列后果:用户可随意退出域、创建本地管理员...

der69615的博客 3166

【深度学习3】ubuntu22.04从零开始搭建深度学习环境

ubuntu22.04从零开始搭建深度学习开发环境

weixin_43387635的博客 1万+

阿里云Ubuntu部署Steam饥荒联机版服务器:从零到多人联机的完整指南

本文详细介绍了在阿里云Ubuntu系统上部署Steam饥荒联机版服务器的完整流程,包括环境准备、SteamCMD安装、服务端配置、Mod管理及后台运行技巧。通过2核4GB的ECS实例配置和端口设置,实现5人流畅联机体验,适合游戏爱好者快速搭建专属服务器。

weixin_29229261的博客 1014

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

SAP SEGW 事物码里的 Function Import

开放数据协议(OData)包括标准的 CRUD (创建、检索、更新和删除)操作,这些操作映射到 HTTP 方法的 POST、GET、PUT/MERGE 和 Delete 几类。此外,OData还支持进一步的服务操作:,这些操作可以由HTTP方法GET或POST调用,用于处理不能映射到标准 CRUD 操作的任何内容。通过在数据模型中创建 ,可以在 service Builder 中实现此类额外的服务操作。例如,您可以为以下自定义操作创建函数导入:Work Item confirmation检查航班的可用性虽然

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 986

AI测试入门:基于 RAG 的 LLM 应用程序的测试方法「详细介绍」

一个典型的 RAG 架构包括一个检索器(对知识库进行矢量搜索检索上下文的组件)和一个生成器(从检索器中获取检索上下文以构建提示并生成自定义 LLM 响应作为最终输出的组件)。在大多数情况下, 知识库”由存储在向量数据库(如 ChromaDB)中的向量嵌入组成。

blues_C的博客 1868

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: SpringBoot集成JPA+hikariCP连接池实现增删改查以及相关的注意事项
下一篇: log4j2自定义appender插件源码、配置及采坑说明
Dame Time
博客等级 码龄10年 7粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值