【从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
相关推荐
Code哈哈笑21 分钟前
【SpringBoot】Spring中事务的实现:声明式事务@Transactional、编程式事务
java·spring boot·后端·spring·mybatis
恋喵大鲤鱼38 分钟前
Golang 身份证号码校验
开发语言·后端·golang
努力的搬砖人.2 小时前
Spring Boot 集成 Elasticsearch 的详细步骤
spring boot·后端·elasticsearch
liupenglove3 小时前
一个读写excel的简单程序(golang)
数据仓库·后端·golang·excel
hrrrrb6 小时前
【Rust】所有权
开发语言·后端·rust
geekmice12 小时前
SpringBoot+EasyExcel+Mybatis+H2实现导入
spring boot·后端·mybatis
2c237c613 小时前
使用Node编写轻量级后端快速入门
后端·arcgis·node.js·c5全栈
豌豆花下猫13 小时前
Python 类不要再写 __init__ 方法了
后端·python·ai
余衫马13 小时前
ASP.NET Core 8.0 JWT安全实践:从认证到授权的全链路实现
后端·安全·asp.net