Spring博文
我真的很小心了,但还是被 SpringEvent 坑了!
网上被吹爆的Spring Event事件订阅有缺陷,一个月内我被坑了两次!
@ConfigurationProperties VS @Value,你觉得哪个更好用 - 掘金
一个注解就搞定接口统一返回、统一异常处理、加签、验签、加密、解密
SpringBoot3 优雅集成 Knife4j - 掘金
Spring Boot 3.x 中的 RestClient 使用案例-Spring专区论坛-技术-SpringForAll社区
Maven项目Parent,可以试试用这个代替 Spring Boot Parent
SpringBoot集成Logback终极指南:从控制台到云端的多维日志输出
Knife4j:实时接口文档的利器
Spring Boot的Docker Layer优化:缩小镜像体积并提升启动速度-Spring专区论坛-技术-SpringForAll社区
使用Prometheus和Grafana监控Spring Boot应用
Spring Boot 4 新特性详解:5大核心更新助力企业级开发
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
SpringBoot + SpringCloud Gateway + Sentinel + Redis:API 网关层的接口限流、黑名单拦截与用户认证
SpringBoot + Seata + MySQL + RabbitMQ:金融系统分布式交易对账与资金清算实战
SpringBoot + MyBatis-Plus + Elasticsearch + MySQL:电商商品搜索关键词高亮与库存实时展示
SpringBoot + RabbitMQ + MySQL + XXL-Job:物流系统运单状态定时同步与异常订单重试
本文档使用 MrDoc 发布
-
+
SpringBoot集成Logback终极指南:从控制台到云端的多维日志输出
```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` ```xml <configuration scan="true" scanPeriod="30 seconds"> <property name="LOG_PATH" value="logs" /> <property name="APP_NAME" value="myapp" /> <property name="MAX_HISTORY" value="30" /> <springProfile name="dev"> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{36}) - %msg%n</pattern> </encoder> </appender> </springProfile> <springProfile name="prod"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APP_NAME}.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>${MAX_HISTORY}</maxHistory> </rollingPolicy> <encoder> <pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> </springProfile> <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> <smtpHost>smtp.example.com</smtpHost> <to>alerts@example.com</to> <from>noreply@example.com</from> <subject>【${APP_NAME}】系统异常:%logger{20} - %m</subject> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger - %msg%n%ex</pattern> </layout> <threshold>ERROR</threshold> </appender> <root level="INFO"> <springProfile name="dev"> <appender-ref ref="CONSOLE" /> </springProfile> <springProfile name="prod"> <appender-ref ref="FILE" /> <appender-ref ref="EMAIL" /> </springProfile> </root> </configuration> ``` ```xml <appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource"> <dataSource class="com.zaxxer.hikari.HikariDataSource"> <driverClassName>com.mysql.cj.jdbc.Driver</driverClassName> <jdbcUrl>jdbc:mysql://localhost:3306/logs</jdbcUrl> <username>root</username> <password>yourpassword</password> </dataSource> </connectionSource> </appender> ``` ```xml <appender name="KAFKA" class="com.github.danielwegener.logback.kafka.KafkaAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> <topic>app-logs</topic> <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.RoundRobinKeyingStrategy"/> <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/> <producerConfig>bootstrap.servers=kafka1:9092,kafka2:9092</producerConfig> </appender> ``` ```xml <appender name="S3" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/tmp/app.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>/tmp/app-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> ``` ```xml <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender"> <queueSize>1024</queueSize> <discardingThreshold>0</discardingThreshold> <appender-ref ref="FILE" /> </appender> ``` ```xml <encoder> <pattern>%msg</pattern> <replace> <regex>"password":".*?"</regex> <replacement>"password":"******"</replacement> </replace> </encoder> ``` ```properties # application.properties management.endpoints.web.exposure.include=loggers management.endpoint.loggers.enabled=true ``` ```bash curl -X POST http://localhost:8080/actuator/loggers/com.example \ -H "Content-Type: application/json" \ -d '{"configuredLevel":"DEBUG"}' ``` ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> ``` ```java public LogbackMetrics logbackMetrics() { return new LogbackMetrics(); } ``` ```java public class LogFileHealthIndicator implements HealthIndicator { private String logPath; public Health health() { File logFile = new File(logPath + "/app.log"); return logFile.exists() ? Health.up().build() : Health.down().withDetail("error", "日志文件丢失").build(); } } ``` | **问题现象** | **解决方案** | | --- | --- | | 日志文件不滚动 | 检查`<rollingPolicy>`配置,确认文件命名模式正确 | | 异步日志丢失 | 增加`<queueSize>`并添加关闭钩子 | | 邮件发送失败 | 检查SMTP配置和网络防火墙设置 | | 数据库连接泄漏 | 使用连接池并配置合理的空闲超时时间 | | 日志输出乱码 | 统一编码为UTF-8,检查数据库字符集设置 | **最佳实践总结**: 1. **环境隔离**:通过`<springProfile>`区分开发/生产配置 2. **分级存储**:DEBUG日志存本地,ERROR日志发报警 3. **定期归档**:结合云存储实现长期日志保留 4. **监控告警**:集成Prometheus+Alertmanager实时监控
admin
2025年9月24日 01:27
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码