自定义日志级别

通常的日志框架都有以下几个级别,从低到高TRACE,DEBUG,INFO,WARN,ERROR,FATAL.

默认情况,假如我们定义日志打印级别INFO,它会把大于等于INFO级别的日志信息打印出来.这样各个类别的日志都打印在一起不利于日志查看.

按照业务类型打印日志,我们希望info日志文件里只打印info信息,warn日志文件里只打印warn信息,error日志文件只打印error信息,不同的业务模块的日志打印到单独日志文件.

注:本篇使用的日志框架是log4j.实现日志文件只打印指定日志级别是通过Filters实现的,

如下:

    <!--告警信息打印-->
<RollingFile name="RollingFileWarnLog" fileName="log/warn.log"
filePattern="log/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd-HH}-%i.log.gz">
<!--过滤掉其他level-->
<Filters>
<!--默认情况会打印大于等于当前级别的日志,因此,需要把error级别的过滤掉-->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="8" modulate="true"/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="100"/>
</RollingFile>

因此实现按业务类型打印日志也很简单,只需要自定义日志级别,然后把大于等于它级别的日志过滤掉就可以了.

下面是个样例配置

<?xml version="1.0" encoding="utf-8"?>
<configuration >
<properties>
<!-- 文件输出格式 -->
<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property>
</properties> <!-- 先定义所有的appender -->
<!--appender定义日志的输出位置,格式(即patternLayout),日志等级等-->
<!--loggers定义哪些类使用哪些appender,并可以设置日志级别-->
<CustomLevels>
<!--自定义日志级别:业务1-->
<CustomLevel name="BU_ONE_INFO" intLevel="490" />
<!--自定义日志级别:业务2-->  
<CustomLevel name="BU_TWO_INFO" intLevel="480"/>
</CustomLevels>
<appenders>
<!--这个输出控制台的配置:控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
<Console name="Console" target="system_out">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
</Console>
<!--告警信息打印-->
<RollingFile name="RollingFileWarnLog" fileName="log/warn.log"
filePattern="log/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd-HH}-%i.log.gz">
<!--过滤掉其他level-->
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="8" modulate="true"/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="100"/>
</RollingFile>
<!--普通信息打印-->
<RollingFile name="RollingFileInfoLog" fileName="log/info.log"
filePattern="log/$${date:yyyy-MM}/info-%d{yyyy-MM-dd-HH}-%i.log.gz">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="8" modulate="true"/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="100"/>
</RollingFile
<!--错误信息打印-->
<RollingFile name="RollingFileErrorLog" fileName="log/error.log"
filePattern="log/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH}-%i.log.gz">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="8" modulate="true"/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="50"/>
</RollingFile> <RollingFile name="RollingFileBuOneLog" fileName="log/buoneinfo.log"
filePattern="log/$${date:yyyy-MM}/buoneinfo-%d{yyyy-MM-dd-HH}-%i.log.gz">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="BU_TWO_INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="BU_ONE_INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="8" modulate="true"/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="50"/>
</RollingFile> <RollingFile name="RollingFileBuTwoLog" fileName="log/butwoinfo.log"
filePattern="log/$${date:yyyy-MM}/butwoinfo-%d{yyyy-MM-dd-HH}-%i.log.gz">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="BU_TWO_INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="8" modulate="true"/>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
<DefaultRolloverStrategy max="50"/>
</RollingFile> </appenders> <!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<loggers> <root level="debug">
<!--<appender-ref ref="connectionFactoryForLog" />-->
<appender-ref ref="RollingFileInfoLog" />
<appender-ref ref="RollingFileWarnLog" />
<appender-ref ref="RollingFileErrorLog" />
<appender-ref ref="RollingFileBuTwoLog" />
<appender-ref ref="RollingFileBuOneLog" />
<!--<appender-ref ref="RollingFileTcpPackageLog" />-->
<appender-ref ref="Console" />
</root>
</loggers> </configuration>

以上就是配置文件

代码实现如下:

/**
* Desc: 自定义日志级别打印,测试类
* @author l2h
*/
@RestController
public class LogController {
private final Logger logger = LogManager.getLogger(LogController.class);
private final Level BU_TWO_INFO = Level.forName("BU_TWO_INFO",480);
private final Level BU_ONE_INFO = Level.forName("BU_ONE_INFO",490);
@GetMapping("/log")
public String log(@RequestParam("msg")String msg){
logger.log(BU_ONE_INFO,msg);
logger.log(BU_TWO_INFO,msg);
logger.info(msg);
logger.error(msg);
logger.warn(msg);
return "success";
}
}

调试结果如下:

注意

maven 引入的log4j stater与springboot 框架因为的有冲突,因此需要把springboot exclusion掉,否则会发现没有打印到日志文件中.

样例代码的maven配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>simos</groupId>
<artifactId>springboot-quick-start</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
</project>

以上配置实现分业务,分级别自定义日志打印.

talk is easy , show me the code.

涨姿势:Java 分业务、分级别实现自定义日志打印的更多相关文章

  1. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  2. Sharding-Jdbc 自定义分库分表-复合分片算法自定义实现

    Sharding-JDBC中的分片策略有两个维度,分别是: 数据源分片策略(DatabaseShardingStrategy) 表分片策略(TableShardingStrategy) 其中,数据源分 ...

  3. 【java虚拟机】分代垃圾回收策略的基础概念

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6602166.html 一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一 ...

  4. PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)

    题目链接:1018 锤子剪刀布 分析 用一个二维数组保存两人所有回合的手势 甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以 手势单独保存在signs[3]中,注意顺序.题目原文:如果解不唯一,则 ...

  5. [2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

    转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习 ...

  6. Java自定义日志输出文件

    Java自定义日志输出文件 日志的打印,在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别.打印形式和日志的输出路径 ...

  7. log4j.xml配置,包含自定义log4j日志级别及输出日志到不同文件

      一.配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configura ...

  8. Java轻量级业务层框架Spring两大核心IOC和AOP原理

    IoC(Inversion of Control): IOC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务.容器负责将这些 ...

  9. Java Web项目发布及使用自定义域名

    详细讲解的网址: http://wenku.baidu.com/link?url=-ACZxKUcfrbhrMRUP3Ov-Q_c-Q9JPrA9D1fzHjHuJsWwZfRsVDVQ2qBtoY7 ...

随机推荐

  1. Oracle 11g streams部署

    环境   源服务器 目标服务器 系统版本 CentOS Linux release 7.3.1611 (Core) CentOS Linux release 7.3.1611 (Core) 主机名 s ...

  2. VUE + vue-cli + webpack 创建新项目

    首先记录一下命令. 这是一个睿智新手的笔记. p.s.这是配置好环境以后的命令. ----------------------------------------------- $ npm insta ...

  3. [hdu P1599] find the mincost route

    [hdu P1599] find the mincost route 杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V ...

  4. spring注入3种方式

    1.构造方法 2.接口注入 3.set方法

  5. oracle 11g安装过程

    1,工具:Oracle_win64_11gR2_database(64位oracle 11g数据库).iso安装文件,win10系统 2,右键,解压后,点击setup.exe,系统会检测本机的环境,如 ...

  6. Binary Search Tree Learning Summary

    BST Definition BST is short for Binary Search Tree, by definition, the value of right node is always ...

  7. Mac + PyCharm 安装 Opencv3 + python2.7

    本文地址:http://www.cnblogs.com/QingHuan/p/7354074.html 转载请注明本文地址,方便读者查看本文更新,谢谢! 今天要在Mac上安装OpenCV,过程非常曲折 ...

  8. latex之行内公式与行间公式

    1.行内公式 我是对行内公式的测试$f(x)=1+x+x^2$ 2.行间公式 单行不编号 \begin{equation} \int_0^1(1+x)dx \end{equation} 结果为: 单行 ...

  9. Python全栈之路----函数进阶----名称空间

    又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 ...

  10. 百战程序员9- IO流

    1.IO是什么意思? data source是什么意思? IO:输入输出 data source:数据源 2.字节流和字符流有什么区别?输入流和输出流有什么区别? 分类 3.节点流和处理流有什么区别? ...