【传送门】:log4j官网配置文件详解

【参考文章】:Log4j2 类名与行名不显示问题

【参考文章】:Log4j2中RollingFile的文件滚动更新机制

【参考文章】:Log4j2源码解读——删除过期文件

1. log4j2.xml配置详解

  官方文档讲的很清楚,有不清楚的地方可以去查阅官方文档

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- status log4j2 内部日志级别 -->
<configuration status="INFO"> <!-- 全局参数 -->
<Properties>
<Property name="pattern">[%p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %l : %m%n</Property>
<Property name="logHome">logs</Property>
<Property name="displayName">monitor-server</Property>
</Properties> <Appenders> <Console name="console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<pattern>${pattern}</pattern>
</PatternLayout>
</Console> <!-- 文件 每次运行程序会自动清空,由append属性决定 -->
<File name="error" fileName="${loghome}/${displayName}_error.log" append="false">
<!-- 指定error 级别的日志 -->
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<pattern>${pattern}</pattern>
</PatternLayout>
</File> <!-- 滚动文件 -->
<RollingFile name="rollingFile" fileName="${logHome}/${displayName}.log"
filePattern="${logHome}/${displayName}_%d{yyyy-MM-dd}.log">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<pattern>${pattern}</pattern>
</PatternLayout>
<!-- 按大小划分 -->
<Policies>
<!-- 每隔1天生成一个日志,时间单位由 filePattern 的最小单位决定,最小粒度为天,则以天为单位,最小粒度为小时,则以小时为单位-->
<TimeBasedTriggeringPolicy interval="1"/>
<!-- 每隔10MB生成一个日志,单位可配置 KB,MB,GB-->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
        <!-- 指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除。-->
        <!--1.如果filePattern中仅含有date/time pattern,每次rollover时,将用当前的日期和时间替换文件中的日期格式对文件进行重命名。max参数将不起作用。-->
        <!-- 2.如果filePattern中仅含有整数计数器(即%i),每次rollover时,文件重命名时的计数器将每次加1(初始值为1),若达到max的值,将删除旧的文件。-->
        <!--此时就达到了限制压缩文件总个数的目的-->
        <!--3.如果filePattern中既含有date/time pattern,又含有%i,每次rollover时,计数器将每次加1,若达到max的值,将删除旧的文件,直到data/time pattern不再符合,被替换为当前的日期和时间,计数器再从1开始。-->
        <!---此时只能限制每个时间单位内的最大的压缩文件个数-->
<DefaultRolloverStrategy max="20">
<!--默认情况下delete的删除条件为and的关系,即所有条件满足时才删除文件-->
<!--条件组合关系可以用 IfAll IfAny IfNot 进行动态组合-->
<Delete basePath="${logHome}" maxDepth="2">
<!--文件命名符合此格式-->
<IfFileName glob="app-*.log.gz" />
<!--文件时间大于60天-->
<IfLastModified age="60d" />
<!--文件总大小大于100GB-->
<IfAccumulatedFileSize exteeds="100 GB" />
<!--文件总个数大于100个-->
<IfAccumulatedFileCount exceeds="100" />
</Delete> <!--示例:配置 or 的条件,条件满足任何一个就可以删除文件-->
<Delete basePath="${logHome}" maxDepth="2">
<!--文件命名符合此格式-->
<IfFileName glob="app-*.log.gz">
<IfAny>
<!--文件时间大于60天-->
<IfLastModified age="60d" />
<!--文件总大小大于100GB-->
<IfAccumulatedFileSize exteeds="100 GB" />
<!--文件总个数大于100个-->
<IfAccumulatedFileCount exceeds="100" />
</IfAny>
</IfFileName>
</Delete> </RollingFile> </Appenders> <Loggers> <Logger name="org.springframework" level="WARN" additivity="false">
<AppenderRef ref="console"/>
</Logger> <Logger name="com.skd.server" level="info" additivity="false">
<AppenderRef ref="console"></AppenderRef>
<AppenderRef ref="error"></AppenderRef>
<AppenderRef ref="rollingFile"></AppenderRef>
</Logger> <!--日志信息输出的最低级别-->
<Root level="debug">
</Root> </Loggers> </configuration>

2. 日志格式配置

PatternLayout:

  • %m 输出代码中指定的消息;
  • %M 输出打印该条日志的方法名;
  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;
  • %r 输出自应用启动到输出该log信息耗费的毫秒数;
  • %c 输出所属的类目,通常就是所在类的全名;
  • %t 输出产生该日志事件的线程名;
  • %n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”;
  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;
  • %l 输出日志事件的发生位置,及在代码中的行数;

3. 原理解析

3.1 删除策略

  删除策略逻辑处理的代码:有兴趣可以debug看下代码

public class DeletingVisitor extends SimpleFileVisitor<Path> {
private static final Logger LOGGER = StatusLogger.getLogger(); private final Path basePath;
private final boolean testMode;
private final List<? extends PathCondition> pathConditions; /**
* 删除策略逻辑处理的方法
*/
@Override
public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
for (final PathCondition pathFilter : pathConditions) {
final Path relative = basePath.relativize(file);
if (!pathFilter.accept(basePath, relative, attrs)) {
LOGGER.trace("Not deleting base={}, relative={}", basePath, relative);
return FileVisitResult.CONTINUE;
}
}
if (isTestMode()) {
LOGGER.info("Deleting {} (TEST MODE: file not actually deleted)", file);
} else {
delete(file);
}
return FileVisitResult.CONTINUE;
}
}

  不同标签实现实现了accept()方法,根据自己的策略返回是否需要删除文件的结果 true或false

  

spring boot log4j2配置的更多相关文章

  1. 转:spring boot log4j2配置(使用log4j2.yml文件)---YAML 语言教程

    转:spring boot log4j2配置(使用log4j2.yml文件) - CSDN博客http://blog.csdn.net/ClementAD/article/details/514988 ...

  2. Spring Boot 日志配置

    Spring Boot 日志配置 默认日志 Logback: 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很 ...

  3. Spring Boot常用配置

    概述 本文主要写了下Spring Boot的一些常用配置. Spring Boot基本配置 入口类: Spring Boot通常有一个名为*Application的入口类,入口类里面有一个main方法 ...

  4. 玩转spring boot——properties配置

    前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...

  5. Spring Boot 属性配置和使用

    Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...

  6. Spring Boot 属性配置和使用(转)

    Spring Boot 属性配置和使用 Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配置文件来注入属性或者修改默认的配置. Spring Boot ...

  7. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

  8. Springboot 系列(三)Spring Boot 自动配置原理

    注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring ...

  9. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

随机推荐

  1. eosjs

    [eosjs] Javascript API,用于帮助访问与 EOSIO RPC API. 1.安装 npm install eosjs@beta 2.Signature Provider The S ...

  2. 小强学渲染之OpenGL的CPU管线

    读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...

  3. HDU-1078.FatMouseandCheese(线性dp + dfs)

    本题大意:在一个n * n的迷宫内进行移动,左上角为初始位置,每次可以走的步数不能超过m,并且每次走的方格上面的数字要大于前一次走的放个数字,不能走到格子外面,问如何能使得到的数字和最大. 本题思路: ...

  4. Python开发【第八篇】:socket网络编程

    服务端: import socket server = socket.socket() #绑定要监听的端口 server.bind(('localhost',6969)) #监听 server.lis ...

  5. Centos7编译安装lnmp(nginx1.10 php7.0.2)

    我使用的是阿里云的服务器 Centos7 64位的版本 1. 连接服务器 这个是Xshell5的版本 安装好之后我们开始连接服务器 2. 安装nginx 首先安装nginx的依赖 yum instal ...

  6. Springboot08-项目单元测试(接口测试)

    Springboot08-项目单元测试(接口测试) 前言 1-本文重点在于源码层面,分析Springboot单元测试的使用,对于其中的注解.方法等,不会仔细分析: 2-本文项目实例相关配置:Java- ...

  7. 4412 uboot上手

    1,了解 print  查看UBOOT软件的环境变量       (变量名=变量) setenv.saveenv   setenv abc 100 200   设置 添加一个变量值 修改一个已有的变量 ...

  8. PHP常见的一些问题总结(收藏)

    本篇文章给大家带来的内容是关于PHP常见的一些问题总结(收藏),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 字符串定义的时候单引号和双引号有什么区别? 单引号加载速度比双引号 ...

  9. 20165213Java第二次实验

    实验二Java面向对象程序设计 实验1 实验目的与要求: 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 提交 ...

  10. 模板学习实践三 functor

    #include <iostream>#include <typeinfo> void foo(){ std::cout << "foo() called ...