【从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
相关推荐
寻月隐君2 分钟前
Rust 网络编程实战:用 Tokio 手写一个迷你 TCP 反向代理 (minginx)
后端·rust·github
汪子熙11 分钟前
理解 git checkout 与 git reset 的联系和区别
后端
程序员爱钓鱼17 分钟前
Go 语言泛型 — 泛型语法与示例
后端·面试·go
coding and coffee23 分钟前
狂神说 - Mybatis 学习笔记 --下
java·后端·mybatis
程序员张34 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
程序员岳焱10 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*11 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅11 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头11 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
IT_102412 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle