Spring Boot日志功能

标签: Springboot 分类: Java 创建时间:2020-05-06 09:28:02 更新时间:2024-11-12 12:53:37

默认的spring boot已经支持logback日志功能了,只需要增加两块内容,就可以轻松使用logback日志了。

(1) 第一部分内容,就是在resources文件夹下创建logback-spring.xml或者是logbakc.xml的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="/Users/tengjun/Documents/log" />
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>-->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<!--输出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<MaxHistory>${maxHistory}</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>

<!-- logback为java中的包 -->
<logger name="com.dudu.controller"/>
<!--logback.LogbackDemo:类的全路径 -->
<logger name="com.dudu.controller.LearnController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>

(2) 第二部分就是在需要写日志的类或函数中,添加 public static final Logger logger = LoggerFactory.getLogger(this.getClass()); 代码就可以使用 logger.error()、logger.info() 等方法了,至于配置文件中各项配置的意义和作用,以及logger的使用方法,可以详见参考文章。另外,为了方便统一管理,在logback-spring.xml中也可以使用spring boot的application.yml配置文件中的内容,比如,log存放的文件位置,我可以在application.yml中定义好,而不用在logback-spring.xml中写了。这里logback配置文件的名称就必须是logback-spring.xml,而不能是logbak.xml了 logback-spring.xml中定义

1
2
<!-- 配置文件名必须为logback-spring.xml,否则applicationName在一开始会找不到,会生成一个applicationName_IS_UNDEFINED.log的空文件 -->
<springProperty scope="context" name="applicationName" source="spring.application.name" defaultValue="localhost"/>

然后就可以在logback-spring.xml中的其他地方使用 ${applicationName} 引用applicationName的值了。

注意
这里有一点需要注意的是,在application.propreties文件中,属性值不能加引号。比如:logfilepath=”D:\z\P\log”。(这是在windows下的路径写法,linux下用:/z/p/log)

在logback-spring.xml中应用logfilepath时:

1
<springProperty scope="context" name="log.path" source="logfilepath" defaultValue="./log"/>

就会报错:

这个时候application.propreties中,应该写成 logfilepath=D:\z\P\log ,去掉双引号。如果是在 application.yml 中,那么 logfilepath 就应该加引号,logfilepath: “D:\z\P\log”

(路径解析)
4.Windows/Linux路径不同时,统一war的最简办法
5.windows系统和Linux系统下文件路径”" 和 “/”

问题

(1) logger.error(),logger.info()无法打印对象,下面代码中,log.error本意是打印accessToken这个对象,但是实际上,无论怎么执行,都无法输出access_token。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private Logger log = LoggerFactory.getLogger(LogJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) {
try {
map = new HashMap<>();
//请求token
String accessTokenUrl = "";
JSONObject accessToken = DDAuthUntil.httpGet(accessTokenUrl);
log.error("accessToken",accessToken.getString("access_token"),"dsfasfasdf");

}catch (Exception e){
e.printStackTrace();
}
}

在调试的时候,明明是有值的,估计是因为logger.error无法输出对象,问题还待解决。

3.问题

(1) no applicable action for [maxFileSize], current ElementPath is [[configuration][appender][rollingPolicy][maxFileSize]]

参考文章:
1.[Logback file error : no applicable action for [rollingPolicy], current pattern is [[configuration][appender][rollingPolicy]]](https://stackoverflow.com/questions/29864049/logback-file-error-no-applicable-action-for-rollingpolicy-current-pattern-i) (这里其实是说了use a logger of type RollingFileAppender, not FileAppender)

(2) cleanHistoryOnStart不起作用
我设置了cleanHistoryOnStart为true,但是在应用程序启动后,还是没有删除已有的日志文件,而且配置了maxHistory也不起作用。

1
2
3
4
5
6
7
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
<maxFileSize>50MB</maxFileSize> <!-- 日志文件过大会使的编辑器打开非常慢,因此设置日志最大50MB -->
<maxHistory>1</maxHistory> <!-- 保存30天 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 总日志大小 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>

注意
第一点:这里有一点需要解释的就是,假如你配置了${log.path}/logback.%d{yyyy-MM-dd}_%i.log这个模式,那么它只会自动删除类似于:logback.2021-01-18_0.log 这样的文件,而目录中的其他的文件是不会自动删除的,比如:logback.2020-11-23.log 文件。

第二点:maxHistroy是只保留最近的5天的日志,那么如果是 logback.2020-12-11.log 号的日志,它就不会自动删除。

参考文章:
1.logging - 重新登录-cleanHistoryOnStart不起作用
2.logback设置maxHistory 日志清除不起作用 (虽然这么设置了,但是还是不起作用)
3.【spring boot系列】Java 日志实现框架 Logback 配置详解 (这里有logback的详细说明)
4.logback简单使用及 MaxHistory 属性日志文件保留天数不生效问题
5.logback日志的删除策略 (这里讲了两个日志删除策略,就是超出maxHistory定义的时间的64天之前的日志是不会被清理的,这一点我有点没弄明白,根据我的实际测试这个天数应该是30天,比如当前时间是1月18号,定义maxHistroty为1,则只会删除12月16号到1月16号的日志,保留1月17号的日志,12月15号的日志文件及其之前的天数的文件都不会自动删除)
6.logback:RollingFileAppender (这里讲了各种滚动策略,比如:TimeBasedRollingPolicy 基于时间滚动,SizeAndTimeBasedRollingPolicy 基于时间+大小进行滚动,ixedWindowRollingPolicy 基于窗口滚动)

(3) Missing integer token, that is %i, in FileNamePattern

(4) 生成 IS_UNDEFINED
按上述方式,还是会产生一个 IS_UNDEFINED 文件,这个时候要在logback-spring.xml中,加一个property的resource,如果是yml应该是application.yml

1
2
3
4
5
6
7
<property resource="application.properties" />
<!-- 或者 -->
<property resource="application.yml" />

<!-- 然后引用yml中的变量 -->
<springProperty scope="context" name="log.path" source="logfilepath"/>

这样应该就不会出现IS_UNDEFINED文件了,真实性,有待验证(因为我debug的时候,没有出现这个文件,但是不知道什么时候就有了)

1
logfilepath: "/cloud/dev/PhDevice/PhDeviceAdmin/log"

~~ 根据最新的参考文章2、3、4,除了在yml中,要写成loggin.file.path(不能自定义,键入logging的时候会有提示),

1
2
3
logging:
file:
path: "/cloud/dev/PhDevice/PhDeviceAdmin/log"

而且在logback-spring.xml中,要使用

1
<springProperty scope="context" name="log.path" source="${LOG_PATH}"/>

~~

参考文章:
1.logback 生成日志时日志名称为XXX_IS_UNDEFINED
2.解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题
3.SpringBoot与LogBack创建LOG_PATH_IS_UNDEFINED文件夹
4.带有LogBack的SpringBoot创建LOG_PATH_IS_UNDEFINED文件夹
5.SpringBoot项目在logback.xml中读取配置中的日志路径问题 因为最先加载的是application.properties,logback.xml的加载晚于application.properties,所以logback.xml可以读到application.properties里面配置的值。logback.xml的加载要先于application.yml,所以直接通过${参数key}的形式获取是无法获取到application.yml对应参数值的。
6.【Springboot】使用logback莫名出现 IS_UNDEFINED 日志目录,其中记录的是 bootstrap.info.log 相关日志
7.SpringBoot与LogBack创建LOG_PATH_IS_UNDEFINED文件夹
文章目录
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。