【从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
相关推荐
用户6757049885029 小时前
Celery 太重了?这可能是你一直在找的 asyncio 任务队列
后端·python·消息队列
Cloud_Shy6189 小时前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十一章 Python 包跟踪器 下篇)
前端·后端·python·数据分析·excel
神奇小汤圆9 小时前
为什么Redis能称霸缓存界?揭秘其每秒10万+读写的核心技术
后端
楼田莉子10 小时前
C++17新特性:结构化绑定/inline变量/if相关的变化
c++·后端·学习
无限进步_10 小时前
【C++】C++11的类功能增强与STL变化
java·前端·数据结构·c++·后端·算法
字节跳动数据库10 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能·后端
用户67570498850210 小时前
Python 统一大业:uv 如何整合 Pip、Pyenv 和 Venv?
后端·python
倚栏听风雨10 小时前
Spring AI 流式工具调用:你的 TOOL_CALLS Chunk 去哪了?
后端
归故里10 小时前
harmony-next.skills 为 AI 而生!
前端·后端·github
木雷坞10 小时前
NAS 放模型,GPU 跑 vLLM:一次启动卡住的排查记录
后端