中间件access.log配置日志扩展

在weblogic中,access.log能通过记录请求参数帮助定位问题。通常默认的格式配置是date time cs-method cs-uri,通过组合不同的格式参数能展示许多请求信息。

具体格式配置如下:

date  完成事务的日期,字段类型为 <date>(在W3C规范中定义);
time  完成事务的时间,字段类型为 <time>(在W3C规范中定义);
time-taken  完成事务所需的时间,以秒为单位,字段类型为 <fixed>(在W3C规范中定义);
bytes  已传输的字节数,字段类型为 <integer>;请注意,WebLogic Server 不支持 W3C 规范中定义的 cached 字段。
复制代码

IP 地址相关字段:  

这些字段将提供正在进行请求的客户端或正在进行响应的服务器的 IP 地址或端口。

这些字段的类型为 <address>(在W3C规范中定义)。受支持的前缀如下:  
c-ip  客户端的 IP 地址。
s-ip  服务器的 IP 地址。
DNS 相关字段,这些字段提供客户端或服务器的域名,字段类型为 <name>(在W3C规范中定义)。
受支持的前缀如下:  
c-dns  正在进行请求的客户端的域名;
s-dns  被请求的服务器的域名;
sc-status  响应的状态代码,如表示“找不到文件”状态的 (404)。此字段的类型为 <integer>(在W3C规范中定义);
sc-comment  随状态代码返回的注释,如“找不到文件”。此字段的类型为 <text>;
cs-method  请求方法,例如GET或POST。此字段的类型为 <name>(在W3C规范中定义);
cs-uri  完整的被请求 URI。此字段的类型为 <uri>(在W3C规范中定义);
cs-uri-stem  仅为 URI 的资源部分(忽略查询)。此字段的类型为 <uri>(在W3C规范中定义);
cs-uri-query  仅为 URI 的查询部分。此字段的类型为 <uri>(在W3C规范中定义);
复制代码

为了使得展示更多细节,很多项目会采用配置额外的扩展格式来定义日志显示内容,即通过自定义来实现更多的展示需求,例如:

x-GWXFF c-ip date time cs-method cs-uri sc-status

这个参数是特别适用于客户端通过F5代理来发送请求的,x-GWXFF参数能获取上层代理的X-Forwarded-For 协议头并展示客户端的真实IP,c-ip则展示的是F5负载均衡的地址。这里需要说明一下如果要使用这个参数,需要创建一个GWXFF.java文件,详情可以官方参考文档:How to Configure WebLogic Server to Capture Client IP Addresses Behind a Load Balancer Using Extended Log Format (文档 ID 1602379.1)。该java文件编译成jar包后放置在domain目录下的lib目录中,重启weblogic进程后即可生效。

这里简单介绍下代理配置的X-Forwarded-For。该协议头是由 Squid 起草的(Squid 应该是最早的代理软件之一)格式是:

X-Forwarded-For: client, proxy1, proxy2

client 表示用户的真实 IP,每经过一次代理服务器,代理服务器会在这个头增加用户的 IP(有点拗口)。注意最后一个代理服务器请求 Web 服务器的时候是不会将自己的 IP 附加到 X-Forwarded-For 头上的,最后一个代理服务器的 IP 地址应该通过$_SERVER['REMOTE_ADDR']获取。

举个例子: 用户的 IP 为(A),分别经过两个代理服务器(B,C),最后到达 Web 服务器,那么Web 服务器接收到的 X-Forwarded-For 就是 A,B。

除了weblogic,其他代理中间件,诸如Nginx,Apache等,也有相应的获取X-Forwarded-For的配置,这里举例:

Apache:

LogFormat "%{X-Forwarded-For}i %a %h %A %l %u %t "%r" %>s %b "%{Referer}i"
 "%{User-Agent}i"" combined
复制代码

Nginx:

log_format  main  '$remote_addr - $remote_user [$time_local]    "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent""$http_x_forwarded_for"';
复制代码

猜你喜欢

转载自juejin.im/post/7016977014762504223