项目中,有时候需要对系统中已处理的一些业务数据日志进行提取分析,通常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. [Codeforces Round #443]Div2 C Short Program

    给你一串$n$个按顺序的位运算操作(&,|,^),形如"opt x",要求用不超过5行的位运算,按顺序操作出来和那个结果是一样的.$(n<=5e5,0<=x&l ...

  2. 让菜鸡讲一讲网络流(isap)

    让我先讲一个故事吧. 一些小精灵要准备从银月城(S)迁徙到Nibel山(T). 这两个地方之间的道路构成了一个网络. 每个道路都有它自己的容量,这决定了每天有多少小精灵可以同时从这儿通过. 现在它们想 ...

  3. 快速登录机器&数据库

    本文来自网易云社区. 作者:盛国存 背景 我们日常在使用ApiDoc维护管理api文档,提高了api文档的整体维护性.但在老旧接口中,补充接口注解无疑是一次繁重的体力劳动.仔细查看,大多数接口的格式 ...

  4. 新生 & 语不惊人死不休 —— 《无限恐怖》读后有感

    开篇声明,我博客中“小心情”这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心情也是瞬息万变的.因 ...

  5. 【Minimum Window】cpp

    题目: Given a string S and a string T, find the minimum window in S which will contain all the charact ...

  6. 4.实现简单的shell sed替换功能

    # -*- coding:utf-8 -*- # Author: JACK ZHAO # 程序1: 实现简单的shell sed替换功能 import sys #判断参数个数 if len(sys.a ...

  7. Python全栈工程师(每周总结:3)

     ParisGabriel                                                           每天坚持 一天一篇 点个订阅吧  灰常感谢    当个死 ...

  8. python中的re模块,常用函数介绍

    参考: http://www.cnblogs.com/tina-python/p/5508402.htm ======== 1,预定义字符集,可以写在字符集[....]中 \d  数字: \D 非数字 ...

  9. 关于jdk与jre的区别

    JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程 ...

  10. 使用“\n\t”将多行字符串拼接起来

    以前js拼接字符串有好多 \n \t 不使用ES6 使用"\n\t"将多行字符串拼接起来: var roadPoem = 'Then took the other, as just ...