@[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
