logback之自定义指定日志文件存储目录方式
作者:cwh056056 发布时间:2022-05-11 15:05:19
logback自定义指定日志文件存储目录
1、正常使用
定义一个logback.xml配置文件即可:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 指定日志文件路径(与当前程序jar包同一目录下) -->
<property name="LOG_HOME" value="logs" />
<!--每天生成日志的类-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> <!--过滤掉error的级别-->
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_HOME}/mds-tool-box-info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level> <!--//打印error-->
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_HOME}/mds-tool-box-error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="info">
<!-- <appender-ref ref="consoleLog" />-->
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
</configuration>
2、自定义指定日志文件存储目录
2.1 定义 *
/**
* @version 1.0
* @class: CustomLogContextListener
* @author: carlo
* @mail: carlo_cwh@qq.com
* @date: 2021/8/25 10:01
* @description: 定义logback 日志 * ,指定日志文件存放目录
*/
public class CustomLogContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {
/** 存储日志路径标识 */
public static final String LOG_PAHT_KEY = "LOG_PATH";
@Override
public boolean isResetResistant() {
return false;
}
@Override
public void onStart(LoggerContext loggerContext) {
}
@Override
public void onReset(LoggerContext loggerContext) {
}
@Override
public void onStop(LoggerContext loggerContext) {
}
@Override
public void onLevelChange(Logger logger, Level level) {
}
@Override
public void start() {
// "user.dir"是指用户当前工作目录
String s = System.getProperty("user.dir") + "/logs/";
System.setProperty(LOG_PAHT_KEY, s);
Context context = getContext();
context.putProperty(LOG_PAHT_KEY, s);
}
@Override
public void stop() {
}
@Override
public boolean isStarted() {
return false;
}
}
2.2 在logback.xml日志文件中指定 *
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- * ,指定日志文件存放目录 -->
<contextListener class="com.hh.listener.CustomLogContextListener" />
<!--每天生成日志的类-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> <!--过滤掉error的级别-->
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_PATH}/mds-tool-box-info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level> <!--//打印error-->
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>${LOG_PATH}/mds-tool-box-error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="info">
<!-- <appender-ref ref="consoleLog" />-->
<appender-ref ref="fileInfoLog" />
<appender-ref ref="fileErrorLog" />
</root>
</configuration>
其中 ${LOG_PATH} 为我们在 * 中定义的 key 值
logback基本配置说明
logback继承自log4j,它是spring boot默认的日志集成框架,官网地址:https://logback.qos.ch/
spring boot默认日志框架
当我们启动spring boot项目的时候,没有进行任何日志的配置,控制台能输出日志,原因是spring boot内置了org.springframework.boot.logging.logback日志,里面配置了base.xml文件,引入了基础的日志输出格式。
当我们项目部署到服务器后,会在与jar同级的目录下生成一个默认日志文件,文件名为jar包的名称。
自定义logback配置文件
默认的日志文件,生成的日志格式配置不是我们所希望的,默认日志输出格式:
此时我们可以自定义logback配置文件,默认的日志文件名为logback.xml,spring官方首推的默认日志文件名为logback-spring.xml;若是我们想命名为其他的名称,也是可以的,在properties或者yml配置文件中指明下日志路径和名称即可:
logging:
config: classpath:logback-xxx.xml
日志文件统一放在目录:src/resources之下。
配置文件说明
先来看一个完整的配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<!--自动扫描配置文件,间隔周期是60秒,不打印logback的内部日志信息-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--根据spring激活的配置文件定义不同的属性-->
<springProfile name="local">
<!--local环境,日志的存放位置-->
<property name="LOG_HOME" value="/Users/work/tools/logs/xxx" />
<!--local环境,控制台输出的日志级别-->
<property name="CONSOLE_LEVEL" value="INFO" />
</springProfile>
<springProfile name="dev">
<!--dev环境,日志的存放位置-->
<property name="LOG_HOME" value="/u01/logs/xxx" />
<!--pro环境,控制台输出的日志级别-->
<property name="CONSOLE_LEVEL" value="OFF" />
</springProfile>
<springProfile name="pro">
<!--pro环境,日志的存放位置-->
<property name="LOG_HOME" value="/u01/logs/xxx" />
<!--pro环境,控制台输出的日志级别-->
<property name="CONSOLE_LEVEL" value="OFF" />
</springProfile>
<!--日志存放最大数量-->
<property name="maxHistory" value="30"/>
<!--定义控制台输出的日志信息-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--把事件转化成byte数组,并把数组输出为文本-->
<encoder>
<!--定义输出的日志格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
</encoder>
<!--过滤输出的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--定义日志的级别,大于此级别才输出日志-->
<level>${CONSOLE_LEVEL}</level>
</filter>
</appender>
<!--定义滚动日志-->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志的存放名:目录+文件名-->
<file>${LOG_HOME}/auth-open.info.log</file>
<encoder>
<!--日志输出格式-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
</encoder>
<!--基于时间滚动的日志-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件名的定义规则-->
<fileNamePattern>${LOG_HOME}/auth-open.info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--保存文件的最大记录-->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
</appender>
<!--错误文件的滚动配置-->
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/auth-open.error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/auth-open.error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
</appender>
<!--根目录日志级别是info-->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="FILE-ERROR" />
</root>
</configuration>
配置文件描述:
①配置文件有变动自动扫描,扫描周期是60秒。
②输出的根目录日志级别是info,日志文件配置了控制台输出,滚动日志输出,错误日志输出。
③根据spring不同的激活环境,日志的输出目录配置为不同的值;开发环境控制台出入的级别为info(与根目录保持一致),线上环境和测试环境为off(不输出日志,因为控制台输出的日志与发布的jar包在同一目录下,没法进行删除,造成日志文件冗余)。
④以日期为滚动文件的存储策略,设置日志最大存储量为30,大于30时,自动删除创建是时间最早的日志。
configuration
configuration是最外层的配置,在其内包含所有的配置信息。
scan
:当配置文件发生变动时,是否自动扫描配置信息,true:自动扫描,false:不扫描。scanPeriod
:自动扫描的时间周期,默认是毫秒,当scan为true时才有效。debug
:是否打印logback内部日志信息,默认是false。
springProfile
根据spring boot项目激活的文件,定义对应的配置信息,用于区分同一变量在不同环境下的值。
name
:用于指定激活的配置文件,例如测试环境spring.profiles.active为dev,线上环境为pro,此时可以给不同的环境下同一变量设置不同的属性值。property
:定义变量,name为后续引用的名称,value为变量的值,后续可以使用${}引用此变量。
root
root为配置文件的根节点,可以配置日志的级别和日志输出的引用。
level
:日志级别。appender-ref
:日志追加的引用,配置ref值与appender标签关联使用。
appender
定义日志追加的相关信息,name的值与appender-ref中的ref值对应。
ConsoleAppender
控制台输出日志的类,存在于包ch.qos.logback.core.ConsoleAppender下,可以配置控制台输出的格式,日志级别。
RollingFileAppender
滚动日志的类,存在于包ch.qos.logback.core.rolling.RollingFileAppender,可以滚动存放日志信息。
RollingPolicy
滚动日志的策略,可以根据时间滚动TimeBasedRollingPolicy,时间和文件大小滚动SizeAndTimeBasedRollingPolicy。
fileNamePattern
:滚动文件名的表达式。maxHistory
:最大历史记录,当大于最大历史记录时,会删除创建时间最早的一份日志记录
encoder
把事件转化成byte数组,并把数组输出为文本。
pattern
输出日志的格式表达式,例:
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
%d
:日期格式表达式,语法与SimpleDataFormat相同。%thread
:线程名。%-5level
:日志级别的前五位字符。%logger{20}
:输出类名(从左开始缩短 ,每个层级至少保留1位),20位,例:
完整logger名 : cn.xbz.test.HelloController
%logger : cn.xbz.test.HelloController
%logger{0}: HelloController
%logger{5}: c.x.t.HelloController
%logger{20}: c.x.test.HelloController
msg
:日志信息。
level级别
logback有5种级别,分别是Trace<Debug<Info<Warn<Error。
Trace
:追踪,就是程序推进一下,你就可以写个trace输出。Debug
:指出细粒度信息事件,对调试程序非常有帮助。Info
:粗粒度级别上突出强调应用程序的运行过程。Warn
:输出警告及warn以下级别的日志。Error
:输出错误信息日志。Off
:关闭全部日志输出。All
:开启全部日志输出。
如果logger没有分配日志级别,会从被分配级别最近的父类那里继承级别,root logger默认级别是Debug。
来源:https://blog.csdn.net/cwh056056/article/details/119905883


猜你喜欢
- 如何:对 Windows 窗体控件进行线程安全调用访问 Windows 窗体控件本质上不是线程安全的。 如果有两个或多个线程操作某一控件的状
- Weblogic部署war找不到spring配置文件我有一个web工程在Tomcat7下部署没有问题,可是移植到Weblogic10上出现如
- 写在前面在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法。而在Java8中,接口中可以声明
- 1、悬浮窗的基本介绍悬浮窗,大家应该也不陌生,凌驾于应用之上的一个小弹窗,实现上很简单,就是添加一个系统级别的窗口,Android中通过Wi
- 本文实例讲述了C#事件用法。分享给大家供大家参考。具体分析如下:EventHandler<TEventArgs>的定义如下pub
- 循环结构可以实现一个程序模块的重复执行,它对于我们简化程序,更好地组织算法有着重要的意义。C#为我们提供了若干种循环语句,分别适用于不同的情
- 本文实例讲述了C#采用HttpWebRequest实现保持会话上传文件到HTTP的方法,在项目开发中有一定的实用价值,具体方法如下:一、前言
- 一、:: 双冒号操作符在 Kotlin 中 , :: 双冒号操作符 的作用是 获取 类 , 对象 , 函数 , 属性 的 类型对象 引用 ;
- 在Android系统上开发游戏是Android开发学习者所向往的,有成就感也有乐趣,还能取得经济上的报酬。那怎样开发Androi
- Android 和 H5 都是移动开发应用的非常广泛。市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附
- Java8对List<Integer>的求和想要用流对List<Integer>进行求和,但查找完资料都是对List
- 具体效果如下图所示:方法一方法二产生这种问题的原因是因为moudles.xml中没有找到对应的moudle。加入对应的moudle即可,修改
- 网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角。主要运用了System.Drawing.Dra
- 在EditText输入数字的时候,通常我们需要限制小数点前后位数。比如金额输入一般我们需要限制小数点后面最多2位。我们可以通过 TextWa
- 由于最近项目更新功能比较的忙,也没时间去整理自己的知识点和管理自己的博客.在Android对手机相册中的图片的压缩和上传到服务器上,这样的功
- 现在越来越多的软件都开始使用沉浸式状态栏了,下面总结一下沉浸式状态栏的两种使用方法注意!沉浸式状态栏只支持安卓4.4及以上的版本状态栏:4.
- 什么是Swagger?Swagger是什么:THE WORLD'S MOST POPULAR API TOOLING根据官网的介绍:
- 计算器项目,要求实现加、减、乘、除、求倒数、求平方根等简单运算。真机调试结果如下图:布局文件:main_activity.xml<?x
- 前言可能很多情况下,我们都会有在activity中获取view 的尺寸大小(宽度和高度)的需求。面对这种情况,很多同学立马反应:这么简单的问
- 如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过。这是一款商业级的编程语言,我们没有办法不接触它。对于J