背景:docker + k8s 集群部署java应用时,节点不确定,会根据实际情况动态部署,那么日志文件的数据量就动态变化,日志文件又需要统一放到日志管理平台下。所以有必要根据ip生成日志文件名称。
1、在自己的项目里新建一个类 HostnameConfig 继承 PropertyDefinerBase 类,重写该方法,代码如下
import ch.qos.logback.core.PropertyDefinerBase; import java.net.InetAddress; import java.net.UnknownHostException; public class HostnameConfig extends PropertyDefinerBase { @Override public String getPropertyValue() { try { return InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { e.printStackTrace(); } return null; } }
2、 在logback-spring.xml 配置文件中引用 HostnameConfig
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--定义日志文件的存储地址 --> <define name="hostname" class="com.jimmy.lai.route.gateway.config.HostnameConfig"/> <property name="LOG_HOME" value="../logs"/> <!-- 控制台输出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: - %msg%n</pattern> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/gateway.%d{yyyy-MM-dd}.${hostname}.log </FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>1</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: - %msg%n</pattern> </encoder> </appender> <appender name="ACCESSFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名 --> <FileNamePattern>${LOG_HOME}/gateway_access.%d{yyyy-MM-dd}.${hostname}.log </FileNamePattern> <!--日志文件保留天数 --> <MaxHistory>1</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: - %msg%n</pattern> </encoder> </appender> <!--此日志文件只包含错误日志--> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/gateway-error.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}: - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录error级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="ACCESSFILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="ACCESSFILE"/> </appender> <appender name="LOGFILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="LOGFILE"/> </appender> <appender name="LOG_ERROR_FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="ERROR"/> </appender> <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false"> <appender-ref ref="ACCESSFILE_ASYNC"/> </logger> <!--上报skywalking日志--> <appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level logger_name:%logger{36} - [%tid] - message:%msg%n</pattern> </layout> </encoder> </appender> <!-- 日志输出级别 --> <root level="INFO"> <!-- <appender-ref ref="STDOUT"/>--> <appender-ref ref="LOGFILE_ASYNC"/> <appender-ref ref="LOG_ERROR_FILE_ASYNC"/> <appender-ref ref="GRPC_LOG" /> </root> </configuration>