使用logback实现按自己的需求打印日志到自定义的文件里
作者:烛火下的乌托邦丶 发布时间:2022-05-12 16:56:49
标签:logback,打印日志,自定义,文件
定义工具类-创建对应的日志对象
定义枚举类-存储定义的日志文件名称
logback.xml里配置对应的日志名称和日志等级
1、工具类 LoggerUtils
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggerUtils {
public static <T> Logger Logger(Class<T> clazz) {
return LoggerFactory.getLogger(clazz);
}
/**
* 打印到指定的文件下
*
* @param desc 日志文件名称
* @return
*/
public static Logger Logger(LogFileName desc) {
return LoggerFactory.getLogger(desc.getLogFileName());
}
}
2、枚举类 LogFileName
import org.apache.commons.lang3.StringUtils;
public enum LogFileName {
//配置到logback.xml中的logger name="getNextHh"
GET_NEXT_HH("getNextHh"),
GET_AGAIN_HH("getAgainHh"),
GET_AI_ACTION("getAiAction"),
TRAIN_ERROR("trainError"),
USER_ERROR("userError"),
PAY_ERROR("payError"),
REVIEW_ERROR("reviewError"),
WX_ERROR("wxError"),
SYSTEM_ERROR("systemError"),
PAY_DEBUG("payDebug");
private String logFileName;
LogFileName(String fileName) {
this.logFileName = fileName;
}
public String getLogFileName() {
return logFileName;
}
public void setLogFileName(String logFileName) {
this.logFileName = logFileName;
}
public static LogFileName getAwardTypeEnum(String value) {
LogFileName[] arr = values();
for (LogFileName item : arr) {
if (null != item && StringUtils.isNotBlank(item.logFileName)) {
return item;
}
}
return null;
}
}
3、logger.xml, 按需配置即可
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd" debug="false"
scan="true" scanPeriod="30 second">
<property name="PROJECT" value="poker_system"/>
<property name="ROOT" value="C:/Users/Administrator/Desktop/logs/${PROJECT}/"/>
<property name="FILESIZE" value="50MB"/>
<property name="MAXHISTORY" value="30"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss:SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss"/>
<!-- 控制台打印 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ERROR 输入到文件,按日期和文件大小 -->
<appender name="ERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤器,只打ERROR级别的日志-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error/systemError.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="TRAINERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤器,只打ERROR级别的日志-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error/trainError.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="USERERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤器,只打ERROR级别的日志-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error/userError.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="PAYERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤器,只打ERROR级别的日志-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error/payError.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="REVIEWERROR-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤器,只打ERROR级别的日志-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error/reviewError.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- WARN 输入到文件,按日期和文件大小 -->
<appender name="WARN-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- INFO 输入到文件,按日期和文件大小 -->
<appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- DEBUG 输入到文件,按日期和文件大小 -->
<appender name="DEBUG-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- DEBUG 输入到文件,按日期和文件大小 -->
<appender name="PAYDEBUG-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/debug/payDebug.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- TRACE 输入到文件,按日期和文件大小 -->
<appender name="TRACE-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- Logger 根目录 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<!--<appender-ref ref="ERROR-OUT"/>-->
<!--<appender-ref ref="WARN-OUT"/>-->
<!--<appender-ref ref="INFO-OUT"/>-->
<!--<appender-ref ref="TRACE-OUT"/>-->
<!--<appender-ref ref="REVIEWERROR-OUT"/>-->
<!--<appender-ref ref="PAYDEBUG-OUT"/>-->
<!--<appender-ref ref="PAYERROR-OUT"/>-->
<!--<appender-ref ref="USERERROR-OUT"/>-->
<!--<appender-ref ref="TRAINERROR-OUT"/>-->
</root>
<logger name="com.xxx" additivity="false" level="DEBUG">
<appender-ref ref="DEBUG-OUT"/>
</logger>
<logger name="com.xxx" additivity="false" level="ERROR">
<appender-ref ref="ERROR-OUT"/>
</logger>
<logger name="com.xxx" additivity="false" level="INFO">
<appender-ref ref="INFO-OUT"/>
</logger>
<logger name="com.xxx" additivity="false" level="TRACE">
<appender-ref ref="TRACE-OUT"/>
</logger>
<logger name="com.xxx" level="STDOUT">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ERROR-OUT"/>
<appender-ref ref="WARN-OUT"/>
<appender-ref ref="INFO-OUT"/>
<appender-ref ref="TRACE-OUT"/>
<appender-ref ref="REVIEWERROR-OUT"/>
<appender-ref ref="DEBUG-OUT"/>
<!--<appender-ref ref="PAYDEBUG-OUT"/>-->
<appender-ref ref="PAYERROR-OUT"/>
<appender-ref ref="USERERROR-OUT"/>
<appender-ref ref="TRAINERROR-OUT"/>
</logger>
<!-- 不同的业务逻辑日志打印到指定文件夹-->
<logger name="trainError" level="ERROR">
<appender-ref ref="TRAINERROR-OUT"/>
</logger>
<logger name="userError" level="ERROR">
<appender-ref ref="USERERROR-OUT"/>
</logger>
<logger name="payError" level="ERROR">
<appender-ref ref="PAYERROR-OUT"/>
</logger>
<logger name="payDebug" additivity="false" level="DEBUG">
<appender-ref ref="PAYDEBUG-OUT"/>
</logger>
<logger name="reviewError" level="ERROR">
<appender-ref ref="REVIEWERROR-OUT"/>
</logger>
<logger name="systemError" level="ERROR">
<appender-ref ref="ERROR-OUT"/>
</logger>
</configuration>
来源:https://www.jianshu.com/p/6956ac6fdea9


猜你喜欢
- 本文实例为大家分享了RecycleView实现各种尺寸图片展示的具体代码,供大家参考,具体内容如下今天才发现,在一个RecycleView里
- 使用Inten的putExtra传递第一个Activity中//创建意图对象 Intent intent = new Intent(this
- 效果如下:鄙人虽然开发WPF有些时间,但之前一直是一些简单Template和Style改改之类的工作,并没有深入研究过。此次为了完成工作,首
- 具体代码如下所示:/// <summary> /// 启用事务提交多条带参数的SQL语句 /// </summary>
- 1)在我们的项目中添加引用文件:TaskSchedulerEngine.dll(dll定义了一个ITask接口,定义了两个方法Initial
- 一:form在前台以post方式提交数据: 浏览器将数据(假设为“中国”)发送给服务器的时
- 最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧!添加jar包:<dependenc
- C++虚类相当于java中的抽象类,与接口的不同之处是:1.一个子类只能继承一个抽象类(虚类),但能实现多个接口2.一个抽象类可以有构造方法
- SharedPreferences介绍:SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置
- 1、AOP基本总结连接点(JoinPoint):连接点是程序运行的某个阶段点,如方法调用、异常抛出等切入点(Pointcut):切入点是Jo
- 某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干
- 一、问题描述Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Serv
- 一、Swagger介绍Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的web服务。目标是使客户端和文件
- 本文以实例详细分析了Java中重载与重写的区别,感兴趣的朋友可以参考一下。一、重载(Overloading):(1) 方法重载是让类以统一的
- 很多时候忘记Android摄像头如何打开,查看google文档的话,发现太复杂(只是单纯的想打开摄像头而已,不想添加那么多设置,添加那么功能
- 相信很多人在读取文件的时候都会碰到乱码的情况,所谓乱码就是错乱的编码的意思,造成乱码的是由于编码不一致导致的。演示程序:新建3个文本文件:编
- 简介网上对于 Camera2 的介绍有很多,在 Github 上也有很多关于 Camera2 的封装库,但是对于那些库,封装性太强,有时候我
- API Application Programming Interface 应用程序接口接口定义 :指描述可属于任何类或结构的一
- 本文实例讲述了C#编程实现查看剪切板内容的方法。分享给大家供大家参考,具体如下:using System;using System.Coll
- 指针的概念:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指