项目中,有时候需要对系统中已处理的一些业务数据日志进行提取分析,通常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. Ubuntu 16.04上安装并配置Postfix作为只发送SMTP服务器

    如果大家已经在使用第三方邮件服务方案发送并收取邮件,则无需运行自己的邮件服务器.然而,如果大家管理一套云服务器,且其中安装的应用需要发送邮件通知,那么运行一套本地只发送SMTP服务器则更为理想. 如何 ...

  2. html_parser.py

    coding=UTF-8 # HTML解释器 import re from bs4 import BeautifulSoup class htmlParser(): def parse(self, u ...

  3. TouTiao开源项目 分析笔记15 新闻详情之两种类型的实现

    1.预览效果 1.1.首先看一下需要实现的效果. 第一种,文字类型新闻. 第二种,图片类型新闻. 1.2.在NewsArticleTextViewBinder中设置了点击事件 RxView.click ...

  4. 集合源码分析之 HashMap

    一 知识准备 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 二  HashM ...

  5. WPF的线程模型

    原文:WPF的线程模型 WPF的线程模型            周银辉 谈到多线程,很多人对其可能都不太有好感,觉得麻烦与易出错.所以我们不排除有这样的情况:假设我对“多线程”.“异步”这些字眼潜意识 ...

  6. android gradle.properties

    gradle.properties 里面配置的东西,在gradle 文件里面可以直接引用. 例如: 在你工程根目录的gradle.properties 文件里面 可以这样配置: ## Project- ...

  7. 如何使用Idea导入jar包

    技术交流群: 233513714 1.在idea底部找到Terminal,然后进入输入框,如下图所示 2.在输入框中输入 mvn install:install-file -D file=C:\Use ...

  8. 《Cracking the Coding Interview》——第7章:数学和概率论——题目5

    2014-03-20 02:20 题目:给定二维平面上两个正方形,用一条直线将俩方块划分成面积相等的两部分. 解法:穿过对称中心的线会将面积等分,所以连接两个中心即可.如果两个中心恰好重合,那么任意穿 ...

  9. serial console

    适用于: agent_ipmitool_socat pxe_ipmitool_socat 修改driver方式:更换ironic node的driver类型 yum install -y socat ...

  10. ERC720和erc721的区别

    有一阵子,Ethereum网络突然变的特别拥堵,原因是兴起了一款以太坊养猫的Dapp游戏,超级可爱的猫形象,再加上配种,繁殖和拍卖等丰富的玩法,风靡了币圈. 一时间币圈大大小小的人都在撸猫,以太坊网络 ...