自学内容网 自学内容网

spring中logback日志使用pid作为日志文件夹,用以区分进程日志

创建一个监听类

import ch.qos.logback.classic.Level;
impor tch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.LoggerContextListener;
import ch.qos.logback.core.Context;
import ch.qos.logback.core.spi.ContextAwareBase;
import utils.SystemUtil;

public class LoggerStartupListener extends ContextAwareBase implements LoggerContextListener{
privatebooleanstarted=false;

/**
*logback.xml获取变量的方法
*${PID}就可以使用
*
*@return
*/
private String getPid(){
return SystemUtil.getPid();
}

@Override
public boolean isResetResistant(){
return false;
}

@Override
public void onStart(LoggerContext loggerContext){
if(started){
return;
}
Context context=getContext();
context.putProperty("PID",getPid());
started=true;
}

@Override
publicvoidonReset(LoggerContextloggerContext){
}

@Override
public void onStop(LoggerContext loggerContext){
}

@Override
public void onLevelChange(Logger logger,Level level){
}
}

在配置文件中使用 ${PID}获取

<?xmlversion="1.0"encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10seconds" debug="false">

<!-- 此处的class使用上边新建的LoggerStartupListener -->
<contextListener class="LoggerStartupListener"/>

<!--日志打印级别,生产保持value="info"-->
<property name="root.level" value="debug"/>

<!--日志根路径-->
<property name="log.dir" value="./log/${PID}/"/>

<!--应用名-->
<property name="log.app.name" value="appname"/>

<!--日志编码-->
<property name="encoding" value="UTF-8"/>

<!--上下文名称,设置为项目名-->
<contextName>${log.app.name}</contextName>

<!--修改其他包的日志输出级别-->

<!--#########################################################################################################################-->
<!--##############################################以下内容不需要更改####################################################-->
<!--#########################################################################################################################-->

<!--日志格式-->
<property name="console.pattern" value="%d{HH:mm:ss.SSS}[%thread]%logger{36}%-5level-%msg%n"/>
<property name="info.pattern" value="%d{HH:mm:ss.SSS}[%thread]%-5level-%msg%n"/>
<property name="debug.pattern" value="%d{HH:mm:ss.SSS}[%thread]%logger{36}%-5level-%msg%n"/>
<property name="error.pattern" value="%d{HH:mm:ss.SSS}[%thread]%-5level-%msg%n"/>

<!--输出到控制台ConsoleAppender-->
<!--%d{HH:mm:ss.SSS}——日志输出时间%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger{36}——日志输出者的名字
%msg——日志消息
%n——平台的换行符ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志-->

<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式layout-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${encoding}</charset>
<pattern>${console.pattern}</pattern>
</encoder>
</appender>

<!--普通日志信息文件-->
<appender name="infoFileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要Info级别的日志,只是过滤info还是会输出Error日志,因为Error的级别高,所以我们使用下面的策略,可以避免输出Error的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤info-->
<level>INFO</level>
<!--匹配到就允许-->
<onMatch>ACCEPT</onMatch>
<!--不匹配的禁止-->
<onMismatch>DENY</onMismatch>
</filter>

<!--日志名称,如果没有File属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File>的日志都是当天的。-->
<File>${log.dir}/info.${log.app.name}.log</File>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--每天日志归档路径以及格式,编码器-->
<fileNamePattern>${log.dir}/info.${log.app.name}-%d{yyyy-MM-dd}.log</fileNamePattern>

<!--日志文件保留天数-->
<maxHistory>1</maxHistory>
<!--每个文件最多100MB,保留15天的历史记录,但最多20GB-->
<totalSizeCap>10KB</totalSizeCap>
<!--重启清理日志文件-->
<cleanHistoryOnStart>false</cleanHistoryOnStart>
</rollingPolicy>


<!--日志输出编码格式化-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${encoding}</charset>
<pattern>${info.pattern}</pattern>
</encoder>
</appender>


<appender name="debugFileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要Info级别的日志,只是过滤info还是会输出Error日志,因为Error的级别高,所以我们使用下面的策略,可以避免输出Error的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤Error-->
<level>DEBUG</level>
<!--匹配到就允许-->
<onMatch>ACCEPT</onMatch>
<!--不匹配的禁止-->
<onMismatch>DENY</onMismatch>
</filter>

<!--日志名称,如果没有File属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File>的日志都是当天的。-->
<File>${log.dir}/debug.${log.app.name}.log</File>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--每天日志归档路径以及格式,编码器-->
<FileNamePattern>${log.dir}/debug.${log.app.name}.%d{yyyy-MM-dd}.log</FileNamePattern>

<!--日志文件保留天数-->
<maxHistory>7</maxHistory>
<!--每个文件最多100MB,保留15天的历史记录,但最多20GB-->
<totalSizeCap>5GB</totalSizeCap>
<!--重启清理日志文件-->
<cleanHistoryOnStart>false</cleanHistoryOnStart>
</rollingPolicy>

<!--日志输出编码格式化-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${encoding}</charset>
<pattern>${debug.pattern}</pattern>
</encoder>
</appender>

<appender name="errorFileLog"class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要Error级别的日志,那么需要过滤一下,默认是info级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤Error-->
<level>ERROR</level>
<!--匹配到-->
<onMatch>ACCEPT</onMatch>
<!--没有匹配到-->
<onMismatch>DENY</onMismatch>
</filter>

<!--日志名称,如果没有File属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File>的日志都是当天的。-->
<File>${log.dir}/error.${log.app.name}.log</File>

<!--滚动策略,按照时间滚动TimeBasedRollingPolicy-->
<rollingPolicyc lass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${log.dir}/error.${log.app.name}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近的日志-->
<maxHistory>1</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>${encoding}</charset>
<pattern>${error.pattern}</pattern>
</encoder>
</appender>



<!--所有级别日志,按日期滚动文件输出-->
<appender name="allLevelFileAppender"class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--正在记录的日志文档的路径及文档名-->
<File>${log.dir}/all.${log.app.name}.log</File>
<!--日志记录器的滚动策略,按日期,按大小记录-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--滚动分割保存日志文件名称定义-->
<!--<fileNamePattern>${LOG_HOME}/log/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>-->
<fileNamePattern>${log.dir}/all.${log.app.name}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!--日志文件保留天数,超过默认删除-->
<MaxHistory>1</MaxHistory>
<totalSizeCap>100MB</totalSizeCap>
<!--文件大小分割,超过配置大小就建当天新的日志文件-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-ddHH:mm:ss.SSS,CTT}[%thread]-[%-5level][%logger{50}:%line]-%msg%n</pattern>
<!--此处设置字符集-->
<charset>UTF-8</charset>
</encoder>
</appender>

<logger name="org.springframework.data.redis.core.RedisConnectionUtils"level="OFF"/>

<!--指定最基础的日志输出级别-->
<root level="${root.level}">
<!--appender将会添加到这个loger-->
<appender-ref ref="consoleLog"/>
<!--开启文件日志-->
<!--<appender-ref ref="infoFileLog"/>-->
<!--<appender-ref ref="debugFileLog"/>-->
<!--<appender-ref ref="errorFileLog"/>-->
<!--<appender-ref ref="allLevelFileAppender"/>-->

</root>
</configuration>

原文地址:https://blog.csdn.net/Magic_Engine/article/details/144424723

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!