本文共 2643 字,大约阅读时间需要 8 分钟。
应用日志由发表在
日志对于应用程序来说是非常重要的,框架本身集成了不少其他工具,我们自身的应用也会使用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志。
——Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一抽象。日志框架众多——常用的有java.util.logging
, log4j
, logback
,commons-logging
, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。
是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。
实现了一套日志系统——它能够根据类路径上的内容来决定使用哪一种日志框架,logback
是最优先的选择。配置了logback.xml
可以利用Spring Boot提供的默认日志配置:
这样就定义了一个<logger>
捕获org.springframework.web
的日志,日志级别是DEBUG
,base.xml
内容如下:
Spring Boot的日志系统预先定义了一些系统变量:
${PID}
,当前进程ID${LOG_FILE}
,Spring Boot配置文件中logging.file
的值${LOG_PATH}
, Spring Boot配置文件中logging.path
的值 同时默认情况下包含另个appender
——一个是控制台,一个是文件,分别定义在console-appender.xml
和file-appender.xml
中。同时对于应用的日志级别也可以通过application.properties
进行定义:
logging.level.org.springframework.web=DEBUGlogging.level.org.hibernate=ERROR
这等价于在logback.xml
配置appender
的日志级别。
Logback使用appender
来定义日志输出,在开发过程中最常用的是将日志输出到控制台:
.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n TRACE
<encoder>
表示对日志进行编码:
%d{HH:mm:ss.SSS}
——日志输出时间%thread
——输出日志的进程名字,这在Web应用以及异步任务处理中很有用%-5level
——日志级别,并且使用5个字符靠左对齐%logger{36}
——日志输出者的名字%msg
——日志消息%n
——平台的换行符在这种格式下一条日志的输出结果如下:
0:12:51.012 [qtp231719230-45] DEBUG o.c.d.r.util.LoggingResponseFilter
另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender
用于切分文件日志:
/data/log/app.log rest-demo.%d{yyyy-MM-dd}.log 30 %d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n
其中重要的是rollingPolicy
的定义,上例中<FileNamePattern>rest-demo.%d{yyyy-MM-dd}.log</FileNamePattern>
定义了日志的切分方式——把每一天的日志归档到一个文件中,<maxHistory>30</maxHistory>
表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}
来定义精确到分的日志切分方式。
是一个统一的日志跟踪平台,在传统的日志管理中,都是在服务器上通过tail
, vim
等工具查看日志,并且不同的日志位置也个不相同,而Sentry则是将这些日志(主要是错误日志)通过统一的接口收集起来,并且提供跟踪、管理的功能,使得应用程序的错误、Bug能够即时被解决。
Sentry提供了Java库——,Java应用程序能够在捕获异常后将其发送到Sentry服务器中,另一方面它包含了各类日志框架的支持,以Logbakc为例:
net.kencochrane.raven raven-logback 6.0.0
在logback.xml
中定义appender
:
https://publicKey:secretKey@host:port/1?options tag1:value1,tag2:value2
我们推荐在这个<appender>
中加入<filter>
用于过滤ERROR
级别的日志。
更多文章请访问