关注微信公众号:CodingTechWork,一起学习进步。

引言

  对于一个线上程序或者服务而言,重要的是要有日志输出,这样才能方便运维。而日志的输出需要有一定的规划,如日志命名、日志大小,日志分割的文件个数等。在Spring的框架下,我们可以使用log4j来进行日志的设置,高版本的SpringBoot会使用log4j2

介绍

log4j2概述

  截取官网的原话:Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.
  Log4j其实可以理解为log for java,所以是java的日志框架,提供日志服务,而Log4j 2是Log4j的升级版本,性能比logback好。
  日志级别优先级从低到高:ALL、DEBUG、 INFO、 WARN、 ERROR、FATAL、 OFF。一般官网建议就使用DEBUG、INFO、WARN和ERROR这四个,但是我们可以加一个ALL最低级别的来进行总日志的输出。日志的登记越高,打出的日志越少。

log4j2的pom依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-log4j2</artifactId>
  14. </dependency>

这边要注意的是:

  1. 在引入log4j2时,需要排除掉Logback日志框架的依赖即。
  1. <artifactId>spring-boot-starter-logging</artifactId>
  1. 如果是1.3.x及以下版本的Spring Boot才支持log4j的日志配置。
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-log4j</artifactId>
  14. </dependency>

log4j2.xml配置路径

  log4j2一般可以通过xml,json,yaml或者properties形式文件来实现,我们这边主要介绍xml文件格式。

默认路径

  引入log4j2依赖后,默认在src/main/resources目录下加入log4j2.xml配置文件对日志进行配置即可,然后在application.yml中进行访问路径的配置。


  示例如下:

  1. log4j2.xml部署位置

    在代码工程中的src/main/resources目录下放入配置文件。
  2. yml配置
  1. #日志配置 无特殊需求无需更改
  2. logging:
  3. config: classpath:log4j2.xml
  4. level:
  5. root: INFO
  6. javax.activation: info
  7. org.apache.catalina: INFO
  8. org.apache.commons.beanutils.converters: INFO
  9. org.apache.coyote.http11.Http11Processor: INFO
  10. org.apache.http: INFO
  11. org.apache.tomcat: INFO
  12. org.springframework: INFO
  13. com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG

自定义部署位置

当然我们也可以在微服务部署的config/目录下放置,然后在application.yml中进行访问路径的配置。
  示例如下:我们的micro-service01部署中配置的log4j2.xml路径。

  1. log4j2.xml部署位置
  1. [userA@linux01 config]$ pwd
  2. /home/userA/SpringBoot/micro-service01/config
  3. [userA@linux01 config]$ ll
  4. total 24
  5. -rwxr-xr-x 1 userA userA 5938 Sep 9 16:30 application.yml
  6. -r-------- 1 userA userA 8342 Sep 8 16:33 log4j2.xml
  1. yml配置
  1. #日志配置 无特殊需求无需更改
  2. logging:
  3. config: /home/userA/SpringBoot/micro-service01/config/log4j2.xml
  4. level:
  5. root: INFO
  6. javax.activation: info
  7. org.apache.catalina: INFO
  8. org.apache.commons.beanutils.converters: INFO
  9. org.apache.coyote.http11.Http11Processor: INFO
  10. org.apache.http: INFO
  11. org.apache.tomcat: INFO
  12. org.springframework: INFO
  13. com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG

log4j2.xml配置详解

xml配置模板

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration>
  3. <!--<Configuration status="WARN" monitorInterval="30"> -->
  4. <properties>
  5. <property name="LOG_HOME">./service-logs</property>
  6. </properties>
  7. <Appenders>
  8. <!--*********************控制台日志***********************-->
  9. <Console name="consoleAppender" target="SYSTEM_OUT">
  10. <!--设置日志格式及颜色-->
  11. <PatternLayout
  12. pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
  13. disableAnsi="false" noConsoleNoAnsi="false"/>
  14. </Console>
  15. <!--*********************文件日志***********************-->
  16. <!--all级别日志-->
  17. <RollingFile name="allFileAppender"
  18. fileName="${LOG_HOME}/all.log"
  19. filePattern="${LOG_HOME}/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz">
  20. <!--设置日志格式-->
  21. <PatternLayout>
  22. <pattern>%d %p %C{} [%t] %m%n</pattern>
  23. </PatternLayout>
  24. <Policies>
  25. <!-- 设置日志文件切分参数 -->
  26. <!--<OnStartupTriggeringPolicy/>-->
  27. <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
  28. <SizeBasedTriggeringPolicy size="100 MB"/>
  29. <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
  30. <TimeBasedTriggeringPolicy/>
  31. </Policies>
  32. <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
  33. <DefaultRolloverStrategy max="100"/>
  34. </RollingFile>
  35. <!--debug级别日志-->
  36. <RollingFile name="debugFileAppender"
  37. fileName="${LOG_HOME}/debug.log"
  38. filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
  39. <Filters>
  40. <!--过滤掉info及更高级别日志-->
  41. <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
  42. </Filters>
  43. <!--设置日志格式-->
  44. <PatternLayout>
  45. <pattern>%d %p %C{} [%t] %m%n</pattern>
  46. </PatternLayout>
  47. <Policies>
  48. <!-- 设置日志文件切分参数 -->
  49. <!--<OnStartupTriggeringPolicy/>-->
  50. <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
  51. <SizeBasedTriggeringPolicy size="100 MB"/>
  52. <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
  53. <TimeBasedTriggeringPolicy/>
  54. </Policies>
  55. <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
  56. <DefaultRolloverStrategy max="100"/>
  57. </RollingFile>
  58. <!--info级别日志-->
  59. <RollingFile name="infoFileAppender"
  60. fileName="${LOG_HOME}/info.log"
  61. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
  62. <Filters>
  63. <!--过滤掉warn及更高级别日志-->
  64. <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
  65. </Filters>
  66. <!--设置日志格式-->
  67. <PatternLayout>
  68. <pattern>%d %p %C{} [%t] %m%n</pattern>
  69. </PatternLayout>
  70. <Policies>
  71. <!-- 设置日志文件切分参数 -->
  72. <!--<OnStartupTriggeringPolicy/>-->
  73. <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
  74. <SizeBasedTriggeringPolicy size="100 MB"/>
  75. <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
  76. <TimeBasedTriggeringPolicy interval="1" modulate="true />
  77. </Policies>
  78. <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
  79. <!--<DefaultRolloverStrategy max="100"/>-->
  80. </RollingFile>
  81. <!--warn级别日志-->
  82. <RollingFile name="warnFileAppender"
  83. fileName="${LOG_HOME}/warn.log"
  84. filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
  85. <Filters>
  86. <!--过滤掉error及更高级别日志-->
  87. <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
  88. </Filters>
  89. <!--设置日志格式-->
  90. <PatternLayout>
  91. <pattern>%d %p %C{} [%t] %m%n</pattern>
  92. </PatternLayout>
  93. <Policies>
  94. <!-- 设置日志文件切分参数 -->
  95. <!--<OnStartupTriggeringPolicy/>-->
  96. <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
  97. <SizeBasedTriggeringPolicy size="100 MB"/>
  98. <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
  99. <TimeBasedTriggeringPolicy/>
  100. </Policies>
  101. <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
  102. <DefaultRolloverStrategy max="100"/>
  103. </RollingFile>
  104. <!--error及更高级别日志-->
  105. <RollingFile name="errorFileAppender"
  106. fileName="${LOG_HOME}/error.log"
  107. filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
  108. <!--设置日志格式-->
  109. <PatternLayout>
  110. <pattern>%d %p %C{} [%t] %m%n</pattern>
  111. </PatternLayout>
  112. <Policies>
  113. <!-- 设置日志文件切分参数 -->
  114. <!--<OnStartupTriggeringPolicy/>-->
  115. <!--设置日志基础文件大小,超过该大小就触发日志文件滚动更新-->
  116. <SizeBasedTriggeringPolicy size="100 MB"/>
  117. <!--设置日志文件滚动更新的时间,依赖于文件命名filePattern的设置-->
  118. <TimeBasedTriggeringPolicy/>
  119. </Policies>
  120. <!--设置日志的文件个数上限,不设置默认为7个,超过大小后会被覆盖;依赖于filePattern中的%i-->
  121. <DefaultRolloverStrategy max="100"/>
  122. </RollingFile>
  123. <!--json格式error级别日志-->
  124. <RollingFile name="errorJsonAppender"
  125. fileName="${LOG_HOME}/error-json.log"
  126. filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
  127. <JSONLayout compact="true" eventEol="true" locationInfo="true"/>
  128. <Policies>
  129. <SizeBasedTriggeringPolicy size="100 MB"/>
  130. <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  131. </Policies>
  132. </RollingFile>
  133. </Appenders>
  134. <Loggers>
  135. <!-- 根日志设置 -->
  136. <Root level="debug">
  137. <AppenderRef ref="allFileAppender" level="all"/>
  138. <AppenderRef ref="consoleAppender" level="debug"/>
  139. <AppenderRef ref="debugFileAppender" level="debug"/>
  140. <AppenderRef ref="infoFileAppender" level="info"/>
  141. <AppenderRef ref="warnFileAppender" level="warn"/>
  142. <AppenderRef ref="errorFileAppender" level="error"/>
  143. <AppenderRef ref="errorJsonAppender" level="error"/>
  144. </Root>
  145. <!--spring日志-->
  146. <Logger name="org.springframework" level="debug"/>
  147. <!--druid数据源日志-->
  148. <Logger name="druid.sql.Statement" level="warn"/>
  149. <!-- mybatis日志 -->
  150. <Logger name="com.mybatis" level="warn"/>
  151. <Logger name="org.hibernate" level="warn"/>
  152. <Logger name="com.zaxxer.hikari" level="info"/>
  153. <Logger name="org.quartz" level="info"/>
  154. <Logger name="com.andya.demo" level="debug"/>
  155. </Loggers>
  156. </Configuration>

配置参数详解

Configuration

根节点Configuration中有两个常用的属性:status和monitorterval。如:<Configuration status="WARN" monitorInterval="30">


属性

  1. status:是用于指定log4j的级别;
  2. monitorterval:是用于指定log4j自动重新检测读取配置内容的间隔时间,单位为秒(s),最小值为5秒。

Properties

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <properties>
  4. <property name="LOG_HOME">./service-logs</property>
  5. </properties>
  6. <Appenders>
  7. <File name="MyFile" fileName="${LOG_HOME}/app.log">
  8. <PatternLayout>
  9. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  10. </PatternLayout>
  11. </File>
  12. </Appenders>
  13. <Loggers>
  14. <Root level="error">
  15. <AppenderRef ref="MyFile"/>
  16. </Root>
  17. </Loggers>
  18. </Configuration>

变量配置,如模板中的 <property name="LOG_HOME">./service-logs</property>,我们可以配置日志的路径。后续日志存放的前缀路径即为./service-logs下, <File name="MyFile" fileName="${LOG_HOME}/app.log">中配置了前缀,app.log就会存放在./service-logs下。

Appenders

Console

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <Appenders>
  4. <Console name="STDOUT" target="SYSTEM_OUT">
  5. <PatternLayout pattern="%m%n"/>
  6. </Console>
  7. </Appenders>
  8. <Loggers>
  9. <Root level="error">
  10. <AppenderRef ref="STDOUT"/>
  11. </Root>
  12. </Loggers>
  13. </Configuration>

  Console节点用于定义输出控制台的Appender。


属性

  1. name:用于指定Appender的名称;
  2. target:用于指定输出目标,一般是SYSTEM_OUTSYSTEM_ERR,默认是SYSTEM_OUT

节点

  1. PatternLayout:用于指定输出格式,不设置的话,默认为:%m%n

File

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <Appenders>
  4. <File name="MyFile" fileName="logs/app.log">
  5. <PatternLayout>
  6. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  7. </PatternLayout>
  8. </File>
  9. </Appenders>
  10. <Loggers>
  11. <Root level="error">
  12. <AppenderRef ref="MyFile"/>
  13. </Root>
  14. </Loggers>
  15. </Configuration>

  File节点用于将日志输出到指定文件,一般不用该节点,而使用RollingFile节点。


属性

  1. name:用于指定Appender的名称;
  2. fileName:用于指定日志文件的全路径;

节点

  1. PatternLayout:用于指定输出格式,不设置的话,默认为:%m%n

RollingFile

  RollingFile节点用于实现日志文件更动更新的Appender,当满足条件(日志大小、指定时间等)重命名或打包原日志文件进行归档,生成新日志文件用于日志写入。
  我们可以设置ALL、DEBUG、 INFO、 WARN、 ERROR这些级别的RollingFileAppender。

(1)基于大小的滚动策略
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <Appenders>
  4. <RollingFile name="RollingFile" fileName="logs/app.log"
  5. filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
  6. <PatternLayout>
  7. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  8. </PatternLayout>
  9. <Policies>
  10. <TimeBasedTriggeringPolicy />
  11. <SizeBasedTriggeringPolicy size="100 MB"/>
  12. </Policies>
  13. <DefaultRolloverStrategy max="10"/>
  14. </RollingFile>
  15. </Appenders>
  16. <Loggers>
  17. <Root level="error">
  18. <AppenderRef ref="RollingFile"/>
  19. </Root>
  20. </Loggers>
  21. </Configuration>

  上述模板中,日志先写入logs/app.log中,每当文件大小达到100MB时或经过1天,按照在logs/2020-09/目录下以app-2020-09-09-1.log.gz格式对该日志进行压缩重命名并归档,并生成新的文件app.log进行日志写入。
  其中,filePattern属性的文件格式中%i就类似于一个整数计数器,受到 <DefaultRolloverStrategy max="10"/>控制,要特别注意的是:当文件个数达到10个的时候会循环覆盖前面已归档的1-10个文件。若不设置该参数,默认为7

(2)基于时间间隔的滚动策略
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <Appenders>
  4. <RollingFile name="RollingFile" fileName="logs/app.log"
  5. filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}.log.gz">
  6. <PatternLayout>
  7. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  8. </PatternLayout>
  9. <Policies>
  10. <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
  11. </Policies>
  12. </RollingFile>
  13. </Appenders>
  14. <Loggers>
  15. <Root level="error">
  16. <AppenderRef ref="RollingFile"/>
  17. </Root>
  18. </Loggers>
  19. </Configuration>

  上述模板中,日志先写入logs/app.log中,每当文件的时间间隔到达6小时(由%d{yyyy-MM-dd-HH}决定,也可以设置成%d{yyyy-MM-dd-HH-mm},则间隔为分钟级别),触发rollover操作。
  如上配置设置好后,10点的日志开始重启服务,则从11点触发一次rollover操作,生成2020-09-09-10.log.gz对该日志进行压缩重命名并归档,并生成新的文件app.log进行日志写入;然后,每间隔6小时,则下一次是17点触发一次,生成2020-09-09-17.log.gz对该日志进行压缩重命名并归档,并生成新的文件app.log进行日志写入。

(3)基于时间间隔和文件大小的滚动策略
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <Appenders>
  4. <RollingFile name="RollingFile" fileName="logs/app.log"
  5. filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
  6. <PatternLayout>
  7. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  8. </PatternLayout>
  9. <Policies>
  10. <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
  11. <SizeBasedTriggeringPolicy size="100 MB"/>
  12. </Policies>
  13. </RollingFile>
  14. </Appenders>
  15. <Loggers>
  16. <Root level="error">
  17. <AppenderRef ref="RollingFile"/>
  18. </Root>
  19. </Loggers>
  20. </Configuration>

  上述模板中,日志先写入logs/app.log中,每当文件大小达到100MB或者当时间间隔到达6小时(由%d{yyyy-MM-dd-HH}决定),触发rollover操作,按照在logs/2020-09/目录下以app-2020-09-09-1.log.gz格式对该日志进行压缩重命名并归档,并生成新的文件app.log进行日志写入。

属性

  1. name:用于指定Appender的名称;
  2. fileName:用于指定日志文件的全路径;
  3. filePattern:用于指定分割文件的日志全路径(命名规则)。

节点

  1. PatternLayout:用于指定输出格式,不设置的话,默认为:%m%n
  2. Policies :设置日志文件切割参数;
  3. SizeBasedTriggeringPolicy:Policies的子节点,用于设置基于日志文件大小触发的滚动策略,size属性用来指定每个分割的日志文件大小。
  4. TimeBasedTriggeringPolicy:Policies的子节点,用于设置基于时间间隔触发的滚动策略,interval属性用于指定滚动时间间隔,默认是1小时,modulate属性是用于对interval进行偏移调节,默认为false。若为true,则第一次触发时是第一个小时触发,后续以interval间隔触发。
  5. CronTriggeringPolicy:Policies的子节点,用于设置基于Cron表达式触发的滚动策略。
  6. DefaultRolloverStrategy:设置默认策略设置。

Loggers

节点

  1. Root:用于指定项目的根日志,level属性表示日志输出级别,子节点AppenderRef用于指定输出到某个Appender,子节点的ref属性也就是前面的RollingFile中指定的name名称,子节点的level也是日志输出级别。
  2. Logger :用于指定日志的形式,指定不同包的日志级别,level属性表示日志输出级别,name属性用来指定该Logger所适用的类或者类的全路径。子节点AppenderRef用于指定日志输出到哪个Appender,若没有指定,默认集成自Root。

参考
log4j2的官网地址

SpringBoot—整合log4j2入门和log4j2.xml配置详解的更多相关文章

  1. Log4j2详解——XML配置详解

    Log4j2详解--XML配置详解 找到了个很详细的文章链接 https://www.jianshu.com/p/bfc182ee33db

  2. Spring 入门 web.xml配置详解

    Spring 入门 web.xml配置详解 https://www.cnblogs.com/cczz_11/p/4363314.html https://blog.csdn.net/hellolove ...

  3. java web.xml配置详解(转)

    源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...

  4. web.xml配置详解之listener

    web.xml配置详解之listener 定义 <listener> <listener-class>nc.xyzq.listener.WebServicePublishLis ...

  5. tomcat中server.xml配置详解(转载)(一)

    转载自:https://www.cnblogs.com/starhu/p/5599773.html tomcat中server.xml配置详解 Tomcat Server的结构图如下:(该文件描述了如 ...

  6. Web.xml配置详解(转)

    Web.xml配置详解 Posted on 2010-09-02 14:09 chinaifne 阅读(295105) 评论(16) 编辑 收藏 1 定义头和根元素 部署描述符文件就像所有XML文件一 ...

  7. Tomcat中的Server.xml配置详解

    Tomcat中的Server.xml配置详解 Tomcat Server的结构图如下: 该文件描述了如何启动Tomcat Server <Server> <Listener /> ...

  8. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  9. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

随机推荐

  1. 《Java核心技术(卷1)》笔记:第12章 并发

    线程 (P 552)多进程和多线程的本质区别:每一个进程都拥有自己的一整套变量,而线程共享数据 (P 555)线程具有6种状态: New(新建):使用new操作符创建线程时 Runnable(可运行) ...

  2. artifactdescriptorexception:Failed to read artifact descriptor for xxx:jar ”

    在Eclipse中执行Maven的install命令时,报“Failed to read artifact descriptor for xxx:jar ”的错误.这可能是在下载过程中文件出现错误.或 ...

  3. 分享一个Flink checkpoint失败的问题和解决办法

    本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 接触Flink一段时间了,遇到了一些问题,其中有一个checkpoint失败导致作业重启的问题,遇到了很多次,重启之后一般也能恢复正常, ...

  4. 【面经】超硬核面经,已拿蚂蚁金服Offer!!

    写在前面 很多小伙伴都反馈说,现在的工作不好找呀,也不敢跳槽,在原来的岗位上也是战战兢兢!其实,究其根本原因,还是自己技术不过关,如果你技术真的很硬核,怕啥?想去哪去哪呗!这不,我的一个读者去面试了蚂 ...

  5. C、C++、Java、Python该怎么选

    对于很多对编程感兴趣的小伙.或是正在读计算机专业的大学生来说,不知道要选择哪一门编程语言发展.对于计算机专业的学生,一般的学习都普遍会开始设C.C++.Java等热门的编程语言,但还是不太清楚选择哪一 ...

  6. graphics.h源代码下载

    graphics.h源代码下载 /*graphics.h DefinitionsforGraphicsPackage. Copyright(c)BorlandInternational1987,198 ...

  7. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统四 | 强化设计方案

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 强化 先来记录一下我们现在的样子,一会好做个对比 1.在EasyLogger.DbSto ...

  8. 基于Java的二叉树的三种遍历方式的递归与非递归实现

    二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...

  9. 获取元素top值,屏幕滚动到当前元素

    var top = $(this).offset().top; $('html , body').animate({scrollTop: top-100},10);

  10. python 递归删除空文件夹

    Python如何递归删除空文件夹 1.Python如何递归删除空文件夹,这个问题很常见.但大多数人的解决办法都是自己实现递归函数解决这个问题,其实根本不用那么麻烦.Python中的os.walk提供了 ...