备案期间 需要关闭网站,黄页电话号码本,iis部署网站 win7,邯郸哪里做网站好Springboot中如何记录日志
日志体系整体介绍
日志一直在系统中占据这十分重要的地位#xff0c;他是我们在系统发生故障时用来排查问题的利器#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢#xff1f;选择什么框架来记录日志#xff0c;是不是日志打越…Springboot中如何记录日志
日志体系整体介绍
日志一直在系统中占据这十分重要的地位他是我们在系统发生故障时用来排查问题的利器也是我们做操作审计的重要依据。那么如何记录好日志呢选择什么框架来记录日志是不是日志打越多越好带着这些问题我们今天一起来讨论下springboot应用如何记录好日志。
在我们java工程中日志框架一般分为两层日志门面和日志实现。
日志门面
日志门面是一个抽象层它定义了一组统一的日志接口给用户使用。隐藏了底层日志实现的细节提供了一种与具体日志实现解耦的方式。常见的日志门面有SLF4JSimple Logging Facade for Java和Apache Commons Logging等。日志门面的作用包括
提供统一的日志接口方便在应用程序中记录日志。实现日志级别的控制可以在不同环境中灵活地调整日志输出级别。提供日志消息的格式化和输出控制。
日志实现
日志实现是一种具体的日志框架常见的包括Logback、Log4j、Java Util Logging等。不同的日志实现可能提供不同的功能和性能特性。最基础的都提供了以下共功能
实现日志门面定义的接口提供日志记录的功能可以将日志消息输出到指定的目标如控制台、文件、数据库等提供灵活的日志配置选项如输出格式、目标、日志级别等
总结一下日志门面提供了统一的接口让应用程序使用而日志实现则负责将日志消息输出到具体的目标。那么我们可以直接用日志实现来记录日志吗当然是可以的但是使用日志门面有他的优点
日志和代码解耦每个不同的日志实现记录日志的api是不一样的定义的日志级别可能也有差别那么如果我们直接使用日志实现比如log4j在代码里记录日志就需要用到log4j的api。这样将来有一天如果需要切换到logback则需要将所有log4j的代码替换成logback。但是使用日志门面我们只需要切换配置文件就可以了。兼容性使用日志门面可以兼容不同的日志实现因为大多数日志门面都支持多种日志实现。这样可以在项目中使用不同的日志库以满足不同的开发环境和需求。统一接口使用日志门面提供的统一接口有利于维护和各个类的日志处理方式统一提高代码的可读性和可维护性。
springboot如何配置Logback做日志框架
在\src\main\resources目录下添加logback.xml的配置文件配置日志的输出路径、输出格式等
?xml version1.0 encodingUTF-8?
configuration!--定义日志文件的存储地址--property nameLOG_PATH value/home/app/logs /!-- 输出到控制台 --appender nameCONSOLE classch.qos.logback.core.ConsoleAppenderencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n/pattern/encoder/appender!-- 配置info级别日志的输出路径滚动策略 --appender nameINFO_FILE classch.qos.logback.core.rolling.RollingFileAppenderfilter classch.qos.logback.classic.filter.ThresholdFilterlevelINFO/level/filterrollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern${LOG_PATH}/info/info-%d{yyyy-MM-dd}-%i.log/fileNamePatternmaxHistory30/maxHistorymaxFileSize50MB/maxFileSize/rollingPolicyencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n/pattern/encoder/appender!-- 配置error级别日志的输出路径滚动策略 --appender nameERROR_FILE classch.qos.logback.core.rolling.RollingFileAppenderfilter classch.qos.logback.classic.filter.ThresholdFilterlevelERROR/level/filterrollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicyfileNamePattern${LOG_PATH}/error/error-%d{yyyy-MM-dd}-%i.log/fileNamePatternmaxHistory30/maxHistorymaxFileSize50MB/maxFileSize/rollingPolicyencoderpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level [%logger{36}] - %msg%n/pattern/encoder/appender!-- 设置日志级别 --root levelINFOappender-ref refCONSOLE /appender-ref refINFO_FILE /appender-ref refERROR_FILE //root
/configuration滚动策略
rollingPolicy 用于配置日志文件的滚动策略决定何时创建新的日志文件或对现有日志文件进行归档。常见的日志滚动策略有以下几种 TimeBasedRollingPolicy按时间滚动日志文件。该策略会根据指定的时间模式如日期或时间间隔创建新的日志文件。可配置属性有 fileNamePattern指定日志文件的命名模式。可以使用日期格式和/或通配符来表示日志文件的命名规则。例如logs/app-%d{yyyy-MM-dd}.log 表示按日期切割日志文件并以app-2022-01-01.log的格式命名。maxHistory指定保留的历史日志文件的数量。当滚动发生时将保留最大数量的历史日志文件较旧的日志文件将被删除。例如7 表示最多保留 7 个历史日志文件。cleanHistoryOnStart指定在启动时是否清除历史日志文件。为 true即在启动时删除所有历史日志文件只保留当前日志文件。如果设置为 false则会保留历史日志文件但仍按照日期规则创建新的日志文件。totalSizeCap指定所有历史日志文件的总大小上限。当滚动发生时如果历史日志文件的总大小超过了这个上限较旧的日志文件将被删除以保持总大小在限制范围内。可以使用B、 KB、 MB、 GB作为单位。 SizeAndTimeBasedRollingPolicy继承自TimeBasedRollingPolicy支持按照文件大小滚动的特性可以通过maxFileSize来配置 maxFileSize指定单个日志文件的最大大小。当日志文件达到或超过这个大小时将触发滚动操作。可以使用可以使用B、 KB、 MB、 GB作为单位。 FixedWindowRollingPolicy按指定的固定窗口大小滚动日志文件。该策略会创建固定数量的日志文件并在写满一个日志文件后将日志写入下一个文件循环使用这些日志文件。可以通过 minIndex 和 maxIndex 属性指定日志文件的索引范围。 minIndex指定最小索引值。当滚动时索引将从这个值开始递增。默认值为1。maxIndex指定最大索引值。当索引达到这个值时最旧的日志文件将被删除。默认值为7。
过滤器
在Logback中可以使用Filter来对日志事件进行筛选和过滤。常用的过滤器有ThresholdFilter和LevelFilter ThresholdFilter基于日志级别进行过滤只有达到或超过指定级别的日志事件才会被接受。以下是一个示例配置 appender nameCONSOLE classch.qos.logback.core.ConsoleAppenderfilter classch.qos.logback.classic.filter.ThresholdFilterlevelWARN/level/filter
/appenderLevelFilterLevelFilter也是基于日志级别进行过滤可以根据指定的最低日志级别level来决定是否接受或拒绝日志事件允许更细粒度地控制不同appender或logger的过滤行为。以下是一个示例配置 appender nameCONSOLE classch.qos.logback.core.ConsoleAppenderfilter classch.qos.logback.classic.filter.LevelFilterlevelWARN/levelonMatchDENY/onMatchonMismatchACCEPT/onMismatch/filter
/appenderonMatch标签指定了满足过滤条件时的操作为DENY拒绝onMismatch标签指定了未满足过滤条件时的操作为ACCEPT接受。
springboot中如何通过日志切面将业务和日志进行解耦
在我们的应用中经常需要记录每一次请求的参数、请求的结果、耗时以及请求异常时需要记录异常堆栈用来在必要的时候排查问题。如果直接记录的话存在日志和代码耦合日志风格不统一日志排查困难等问题所以我们往往通过AOP的方式将日志和代码进行解耦让程序员可以专注在业务的开发上。
Aspect
Component
Slf4j
public class LogAspect {Around(value execution(* com.pinellia.framework.controller.*.*(..)))public Object logRequest(ProceedingJoinPoint joinPoint) throws Throwable {StopWatch stopWatch new StopWatch();stopWatch.start();HttpServletRequest request ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();String requestUrl request.getRequestURL().toString();Object result null;try {result joinPoint.proceed();} catch (Throwable e) {log.error(Request url: {} failed..., requestUrl, e);throw e;} finally {stopWatch.stop();log.info(Request url: {}, params: {}, response: {}, cost: {},requestUrl, joinPoint.getArgs(), GsonUtil.toJson(result), stopWatch.getTotalTimeMillis());}return result;}
}