背景: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>
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐