【从0到1开发一个网关】网关日志的开发

@[toc]

网关需要那些日志?

网关需要日志记录是为了监控、维护和提高系统的性能、安全性以及可用性。日志的作用包括但不限于以下几点:

  • 故障排查:当系统出现问题或故障时,日志记录可以帮助管理员或开发人员快速定位和解决问题。通过查看日志,可以了解系统在发生问题之前和之后的状态,以确定导致问题的原因。

  • 安全监控:网关通常是系统的入口点,负责安全性和访问控制。日志记录可以用于检测潜在的安全威胁,如恶意攻击、入侵尝试或异常行为。通过分析日志,可以及时采取安全措施来应对这些威胁。

  • 性能分析:网关的性能对系统的整体性能至关重要。通过记录网关的性能数据,可以监视请求的响应时间、吞吐量和资源利用情况。这些数据可以帮助管理员优化系统的性能,确保它能够满足用户的需求。

  • 访问控制和审计:网关通常用于控制不同用户或应用程序的访问权限。日志可以用于记录用户或应用程序的访问活动,以便进行审计和合规性检查。这对于确保系统的安全性和合规性非常重要。

所以,对于一个网关,日志是其必须的一个组成部分,所以接下来我就将在我的网关中实现日志功能。 常见的,我目前了解到的,网关中至少需要整合如下日志功能:

  • 应用日志 时间、日志级别 线程名称、类名 日志内容、换行符
  • 访问日志 时间、执行耗时、客户端ip、请求服务 http method、http path http返回状态码和http返回报文大小
  • gc日志 时间 gc周期、gc阶段 停顿时间等详细信息

日志配置

这里我的项目用的是log4j日志框架。 我们需要在配置文件中编写如下内容:

javascript 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="INFO" schema="Log4J-V2.0.xsd" monitorInterval="600">

    <!--日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
    <Properties>
        <!-- 	配置日志文件输出目录,此处为项目根目录下的logs文件夹 -->
        <Property name="LOG_HOME">logs</Property>
        <!--https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout -->
        <property name="patternLayout">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%20.20t] %40.40c{1.} : %m%n</property>
        <property name="accessPatternLayout">%d{yyyy-MM-dd HH:mm:ss.SSS} %m %n</property>
    </Properties>

    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout pattern="${patternLayout}"/>
        </Console>

        <RollingRandomAccessFile name="RandomAccessFile" fileName="${LOG_HOME}/gateway-core.log" filePattern="${LOG_HOME}/gateway-core-%d{yyyy-MM-dd}-%i.log" >
            <PatternLayout pattern="${patternLayout}" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingRandomAccessFile>

        <RollingRandomAccessFile name="AccessLogFile" fileName="${LOG_HOME}/access.log" filePattern="${LOG_HOME}/access-%d{yyyy-MM-dd}-%i.log" >
            <PatternLayout pattern="${accessPatternLayout}" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="500MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingRandomAccessFile>

        <Async name="Async" shutdownTimeout="10000">
            <Appender-Ref ref="CONSOLE"/>
            <Appender-Ref ref="RandomAccessFile"/>
            <Appender-Ref ref="AccessLogFile"/>
        </Async>
    </Appenders>

    <Loggers>
        <Logger name="blossom.project.core.*" level="info" includeLocation="true">
            <AppenderRef ref="RandomAccessFile"/>
        </Logger>

        <Logger name="accessLog" level="info" includeLocation="false">
            <AppenderRef ref="AccessLogFile"/>
        </Logger>

        <Root level="info">
            <Appender-Ref ref="CONSOLE"/>
            <Appender-Ref ref="accessLog"/>
            <Appender-Ref ref="RandomAccessFile"/>
        </Root>
    </Loggers>
</Configuration>

之后,我们只需要在我们希望记录日志的地方,添加下如下代码

javascript 复制代码
private static Logger accessLog = LoggerFactory.getLogger("accessLog");

然后在你需要进行日志记录的时候,进行日志记录,代码如下

java 复制代码
    //增加日志记录
            accessLog.info("{} {} {} {} {} {} {}",
                    System.currentTimeMillis() - gatewayContext.getRequest().getBeginTime(),
                    gatewayContext.getRequest().getClientIp(),
                    gatewayContext.getRequest().getUniqueId(),
                    gatewayContext.getRequest().getMethod(),
                    gatewayContext.getRequest().getPath(),
                    gatewayContext.getResponse().getHttpResponseStatus().code(),
                    gatewayContext.getResponse().getFutureResponse().getResponseBodyAsBytes().length);

        

这里,我是将这个代码添加在了我的路由过滤器处,所以当我成功的进行路由转发后,就会记录日志,如下:

java 复制代码
2023-11-06 21:31:43.246 32917 0:0:0:0:0:0:0:1 backend-http-server:1.0.0 GET /http-server/ping 200 21 

整合GC日志

我的项目使用的是JDK19,所以这里我们可以很方便的基于JDK19的特性来实现日志的记录。 只需要在项目启动的时候加上如下的JVM参数即可:

java 复制代码
-Xlog:gc*=info:file=logs/gc.log:time,tags
相关推荐
Amagi.3 分钟前
Spring中Bean的作用域
java·后端·spring
2402_8575893626 分钟前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
J老熊34 分钟前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构
Benaso37 分钟前
Rust 快速入门(一)
开发语言·后端·rust
sco528238 分钟前
SpringBoot 集成 Ehcache 实现本地缓存
java·spring boot·后端
原机小子1 小时前
在线教育的未来:SpringBoot技术实现
java·spring boot·后端
吾日三省吾码1 小时前
详解JVM类加载机制
后端
努力的布布1 小时前
SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器
java·后端·spring
PacosonSWJTU2 小时前
spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)
java·后端·springmvc
记得开心一点嘛2 小时前
在Java项目中如何使用Scala实现尾递归优化来解决爆栈问题
开发语言·后端·scala