访问日志格式的自定义

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在第一小节中经过几步一个访问日志组件已成型,但为了增加用户自定义能力我们还是要继续做点事,对于用户自定义的实现最经典的做法就是引入变量表示,例如定义%a表示远程主机IP、%A表示本机IP等等,然后在写入之前用相应逻辑把变量替换成相应的值写入日志。

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

整个过程其实是先自定义变量组,再逐个把变量替换成相应值,最后把替换后的值写入文件。由于需要实现很多不同的变量,所以定义一个接口用于约束所有变量添加操作的定义,定义一个addElement方法,通过从requestresponse获取相应的变量值后添加到字符串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常用的变量组合,当然要实现这样的支持你必须在映射器中做对应的处理。


点击订购作者《Tomcat内核设计剖析》



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
61 13
|
3月前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
241 3
|
4月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
84 1
|
6月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
76 2
|
6月前
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子
|
7月前
|
Ubuntu Linux 测试技术
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
在Linux中,已知 apache 服务的访问日志按天记录在服务器本地目录/app/logs 下,由于磁盘空间紧张现在要求只能保留最近7天的访问日志,请问如何解决?
|
7月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
|
7月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
7月前
分享一种接口的日志格式
分享一种接口的日志格式
74 13
|
8月前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等