在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"';
复制代码