访问日志格式的自定义

在第一小节中经过几步一个访问日志组件已成型,但为了增加用户自定义能力我们还是要继续做点事,对于用户自定义的实现最经典的做法就是引入变量表示,例如定义%a表示远程主机IP、%A表示本机IP等等,然后在写入之前用相应逻辑把变量替换成相应的值写入日志。这节我们来实现日志格式的自定义支持。

整个过程其实是先自定义变量组,再逐个把变量替换成相应值,最后把替换后的值写入文件。由于需要实现很多不同的变量,所以定义一个接口用于约束所有变量添加操作的定义,定义一个addElement方法,通过从request和response获取相应的变量值后添加到字符串buf中。

public interface AccessLogElement {

public void addElement(StringBuilder buf, Request request, Response response);

}

接着定义两个元素分别用于添加响应状态码和远程地址,使用时直接调用他们的addElement即可把状态码和远程地址添加到字符串中,

public class StatusCodelElement implements AccessLogElement {

public void addElement(StringBuilder buf, Request request, Response response) {

buf.append(response.getStatus());

}

}

public class RemoteAddrElement implements AccessLogElement {

public void addElement(StringBuilder buf, Request request, Response response) {

buf.append(request.getRemoteAddr());

}

}

现在还差一个映射器用于解析变量到各自AccessLogElement的映射,如下ElementMapping提供一个map方法把自定义的pattern解析成对应的访问日志元素并发对应的值替换原来的变量。

public class ElementMapping {

Response response;

Request reqeust;

public ElementMapping(Request request, Response response){

this.reqeust=request;

this.response=response;

}

public StringBuilder map(String pattern) {

StringBuilder buf = new StringBuilder();

for (int i = 0; i < pattern.length(); i++) {

char ch = pattern.charAt(i);

if (ch == ‘%‘) {

ch = pattern.charAt(++i);

addElement(ch, buf);

} else {

buf.append(ch);

}

}

return buf;

}

private void addElement(char ch, StringBuilder buf) {

switch (ch) {

case ‘a‘:

new RemoteAddrElement().addElement(buf, request, response);

break;

case ‘s‘:

new StatusCodeElement().addElement(buf, request, response);

break;

}

}

}

这节介绍的是如何引入变量使你的访问日志组件拥有自定义格式功能,并且使用了一个简单的案例说明,如果你想拥有更强大的自定义能力可以在本文基础上实现,例如可以把常用的变量组合简化为一个字符串表示,common字符串用于表示%h %l %u %t "%r" %s %b常用的变量组合,当然要实现这样的支持你必须在映射器中做对应的处理。

时间: 2024-08-26 17:50:54

访问日志格式的自定义的相关文章

nginx日志格式及自定义日志配置

nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器.ip和其他的访问信息 error log 则是记录服务器错误日志 错误日志的形式如下: 10.1.1.1 - - [22/Aug/2014:16:48:14 +0800] "POST /ajax/MbpRequest.do HTTP/1.1" 200 367 "-" "Dalvik/1.6.0 (Linux; U; An

Apache用户认证、域名跳转、访问日志格式

11.18 Apache用户认证 注意: 本章使用浏览器进行检测的前提是在物理机hosts文件添加虚拟机IP和虚拟主机域名. 配置用户认证 编辑虚拟主机配置文件"httpd-vhosts.conf".[[email protected] ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf--<VirtualHost *:80>DocumentRoot "/data/wwwroot/111.com&qu

nginx访问日志格式

$time_iso8601 ISO8601标准格式下的本地时间.$time_local 通用日志格式下的本地时间. 我们在配置访问日志的时候,一般都是按照默认格式,但是我觉得$time_local换成$time_iso8601更直观一些. log_format  main  '$remote_addr - $remote_user $time_iso8601  "$request" '                     '$status $body_bytes_sent &quo

APACHE访问日志格式 和 LogFormat语法

访问日志记录用户的每一个请求 打开apache主配置文件 vim /usr/local/apache2.4/conf/httpd.conf 主配置文件里提供了两种日志的模板:common和combined <IfModule log_config_module> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" c

Tomcat访问日志浅析 (转)

来自:http://blog.chinaunix.net/uid-20691565-id-3938220.html Tomcat的访问日志是靠org.apache.catalina.valves.AccessLogValve来控制的,你可以修改$tomcat/conf/server.xml来启用它 ($tomcat是Tomcat安装的目录).AccessLogValve默认应该是注释掉的,简单的将其注释去掉,然后重启Tomcat就可以了. 以下是Tomcat默认的配置: <Valve class

Tomcat访问日志浅析

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%s %D %t %a %U" fileDateFormat="yyyy-MM-dd.HH" resolveHosts=

自定义tornado日志格式

本文和大家分享的主要是tornado日志格式自定义相关内容,一起来看看吧,希望对大家学习python有所帮助. 第一次玩tornado.版本4.x.为了解决日志格式的问题,google了很多,没一个有效的. tornado日志格式分两块,一块是logging的格式,一块是tornado请求消息格式. tornado默认的访问日志输出是这样的: WARNING:tornado.access:404 GET / (127.0.0.1) 167.93ms 其中, WARNING:tornado.acc

ELK收集Apache的json格式访问日志并按状态码绘制图表

前言 需求说明: 部署一个Apache,收集Apache的json格式访问日志,并且将访问日志的状态码在kibana上绘制饼状图,添加到kibana的dashboard. 环境说明: 10.0.0.101(test101)--部署apache.filebeat10.0.0.102(test102)--部署elasticsearch.kibana备注:本次实验的重点在于怎样收集Apache的json格式日志,因此没有装logstash.日志数据从filebeat--elasticsearch--k

自定义nginx访问日志和内置变量使用

自定义nginx访问日志和内置变量使用 安装第三方echo模块后查看内置变量 内置变量 1.$args 用户在浏览器中查找的相关参数(uri中?之后的字段)2.$document_root 站点根目录所在的位置3.$document_uri 去除url中域名部分后所剩下的目录4.$host 所访问的主机5.$http_user_agent 客户端所使用的浏览器6.$http_cookie 客户端的cookie信息7.$limit_rate 客户端的下载速率0表示不限制速度 server { se