文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、logback简介
1.1 官网
1.2 简单介绍
logback是Java的开源框架,是由 log4j创始人设计的又一个开源日志组件,性能比log4j要好。
是springboot自带的日志框架。该框架主要有3个模块:
`logback-core`:核心代码块,是其他两个模块的基础模块。
`logback-classic`:实现了slf4j的api,加入该依赖可以实现log4j的api。
`logback-access`:访问模块与servlet容器集成提供通过http来访问日志的功能
(也就是说不需要访问服务器,直接在网页上就可以访问日志文件)。
1.3 依赖查看
综上,引入该组件三个模块只需要引入spring-boot-starter-web依赖即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>
二、日志文件配置和解析
2.1 输出目录配置
2.2 具体输出方式配置
2.3 输出方式引用
2.4 所有配置总结如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 应用名称全局设定-->
<property name="appName" value="logs"/>
<!-- 日志的存放目录全局设定-->
<property name="DEBUG_LOG_FILE_NAME_PATTERN" value="${appName}/debug.%d{yyyy-MM-dd}.%i.log"/>
<property name="INFO_LOG_FILE_NAME_PATTERN" value="${appName}/info.%d{yyyy-MM-dd}.%i.log"/>
<property name="WARN_LOG_FILE_NAME_PATTERN" value="${appName}/warn.%d{yyyy-MM-dd}.%i.log"/>
<property name="ERROR_LOG_FILE_NAME_PATTERN" value="${appName}/error.%d{yyyy-MM-dd}.%i.log"/>
<property name="SYS_INFO_LOG_FILE_NAME_PATTERN" value="${appName}/sys/info.%d{yyyy-MM-dd}.%i.log"/>
<property name="SYS_ERROR_LOG_FILE_NAME_PATTERN" value="${appName}/sys/error.%d{yyyy-MM-dd}.%i.log"/>
<!-- 日志输出格式全局设定 -->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%c){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<property name="FILE_LOG_PATTERN"
value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %c : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 输出到控制台 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- sys 输出info -->
<appender name="sys_info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SYS_INFO_LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>1GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- sys 输出error -->
<appender name="sys_error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${SYS_ERROR_LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>1GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 业务 输出到DEBUG文件 -->
<appender name="debug_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${DEBUG_LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>2GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 业务 输出到INFO文件 -->
<appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>1GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>50MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 业务 输出到WARN文件 -->
<appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${WARN_LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>1GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 业务 输出到ERROR文件 -->
<appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_FILE_NAME_PATTERN}</fileNamePattern>
<!-- 日志保留天数 -->
<maxHistory>30</maxHistory>
<!-- 日志文件上限大小,达到指定大小后删除旧的日志文件 -->
<totalSizeCap>1GB</totalSizeCap>
<!-- 每个日志文件的最大值 -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 根据不同的环境设置不同的日志输出级别 -->
<springProfile name="default,local">
<root level="console,info,error">
<appender-ref ref="console"/>
<appender-ref ref="sys_info_file"/>
<appender-ref ref="sys_error_file"/>
</root>
</springProfile>
<springProfile name="pro">
<root level="error,info">
<appender-ref ref="sys_info_file"/>
<appender-ref ref="sys_error_file"/>
</root>
</springProfile>
<!-- 业务 这里的name可以在业务中注解引入 @Slf4j(topic = "userController") 可放在具体环境内,也可直接如下拿出来所有环境适用,上面截图是把这段放在具体环境内,仅对配置的当前环境有效 -->
<logger name="userController" level="info" additivity="true">
<appender-ref ref="info_file"/>
<appender-ref ref="warn_file"/>
<appender-ref ref="debug_file"/>
<appender-ref ref="error_file"/>
</logger>
</configuration>
线上发布可配合容器服务挂载数据卷方式在宿主机直接查看日志。
日志采集可通过具体采集技术如flume进行日志采集,编写shell脚本进行采集或其他方式
如果当前环境存在日志分析系统,那就可以将所有的应用日志进行汇总分析。
如果存在大数据相关的体系如实时分析或者数离线分析。使用kafka我想应该也是可以。
技术服务业务,具体使用何种技术进行分析我想这些都是需要结合当前环境和体量来定的。
三、其他方式
3.1 自定义文件输出
@Slf4j
public class WriteLogsUtils {
public static void write(String logPath, String message) {
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(logPath);
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = simpleDateFormat.format(date);
String messageAll = now + " " + message + "\r\n";
fileWriter.write(messageAll);
fileWriter.flush();
} catch (IOException e) {
log.error("写入日志文件失败:{}", e.getMessage());
}finally {
if (fileWriter != null) {
try {
fileWriter.close();
} catch (IOException e) {
log.error("关闭日志文件失败:{}", e.getMessage());
}
}
}
}
}
参考文章:
https://www.cnblogs.com/darian/p/14111944.html
https://www.cnblogs.com/dw3306/p/12372871.html
https://www.jianshu.com/p/dd72fa0c7a07
https://my.oschina.net/xiaominmin/blog/3022020
https://blog.youkuaiyun.com/qq853632587/article/details/78222780
https://juejin.cn/post/6844903641535479821