永康信誉好关键词优化,石家庄网站建设优化,wordpress怎样去掉手机自适应效果,网站关键词优化的步骤和过程摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容#xff0c;文章主要参考官网文章的描述内容#xff0c;并在其基础上进行一定的总结和拓展#xff0c;以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。
日志实现方式 Sping Boot 的日志管…摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容文章主要参考官网文章的描述内容并在其基础上进行一定的总结和拓展以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。
日志实现方式 Sping Boot 的日志管理框架采用的是Apache Commons Logging,是Apache软件基金会下的一个开源的日志门面框架。日志门面框架并不直接实现日志的具体功能而是为不同的日志实现框架提供统一的接口。Spring Boot 为Java.Util.Logging、Log4j2和Logback提供了默认配置在每种配置情况下记录器都预先配置为使用控制台输出也可选择文件输出。 默认情况下如果你使用的是Spring Boot的 Starters启动则会使用 Logback 进行日志记录。Spring Boot 会配置适当的Logback 路由以确保其他日志框架如 Java Util Logging、Commons Logging、Log4J 的依赖库均能正常工作。
Spring Boot 默认日志格式 Spring Boot 的默认日志格式包含如下内容 日期和时间精确到毫秒便于排序。 日志级别包括 ERROR、WARN、INFO、DEBUG 或 TRACE。 进程 ID。 一个 --- 分隔符用于区分实际日志消息的开始。 应用程序名称用方括号括起来默认情况下仅当设置了 spring.application.name 时才记录 应用程序组用方括号括起来默认情况下仅当设置了 spring.application.group 时才记录 线程名称用方括号括起来在控制台输出中可能会被截断。 关联 ID如果启用了跟踪上述示例中未显示 记录器名称通常是源类名经常被缩写。 日志消息。
Spring Boot 日志配置
日志级别 Spring Boot 支持以下日志级别 ERROR错误该级别用于记录系统中发生的严重错误事件这些错误会导致系统无法正常运行或部分功能失效通常需要立即关注和处理。 WARN警告表示系统中出现了一些可能会导致问题的情况但当前系统仍能继续运行。这些情况虽然不会立即影响系统的正常功能但需要引起注意因为它们可能是潜在问题的征兆。 INFO信息用于记录系统运行过程中的一些重要信息这些信息可以帮助开发者和运维人员了解系统的基本运行状态和关键操作的执行情况。 DEBUG调试主要用于开发和调试阶段记录系统运行过程中的详细信息帮助开发者定位和解决问题。这些信息通常包含变量的值、方法的调用顺序、程序的执行路径等。 TRACE跟踪这是最详细的日志级别用于记录系统运行过程中的每一个细节包括方法的进入和退出、变量的微小变化等。它提供了比 DEBUG 级别更精细的信息。 FATAL 是所有日志级别中最为严重的一级。当系统记录 FATAL 级别的日志时意味着系统遭遇到了几乎无法恢复的灾难性错误整个系统或者关键业务功能已经完全崩溃无法继续提供正常服务。 Logback 没有 FATAL级别它会将FATAL 映射到ERROR。
日志级别默认的颜色配置 如果您的终端支持ANSI则使用彩色输出来提高可读性。以下是日志级别默认的颜色配置列表
等级颜色 FATAL 红色的 ERROR 红色的 WARN 黄色的 INFO 绿色的 DEBUG 绿色的 TRACE 绿色的
日志级别启动配置 Spring Boot 的日志默认会回显到控制台并会记录日志级别是 ERROR、WARN、INFO level的日志。 启动debug日志 $ java -jar myapp.jar --debug 在启动应用程序的时候使用 --debug 标志 在application.properties配置文件中配置 debugtrue 启动trace日志 $ java -jar myapp.jar --trace 在启动应用程序的时候使用 --trace 标志 在application.properties配置文件中配置 tracetrue
配置某个模块的日志级别 我们可以使用 logging.level.logger-namelevel 语法配置某个模块的日志级别。以下是一些配置示例
logging.level.rootwarn # 配置根日志记录器的日志级别
logging.level.org.springframework.webdebug
logging.level.org.hibernateerror 文件输出配置 logging.file.name 属性用于指定日志文件的完整名称和路径它会精确地定义日志文件在文件系统中的存储位置和文件名。当你设置了这个属性后Spring Boot 会将日志信息输出到该指定的文件中。 logging.file.name/var/log/myapp.log 这会让 Spring Boot 把日志信息输出到 /var/log 目录下名为 myapp.log 的文件中。如果指定的目录不存在Spring Boot 不会自动创建该目录而是会抛出异常。 logging.file.path 属性用于指定日志文件的存储目录Spring Boot 会在该目录下生成默认名为 spring.log 的日志文件。使用这个属性时你只需关注日志文件的存储位置而无需指定具体的文件名。 logging.file.path/var/log/myapp 这会让 Spring Boot 在 /var/log/myapp 目录下创建 spring.log 文件并将日志信息写入该文件。如果指定的目录不存在Spring Boot 会自动创建该目录。 配置优先级如果同时配置了 logging.file.name 和 logging.file.pathlogging.file.name 的优先级更高Spring Boot 会按照 logging.file.name 指定的路径和文件名生成日志文件而忽略 logging.file.path 的设置。
文件轮换规则配置仅限Logback
默认日志文件轮换Spring Boot的默认日志文件记录大小是10MB 对于Logback 日志框架Spring Boot 提供了一些可用于微调的文件日志轮换配置。而对于其他日志系统则需要在配置文件中自行配置日志轮换规则。以下是关于Spring Boot文件轮换规则的配置列表 属性 描述 logging.logback.rollingpolicy.file-name-pattern 用于创建日志档案的文件名模式。 logging.logback.rollingpolicy.clean-history-on-start 如果日志存档清理应该在应用程序启动时发生。 logging.logback.rollingpolicy.max-file-size 日志文件归档前的最大大小。 logging.logback.rollingpolicy.total-size-cap 日志存档在被删除前可容纳的最大大小。 logging.logback.rollingpolicy.max-history 要保留的存档日志文件的最大数量默认为 7。
日志分组 在 Spring Boot 中将相关的日志记录器分组以便同时对它们进行配置是很有用的。例如你可能经常需要更改所有与 Tomcat 相关的日志记录器的日志级别但又难以记住顶级包名。 为解决这个问题Spring Boot 允许在 Spring 环境中定义日志组。例如可在 application.properties 中添加如下内容来定义一个名为 “tomcat” 的日志组
logging.group.tomcatorg.apache.catalina,org.apache.coyote,org.apache.tomcat 定义好日志组后只需一行配置就能更改该组中所有日志记录器的日志级别示例如下
logging.level.tomcattrace 此外Spring Boot 还包含一些预定义的日志组可直接使用具体如下 名称 包含的日志记录器 web org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans sql org.springframework.jdbc.core, org.hibernate.SQL, LoggerListener
自定义日志配置 激活与自定义方式不同日志系统可通过在类路径包含相应库来激活还能在类路径根目录提供合适配置文件或通过 logging.config 属性指定配置文件位置来进一步自定义。 logging: config: classpath:custom-logback 然后在 src/main/resources 目录下创建 custom-logback.xml 文件 强制指定日志系统可使用 org.springframework.boot.logging.LoggingSystem 系统属性强制 Spring Boot 使用特定日志系统值为 LoggingSystem 实现类的全限定名设置为 none 可完全禁用 Spring Boot 的日志配置。 import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;SpringBootApplication
public class CustomLoggingSystemApplication {public static void main(String[] args) {// 强制指定使用 Log4j2 日志系统System.setProperty(org.springframework.boot.logging.LoggingSystem, org.springframework.boot.logging.log4j2.Log4j2LoggingSystem);// 禁用 Spring Boot 的日志配置// System.setProperty(org.springframework.boot.logging.LoggingSystem, none);new SpringApplicationBuilder(CustomLoggingSystemApplication.class).bannerMode(Banner.Mode.OFF).run(args);}
} 配置限制由于日志在 ApplicationContext 创建前初始化不能通过 Spring Configuration 文件里的 PropertySources 控制日志只能通过系统属性更改或禁用日志系统。
不同日志系统加载的文件
日志系统加载文件Logbacklogback-spring.xml、logback-spring.groovy、logback.xml、logback.groovyLog4j2log4j2-spring.xml、log4j2.xmlJDKJava Util Logginglogging.properties 建议优先使用 -spring 变体的配置文件(例如logback-spring.xml而不是logback.xml)使用标准配置位置时 Spring 无法完全控制日志初始化且运行 “可执行 jar” 时 Java Util Logging 存在类加载问题建议尽量避免。
环境属性与系统属性映射 Spring 环境中的一些属性会被转移到系统属性供日志系统配置使用。以下是环境属性映射到系统属性的列表 Spring 环境属性 系统属性 评论 logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 记录异常时使用的转换字。 logging.file.name LOG_FILE 如果定义了则在默认日志配置中使用它。 logging.file.path LOG_PATH 如果定义了则在默认日志配置中使用它。 logging.pattern.console CONSOLE_LOG_PATTERN 控制台 (stdout) 上使用的日志模式。 logging.pattern.dateformat LOG_DATEFORMAT_PATTERN 日志日期格式的附加器模式。 logging.charset.console CONSOLE_LOG_CHARSET 用于控制台日志记录的字符集。 logging.threshold.console CONSOLE_LOG_THRESHOLD 用于控制台日志记录的日志级别阈值。 logging.pattern.file FILE_LOG_PATTERN 文件中使用的日志模式如果LOG_FILE启用。 logging.charset.file FILE_LOG_CHARSET 用于文件记录的字符集如果LOG_FILE启用。 logging.threshold.file FILE_LOG_THRESHOLD 用于文件日志记录的日志级别阈值。 logging.pattern.level LOG_LEVEL_PATTERN 呈现日志级别时使用的格式默认%5p。 logging.structured.format.console CONSOLE_LOG_STRUCTURED_FORMAT 用于控制台日志记录的结构化日志记录格式。 logging.structured.format.file FILE_LOG_STRUCTURED_FORMAT 用于文件日志记录的结构化日志记录格式。 PID PID 当前进程 ID如果可能并且尚未定义为操作系统环境变量则发现。 如果您使用 Logback以下属性也会被转移 Spring 环境属性 系统属性 评论 logging.logback.rollingpolicy.file-name-pattern LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN 滚动日志文件名的模式默认${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz。 logging.logback.rollingpolicy.clean-history-on-start LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START 是否在启动时清理存档日志文件。 logging.logback.rollingpolicy.max-file-size LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE 最大日志文件大小。 logging.logback.rollingpolicy.total-size-cap LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP 要保留的日志备份的总大小。 logging.logback.rollingpolicy.max-history LOGBACK_ROLLINGPOLICY_MAX_HISTORY 要保留的最大存档日志文件数。
其它配置
不为日志配置spring.application.name logging.include-application-namefalse 不为日志配置spring.application.group logging.include-application-groupfalse 结构化日志 结构化日志是一种将日志输出以明确定义、通常为机器可读的格式进行记录的技术。 Spring Boot 原生支持以下几种 JSON 格式的结构化日志 Elastic Common Schema (ECS)一种通用的、标准化的日志数据结构便于在 Elastic Stack 中进行统一的日志分析和处理。 Graylog Extended Log Format (GELF)Graylog 日志管理系统所使用的扩展日志格式能高效地传输和存储日志数据。 Logstash一个开源的数据收集引擎可对日志进行收集、过滤和转换。
启用结构化日志的方法 可通过设置以下属性来启用结构化日志 logging.structured.format.console用于控制台输出将其设置为所需格式的标识符。 logging.structured.format.file用于文件输出同样设置为所需格式的标识符
自定义日志配置时的处理 如果使用自定义日志配置需要更新配置以遵循 CONSOLE_LOG_STRUCTURED_FORMAT 和 FILE_LOG_STRUCTURED_FORMAT 系统属性。以 CONSOLE_LOG_STRUCTURED_FORMAT 为例在 Logback 和 Log4j2 中需要将编码器替换为 StructuredLogEncoder示例配置如下
encoder classorg.springframework.boot.logging.logback.StructuredLogEncoderformat${CONSOLE_LOG_STRUCTURED_FORMAT}/formatcharset${CONSOLE_LOG_CHARSET}/charset
/encoder
参考默认配置
可以参考 Spring Boot 中包含的默认配置如
Logback Structured Console AppenderLogback 的结构化控制台输出附加器配置。 ?xml version1.0 encodingUTF-8? !-- Console appender with structured logging logback configuration provided for import, equivalent to the programmatic initialization performed by Boot -- included appender nameCONSOLE classch.qos.logback.core.ConsoleAppender filter classch.qos.logback.classic.filter.ThresholdFilter level${CONSOLE_LOG_THRESHOLD}/level /filter encoder classorg.springframework.boot.logging.logback.StructuredLogEncoder format${CONSOLE_LOG_STRUCTURED_FORMAT}/format charset${CONSOLE_LOG_CHARSET}/charset /encoder /appender /included Logback Structured File AppenderLogback 的结构化文件输出附加器配置。 ?xml version1.0 encodingUTF-8? !-- File appender with structured logging logback configuration provided for import, equivalent to the programmatic initialization performed by Boot -- included appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender filter classch.qos.logback.classic.filter.ThresholdFilter level${FILE_LOG_THRESHOLD}/level /filter encoder classorg.springframework.boot.logging.logback.StructuredLogEncoder format${FILE_LOG_STRUCTURED_FORMAT}/format charset${FILE_LOG_CHARSET}/charset /encoder file${LOG_FILE}/file rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy fileNamePattern${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}/fileNamePattern cleanHistoryOnStart${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}/cleanHistoryOnStart maxFileSize${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}/maxFileSize totalSizeCap${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}/totalSizeCap maxHistory${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}/maxHistory /rollingPolicy /appender /included 弹性通用模式ECS ECS 格式简介Elastic Common Schema 是一种基于 JSON 的日志记录格式。 启用 ECS 格式在配置文件如 application.properties 或 application.yml中将 logging.structured.format.console 和 logging.structured.format.file 属性设置为 ecs即可启用该日志格式。 logging.structured.format.consoleecs logging.structured.format.fileecs 日志示例启用 ECS 格式后日志行呈现为 JSON 对象包含时间戳、日志级别、进程 ID、线程名、服务名、日志记录器、消息内容和 ECS 版本等信息。 {timestamp:2024-01-01T10:15:00.067462556Z,log.level:INFO,process.pid:39599,process.thread.name:main,service.name:simple,log.logger:org.example.Application,message:No active profile set, falling back to 1 default profile: \default\,ecs.version:8.11} 数据添加方法这种格式会将 MDCMapped Diagnostic Context中的每个键值对添加到 JSON 对象中。此外还能使用 SLF4J 流式日志记录 API 的 addKeyValue 方法向记录的 JSON 对象添加键值对。 服务属性自定义可使用 logging.structured.ecs.service 相关属性对服务值进行自定义如服务名、版本、环境和节点名等。若未指定服务名和版本将分别默认使用 spring.application.name 和 spring.application.version。 logging.structured.ecs.service.nameMyService logging.structured.ecs.service.version1 logging.structured.ecs.service.environmentProduction logging.structured.ecs.service.node-namePrimary Graylog 拓展日志格式GELF GELF 格式定义Graylog 扩展日志格式GELF是一种基于 JSON 的日志记录格式专为 Graylog 日志分析平台设计。 启用 GELF 格式在配置文件如 application.properties 或 application.yml中将 logging.structured.format.console 和 logging.structured.format.file 属性设置为 gelf即可启用该日志格式。 logging.structured.format.consolegelf logging.structured.format.filegelf 日志示例启用 GELF 格式后日志行呈现为 JSON 对象包含版本、短消息、时间戳、日志级别、进程 ID、线程名和日志记录器等信息。 {version:1.1,short_message:No active profile set, falling back to 1 default profile: \default\,timestamp:1725958035.857,level:6,_level_name:INFO,_process_pid:47649,_process_thread_name:main,_log_logger:org.example.Application} 数据添加方法这种格式会将 MDCMapped Diagnostic Context中的每个键值对添加到 JSON 对象中。此外还能使用 SLF4J 流式日志记录 API 的 addKeyValue 方法向记录的 JSON 对象添加键值对。 字段自定义可使用 logging.structured.gelf 相关属性对部分字段进行自定义如主机名和服务版本。若未指定主机名和服务版本将分别默认使用 spring.application.name 和 spring.application.version。 logging.structured.gelf.hostMyService logging.structured.gelf.service.version1 Logstash JSON 格式 格式定义Logstash JSON 格式是一种基于 JSON 的日志记录格式。 启用方式在配置文件中可通过设置 logging.structured.format.consolelogstash 和 logging.structured.format.filelogstash 来分别启用控制台和文件输出的 Logstash JSON 日志格式。 logging.structured.format.consolelogstash logging.structured.format.filelogstash 日志示例 {timestamp:2024-01-01T10:15:00.11103768102:00,version:1,message:No active profile set, falling back to 1 default profile: \default\,logger_name:org.example.Application,thread_name:main,level:INFO,level_value:20000} 数据添加MDC 键值对该格式会将 MDCMapped Diagnostic Context中包含的每个键值对添加到 JSON 对象中。还能使用 SLF4J 流式日志记录 API 的 addKeyValue 方法向记录的 JSON 对象添加键值对。 标记处理若添加了标记markers这些标记会以字符串数组的形式出现在 JSON 的 tags 字段中。
自定义结构化日志 Spring Boot 会为结构化日志的 JSON 名称和值选择合理的默认设置但有时用户可能需要根据自身需求对 JSON 进行微调比如更改某些名称以匹配日志摄入系统的要求或者过滤掉一些无用的成员。 常用自定义属性及功能 属性 描述 logging.structured.json.include 和 logging.structured.json.exclude 用于过滤 JSON 中的特定路径排除或包含指定内容 logging.structured.json.rename 对 JSON 中的特定成员进行重命名 logging.structured.json.add 向 JSON 中添加额外的成员 配置示例可以通过如下配置排除 log.level将 process.id 重命名为 procid并添加一个固定的 corpname 字段 logging.structured.json.excludelog.level logging.structured.json.rename.process.idprocid logging.structured.json.add.corpnamemycorp 高级自定义方式对于更高级的自定义需求用户可以编写实现 StructuredLoggingJsonMembersCustomizer 接口的类并通过 logging.structured.json.customizer 属性声明该类。此外也可以在 META - INF/spring.factories 文件中列出这些实现类来完成声明。
其它结构化日志的支持 Spring Boot 的结构化日志支持具有扩展性允许用户定义自己的自定义格式。实现方式为实现 StructuredLogFormatter 接口不过要注意使用 Logback 时泛型类型参数需为 ILoggingEvent使用 Log4j2 时则为 LogEvent这意味着实现会与特定的日志系统绑定。 示例代码
class MyCustomFormat implements StructuredLogFormatterILoggingEvent {Overridepublic String format(ILoggingEvent event) {return time event.getInstant() level event.getLevel() message event.getMessage() \n;}} 启用自定义格式要启用自定义格式需将 logging.structured.format.console 或 logging.structured.format.file 属性设置为自定义实现类的全限定类名。 构造参数注入自定义实现类可以使用构造参数这些参数会被自动注入更多详细信息可查看 StructuredLogFormatter 的 JavaDoc。
Logback拓展 文件选择标准的 logback.xml 配置文件加载过早无法使用这些扩展需要使用 logback-spring.xml 或者通过定义 logging.config 属性来指定配置文件。 配置扫描限制这些扩展不能与 Logback 的配置扫描功能一起使用。
特定环境配置springProfile 标签 功能springProfile 标签允许根据激活的 Spring 配置文件有选择地包含或排除部分配置内容。配置文件相关部分可在 configuration 元素内的任何位置使用。 属性使用使用 name 属性指定接受该配置的配置文件。name 属性可以是单个配置文件名称如 staging也可以是配置文件表达式配置文件表达式能实现更复杂的配置文件逻辑例如 production (eu - central | eu - west)。更多详细信息可查看 Spring Framework 参考指南。 示例
springProfile namestaging!-- 当 staging 配置文件激活时启用的配置 --
/springProfilespringProfile namedev | staging!-- 当 dev 或 staging 配置文件激活时启用的配置 --
/springProfilespringProfile name!production!-- 当 production 配置文件未激活时启用的配置 --
/springProfile环境属性配置springProperty 标签 功能springProperty 标签可将 Spring 环境中的属性暴露出来以便在 Logback 中使用。若想在 Logback 配置中访问 application.properties 文件中的值该标签会很有用。 使用方式其工作方式与 Logback 的标准 property 标签类似但不是直接指定值而是指定属性的来源来自环境。 额外属性若需要将属性存储在本地作用域之外的地方可使用 scope 属性若需要一个备用值以防环境中未设置该属性可使用 defaultValue 属性。 示例
springProperty scopecontext namefluentHost sourcemyapp.fluentd.hostdefaultValuelocalhost/
appender nameFLUENT classch.qos.logback.more.appenders.DataFluentAppenderremoteHost${fluentHost}/remoteHost...
/appender属性格式source 必须使用短横线命名法如 my.property - name不过可以通过宽松规则将属性添加到环境中。
Log4j2拓展 Spring Boot 包含许多 Log4j2 扩展可帮助进行高级配置。您可以在任何log4j2-spring.xml配置文件中使用这些扩展。
特定环境配置springProfile 标签 同Logback特定环境配置介绍内容。
环境属性配置 如果您想在 Log4j2 配置中引用 Spring 的属性则可以使用spring:前缀查找方法 配置示例 Properties Property nameapplicationName${spring:spring.application.name}/Property Property nameapplicationGroup${spring:spring.application.group}/Property /Properties 系统属性配置 Log4j2 系统属性支持Log4j2 支持多个系统属性可用于配置不同的项目。例如log4j2.skipJansi 系统属性可用于配置 ConsoleAppender 在 Windows 系统上是否尝试使用 Jansi 输出流。
log4j2.skipJansifalse 从 Spring 环境获取系统属性在 Log4j2 初始化之后加载的所有系统属性都可以从 Spring 环境中获取。可以在 application.properties 文件中添加相应的系统属性配置这样就能借助 Spring 环境来影响 Log4j2 的行为。 属性加载优先级只有当系统属性和操作系统环境变量中不包含要加载的值时才会考虑 Spring 环境。 早期初始化的系统属性限制在 Log4j2 早期初始化期间加载的系统属性不能引用 Spring 环境因为这些属性在 Spring 环境可用之前就已被使用。
参考文献
Logging :: Spring Boot