logback-spring.xml 完整生产模板
这是一个可直接用于生产环境的logback-spring.xml完整模板。它涵盖了日志滚动策略、多环境配置、JSON结构化输出ELK兼容、敏感信息脱敏、性能优化等核心要素。完整模板?xml version1.0 encodingUTF-8? configuration scantrue scanPeriod60 seconds debugfalse !-- 生产级 Logback 配置模板 特性 1. 多环境隔离dev/test/prod 2. 日志滚动策略按大小和时间 3. JSON 格式输出ELK 友好 4. 敏感信息脱敏手机号、身份证、密码等 5. 异步日志提升性能 6. 错误日志单独输出 -- !-- 1. 自定义属性 -- !-- 日志存放路径 -- property nameLOG_PATH value/var/log/your-app / !-- 应用名称用于区分不同服务 -- property nameAPP_NAME valueyour-service / !-- 日志保留天数 -- property nameMAX_HISTORY value30 / !-- 单文件最大大小 -- property nameMAX_FILE_SIZE value500MB / !-- 总磁盘空间限制 -- property nameTOTAL_SIZE_CAP value20GB / !-- 控制台日志格式开发环境友好带颜色 -- property nameCONSOLE_PATTERN value%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) [%thread] %cyan(%logger{36}) - %msg%n / !-- 文件日志格式普通文本 -- property nameFILE_PATTERN value%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n / !-- 2. 敏感信息脱敏转换器 -- !-- 定义脱敏规则替换日志中的敏感字段 -- conversionRule conversionWordmask converterClasscom.yourpackage.MaskConverter / !-- 如果没有自定义 Converter可以使用内置的 replace 函数 例如将手机号替换为 138****1234详见下面 appender 中的用法 -- !-- 3. 日志 Appender 定义 -- !-- 3.1 控制台输出仅开发环境启用生产环境建议关闭 -- appender nameCONSOLE classch.qos.logback.core.ConsoleAppender encoder pattern${CONSOLE_PATTERN}/pattern charsetUTF-8/charset /encoder /appender !-- 3.2 常规文件日志按天滚动带大小分割 -- appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/${APP_NAME}.log/file rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy !-- 滚动文件命名日期 序号 -- fileNamePattern${LOG_PATH}/${APP_NAME}.%d{yyyy-MM-dd}.%i.log/fileNamePattern !-- 单文件最大大小达到后触发滚动 -- maxFileSize${MAX_FILE_SIZE}/maxFileSize !-- 保留天数 -- maxHistory${MAX_HISTORY}/maxHistory !-- 磁盘总容量限制 -- totalSizeCap${TOTAL_SIZE_CAP}/totalSizeCap /rollingPolicy encoder pattern${FILE_PATTERN}/pattern charsetUTF-8/charset /encoder !-- 生产环境推荐立即刷新保证数据完整性性能要求极高时可改为 false -- immediateFlushtrue/immediateFlush /appender !-- 3.3 错误日志单独输出只记录 ERROR 级别 -- appender nameERROR_FILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/${APP_NAME}-error.log/file !-- 只记录 ERROR 级别 -- filter classch.qos.logback.classic.filter.LevelFilter levelERROR/level onMatchACCEPT/onMatch onMismatchDENY/onMismatch /filter rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy fileNamePattern${LOG_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd}.%i.log/fileNamePattern maxFileSize${MAX_FILE_SIZE}/maxFileSize maxHistory${MAX_HISTORY}/maxHistory totalSizeCap${TOTAL_SIZE_CAP}/totalSizeCap /rollingPolicy encoder pattern${FILE_PATTERN}/pattern charsetUTF-8/charset /encoder immediateFlushtrue/immediateFlush /appender !-- 3.4 JSON 格式 Appender用于对接 ELK / 日志中心 -- appender nameJSON_FILE classch.qos.logback.core.rolling.RollingFileAppender file${LOG_PATH}/${APP_NAME}-json.log/file rollingPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy fileNamePattern${LOG_PATH}/${APP_NAME}-json.%d{yyyy-MM-dd}.%i.log/fileNamePattern maxFileSize${MAX_FILE_SIZE}/maxFileSize maxHistory${MAX_HISTORY}/maxHistory totalSizeCap${TOTAL_SIZE_CAP}/totalSizeCap /rollingPolicy !-- 使用 Logstash 编码器输出 JSON -- encoder classnet.logstash.logback.encoder.LogstashEncoder !-- 应用名称 -- customFields{app_name:${APP_NAME},env:${SPRING_PROFILES_ACTIVE:-unknown}}/customFields !-- 包含 MDC 上下文 -- includeMdctrue/includeMdc !-- 不包含调用者位置信息提升性能 -- includeCallerDatafalse/includeCallerData /encoder /appender !-- 3.5 异步 Appender包装同步 Appender提升性能 -- appender nameASYNC_FILE classch.qos.logback.classic.AsyncAppender !-- 丢失日志时丢弃 DEBUG/TRACE保留 INFO 及以上 -- discardingThreshold0/discardingThreshold !-- 队列大小默认 256生产环境建议 512~1024 -- queueSize512/queueSize !-- 如果队列满是否阻塞主线程false 丢弃日志避免影响业务 -- neverBlocktrue/neverBlock !-- 引用的同步 Appender -- appender-ref refFILE / !-- 如果需要 JSON 也异步再追加一行 -- !-- appender-ref refJSON_FILE / -- /appender appender nameASYNC_ERROR classch.qos.logback.classic.AsyncAppender discardingThreshold0/discardingThreshold queueSize256/queueSize neverBlocktrue/neverBlock appender-ref refERROR_FILE / /appender !-- 4. 第三方库日志级别控制 -- !-- 避免第三方框架输出过多无用日志 -- logger nameorg.springframework levelINFO / logger nameorg.springframework.web levelINFO / logger nameorg.springframework.boot levelINFO / logger nameorg.apache levelWARN / logger nameorg.hibernate levelWARN / logger namecom.netflix levelWARN / logger nameorg.apache.kafka levelWARN / logger nameio.netty levelWARN / !-- 业务包路径可调整到 DEBUG需配合环境 -- logger namecom.yourpackage levelINFO / !-- 5. Spring Profile 多环境配置 -- !-- 开发环境输出控制台 文件级别 DEBUG -- springProfile namedev root levelDEBUG appender-ref refCONSOLE / appender-ref refASYNC_FILE / appender-ref refASYNC_ERROR / /root /springProfile !-- 测试环境输出文件 JSON级别 INFO -- springProfile nametest root levelINFO appender-ref refASYNC_FILE / appender-ref refASYNC_ERROR / appender-ref refJSON_FILE / /root /springProfile !-- 生产环境只输出文件 JSON关闭控制台级别 INFO -- springProfile nameprod root levelINFO appender-ref refASYNC_FILE / appender-ref refASYNC_ERROR / appender-ref refJSON_FILE / /root /springProfile !-- 默认配置无 profile 时生效 -- springProfile namedefault root levelINFO appender-ref refCONSOLE / appender-ref refASYNC_FILE / appender-ref refASYNC_ERROR / /root /springProfile /configuration依赖引入Maven确保pom.xml中包含以下依赖!-- Spring Boot 默认已包含 Logback SLF4J只需添加以下增强包 -- !-- JSON 格式编码器用于 ELK -- dependency groupIdnet.logstash.logback/groupId artifactIdlogstash-logback-encoder/artifactId version7.4/version !-- 使用最新稳定版 -- /dependency !-- 如果需要自定义脱敏 Converter需引入工具类 -- dependency groupIdorg.apache.commons/groupId artifactIdcommons-lang3/artifactId /dependency关键配置说明配置项作用生产建议scantrue scanPeriod60 seconds动态检测配置文件变更无需重启建议开启但debugfalse避免日志泛滥SizeAndTimeBasedRollingPolicy同时按时间和大小滚动防止单文件过大导致磁盘爆满AsyncAppender异步写日志不阻塞主线程强烈推荐neverBlocktrue防止业务夯住LogstashEncoder输出 JSON 格式对接 ELK 时必须支持customFields注入元数据springProfile多环境隔离开发环境输出控制台生产环境关闭immediateFlushtrue每次写入立即刷新生产环境建议true可靠性优先压测可调false自定义脱敏 Converter可选如果你需要精确脱敏如手机号、身份证创建以下类import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.spi.ILoggingEvent; public class MaskConverter extends ClassicConverter { Override public String convert(ILoggingEvent event) { String msg event.getFormattedMessage(); // 手机号脱敏13812345678 → 138****5678 msg msg.replaceAll((1\\d{2})\\d{4}(\\d{4}), $1****$2); // 身份证脱敏 msg msg.replaceAll((\\d{6})\\d{8}(\\d{4}), $1********$2); // 密码脱敏 msg msg.replaceAll((?i)(password|pwd|passwd)[\\s]*[:][\\s]*\\S, $1******); return msg; } }然后在模板顶部使用conversionRule注册并在pattern中通过%mask引用。避坑提醒日志路径权限确保${LOG_PATH}目录存在且应用有读写权限否则启动失败。磁盘监控务必对日志目录配置磁盘告警如 80% 触发预警防止日志打满磁盘。异步队列监控AsyncAppender队列满时若neverBlocktrue会丢弃日志需配合监控发现。不要同时使用CONSOLEFILE同步模式生产环境关闭 CONSOLE否则磁盘 IO 翻倍。