项目中,有时候需要对系统中已处理的一些业务数据日志进行提取分析,通常log4j默认提供的日志级别可能不够用,这时候我们就需要对日志级别进行扩展,以满足我们的需求.

本文就简单介绍一下log4j2的日志级别扩展,直接上代码:

 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;
import org.apache.logging.log4j.spi.AbstractLogger;
import org.apache.logging.log4j.spi.ExtendedLoggerWrapper;
import org.apache.logging.log4j.util.MessageSupplier;
import org.apache.logging.log4j.util.Supplier; /**log4j2日志扩展,支持业务日志
* 业务日志为最高级别
* 使用方式与扩展前基本相同:</br>
* 使用CustomLogger log=CustomLogger.getLogger(loggerName);</br>
* 替代原来的:Logger log=LogManager.getLogger(loggerName);</br>
* 记录用于数据分析的业务日志 使用log.business(msg);</br>
* @author jessezeng
*
*/
public final class CustomLogger extends ExtendedLoggerWrapper {
private static final long serialVersionUID = 103418572168532L;
private final ExtendedLoggerWrapper logger; private static final String FQCN = CustomLogger.class.getName();
private static final Level BUSINESS = Level.forName("BUSINESS", 50); private CustomLogger(final Logger logger) {
super((AbstractLogger) logger, logger.getName(), logger.getMessageFactory());
this.logger = this;
} public static CustomLogger getLogger() {
final Logger wrapped = LogManager.getLogger();
return new CustomLogger(wrapped);
} public static CustomLogger getLogger(final Class<?> loggerName) {
final Logger wrapped = LogManager.getLogger(loggerName);
return new CustomLogger(wrapped);
} public static CustomLogger getLogger(final Class<?> loggerName, final MessageFactory factory) {
final Logger wrapped = LogManager.getLogger(loggerName, factory);
return new CustomLogger(wrapped);
} public static CustomLogger getLogger(final Object value) {
final Logger wrapped = LogManager.getLogger(value);
return new CustomLogger(wrapped);
} public static CustomLogger getLogger(final Object value, final MessageFactory factory) {
final Logger wrapped = LogManager.getLogger(value, factory);
return new CustomLogger(wrapped);
} public static CustomLogger getLogger(final String name) {
final Logger wrapped = LogManager.getLogger(name);
return new CustomLogger(wrapped);
} public static CustomLogger getLogger(final String name, final MessageFactory factory) {
final Logger wrapped = LogManager.getLogger(name, factory);
return new CustomLogger(wrapped);
} public void business(final Marker marker, final Message msg) {
logger.logIfEnabled(FQCN, BUSINESS, marker, msg, (Throwable) null);
} public void business(final Marker marker, final Message msg, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, marker, msg, t);
} public void business(final Marker marker, final Object message) {
logger.logIfEnabled(FQCN, BUSINESS, marker, message, (Throwable) null);
} public void business(final Marker marker, final Object message, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, marker, message, t);
} public void business(final Marker marker, final String message) {
logger.logIfEnabled(FQCN, BUSINESS, marker, message, (Throwable) null);
} public void business(final Marker marker, final String message, final Object... params) {
logger.logIfEnabled(FQCN, BUSINESS, marker, message, params);
} public void business(final Marker marker, final String message, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, marker, message, t);
} public void business(final Message msg) {
logger.logIfEnabled(FQCN, BUSINESS, null, msg, (Throwable) null);
} public void business(final Message msg, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, null, msg, t);
} public void business(final Object message) {
logger.logIfEnabled(FQCN, BUSINESS, null, message, (Throwable) null);
} public void business(final Object message, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, null, message, t);
} public void business(final String message) {
logger.logIfEnabled(FQCN, BUSINESS, null, message, (Throwable) null);
} public void business(final String message, final Object... params) {
logger.logIfEnabled(FQCN, BUSINESS, null, message, params);
} public void business(final String message, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, null, message, t);
} public void business(final Supplier<?> msgSupplier) {
logger.logIfEnabled(FQCN, BUSINESS, null, msgSupplier, (Throwable) null);
} public void business(final Supplier<?> msgSupplier, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, null, msgSupplier, t);
} public void business(final Marker marker, final Supplier<?> msgSupplier) {
logger.logIfEnabled(FQCN, BUSINESS, marker, msgSupplier, (Throwable) null);
} public void business(final Marker marker, final String message, final Supplier<?>... paramSuppliers) {
logger.logIfEnabled(FQCN, BUSINESS, marker, message, paramSuppliers);
} public void business(final Marker marker, final Supplier<?> msgSupplier, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, marker, msgSupplier, t);
} public void business(final String message, final Supplier<?>... paramSuppliers) {
logger.logIfEnabled(FQCN, BUSINESS, null, message, paramSuppliers);
} public void business(final Marker marker, final MessageSupplier msgSupplier) {
logger.logIfEnabled(FQCN, BUSINESS, marker, msgSupplier, (Throwable) null);
} public void business(final Marker marker, final MessageSupplier msgSupplier, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, marker, msgSupplier, t);
} public void business(final MessageSupplier msgSupplier) {
logger.logIfEnabled(FQCN, BUSINESS, null, msgSupplier, (Throwable) null);
} public void business(final MessageSupplier msgSupplier, final Throwable t) {
logger.logIfEnabled(FQCN, BUSINESS, null, msgSupplier, t);
}
}

代码实际上很简单,需要注意的地方是:

 26     private static final Level BUSINESS = Level.forName("BUSINESS", );  // 50用于指定级别

注意上面红色的数字,这个数字用于指定级别的高低,可以根据自己的需要定义不同的值,log4j2中默认级别值可以参考如下:

     OFF(0),

     FATAL(100),

     ERROR(200),

     WARN(300),

     INFO(400),

     DEBUG(500),

     TRACE(600),

     ALL(Integer.MAX_VALUE);

log4j2 扩展日志级别,支持将系统日志与业务处理日志拆分的更多相关文章

  1. 使用log4j2分离系统日志与业务日志

    前一篇文章介绍了log4j2 扩展日志级别,支持将系统日志与业务处理日志拆分,现在介绍一下通过日志级别将系统日志与业务日志分类,要达到这个目的很容易,只需要配置一下log4j的xml文件: <? ...

  2. log4j2和logback动态修改日志级别工具类

    工作中,在排查线上问题时,有以下场景在不重新部署或重启服务的情况下,需要动态调整线上日志级别 1.线上有些日志打印过多干扰有用的日志,需要动态修改线上日志记录器的打印日志级别,调高一些日志级别,打印出 ...

  3. java log4j基本配置及日志级别配置详解

    java log4j日志级别配置详解 1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾 ...

  4. SpringBoot实用小技巧之动态设置SpringBoot日志级别

    有时线上问题我们用打日志的方式来观察错误或埋点参数,但由于这些日志如果都打出来会占用大量存储空间而且覆盖了一些有效信息,所以线上级别一般设置INFO,调试级别用作特殊情况下.此时如果线上想查看调试级别 ...

  5. Spring Boot 测试时的日志级别

    1.概览 该教程中,我将向你展示:如何在测试时设置spring boot 日志级别.虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的. 2.日志级别的重要性 ...

  6. SpringBoot日志配置(详解) 涉及控制台输出日志、生成日志文件、日志级别修改、hibernate日志不输出

    写在前面 本篇主要讲述日志配置,看完本篇可以解决下述问题, 控制台输出日志.生成日志文件.日志级别修改.hibernate日志不输出 Git Demo Path:https://github.com/ ...

  7. Log4j配置记录(特定java包/类的日志级别控制)

    最近使用log4j,关于日志级别的如何配置生效百思不得其解,花了些时间,误打误撞终于整了,记录一下,备忘. 注意: 1.图中的2(log4j.logger.com.taobao)限制级别最高,它直接指 ...

  8. Log4j.properties 属性详解以及 LOG4J日志级别详解

    转自:https://blog.csdn.net/lovely0903jpp/article/details/82261607 假如项目的生产环境上增加请求以及响应信息的打印,这个时候,对于新手来说, ...

  9. springboot中动态修改logback日志级别

    springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...

随机推荐

  1. 初见akka-02:rpc框架

    1.RPC:简单点说,就是多线程之间的通信,我们今天用了scala以及akka 来简单的实现了 rpc框架的一些简单的内容,一脸包括了,心跳,间隔时间, 注册以及一些问题, 模式匹配的一些东西,虽然比 ...

  2. 课后题2.87&2.86

    课后题2.86&2.87 单纯就是想加点分第十章的题目都被做过了就做下第二章的,正好复习一下前面学的知识,第二章给我剩下的题目也不多了,我就挑了这个题目. 2.86 考虑一个基于IEEE浮点格 ...

  3. 17 rest-framework框架的基本组件

    序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式.我们可以通过声明与Django ...

  4. RelativeLayout 深入理解

    今天做app底部的导航栏,就是会有一个分割线,分割内容和下面的fragmenttablehost,那条线,我看开源中国是用relativelayout包裹的. 我也包裹,但是不行.显示不出来那条线. ...

  5. curl 编译

    curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本.支持很多协议:FTP, FTPS, HT ...

  6. nohup 重定向的问题-- 费元星 站长

    费元星 大牛 以前只知道使用nohup可以让一个程序后台执行,但是生成的日志文件都放到nohup.out中了,不能自己指定,尤其是在同一个目录下我需要让两个甚至多个程序都要后台执行时,这样看日志就比较 ...

  7. vlc 编译

    一.有用的网址: https://forum.videolan.org/search.php 二.只编译Java apk部分: source env.shmake distcleanmake -e 编 ...

  8. Linux - Shell - 常用方法 - 备忘录

    $? 上一个指令的返回值 =成功,=失败 dmesg 检测系统开机启动信息 $() 对命令的替换,同`` ${} 对变量的替换,同$var $(()) 对内部内容进行整数运算 i= grep AAA ...

  9. Oracle 学习---- 练习语法 循环( loop end loop; for ;while; if elsif end if )

    /*--set serveroutput on;declare mynum number(3) :=0; tip varchar2(10):='结果是 ';begin mynum:=10+100; d ...

  10. django QuerySet 的常用API

    为了加深对queryset对象api的了解,我们建立了以下示例模型: from django.db import models class Author(models.Model): "&q ...