Tomcat日志组件

AccessLog接口

public interface AccessLog {
public void log(Request request, Response response, long time);
}

AccessLogAdapter

public class AccessLogAdapter implements AccessLog {
private AccessLog[] logs;
// 构造函数
public AccessLogAdapter(AccessLog log) {
Objects.requireNonNull(log);
logs = new AccessLog[] { log };
}
// 添加新的 访问日志 AccessLog
public void add(AccessLog log) {
Objects.requireNonNull(log);
AccessLog newArray[] = Arrays.copyOf(logs, logs.length + 1);
newArray[newArray.length - 1] = log;
logs = newArray;
}
// AccessLog 接口中的 log 方法,循环操作
@Override
public void log(Request request, Response response, long time) {
for (AccessLog log: logs) {
log.log(request, response, time);
}
}
}

Tomcat中日志

​ 默认在 server.xml 中配置了 AccessLogValve 。

<!-- server.xml Host 节点 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
suffix=".txt"
prefix="localhost_access_log"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
<!--
className=org.apache.catalina.valves.AccessLogValve
directory=logs 存储位置
prefix 文件前缀
suffix 文件后缀
pattern 输出格式
-->
@Override
public void log(CharArrayWriter message) {
System.out.println("log");
rotate(); /* In case something external rotated the file instead */
if (checkExists) {
synchronized (this) {
if (currentLogFile != null && !currentLogFile.exists()) {
try {
close(false);
} catch (Throwable e) {
ExceptionUtils.handleThrowable(e);
log.info(sm.getString("accessLogValve.closeFail"), e);
} /* Make sure date is correct */
dateStamp = fileDateFormatter.format(
new Date(System.currentTimeMillis())); open();
}
}
} // Log this message
try {
synchronized(this) {
if (writer != null) {
message.writeTo(writer);
writer.println("");
if (!buffered) {
writer.flush();
}
}
}
} catch (IOException ioe) {
log.warn(sm.getString(
"accessLogValve.writeFail", message.toString()), ioe);
}
}

调用过程

// ContainerBase
@Override
public void logAccess(Request request, Response response, long time,
boolean useDefault) {
boolean logged = false;
// 获取 注册的 日志组件
AccessLog accessLog = getAccessLog();
if (accessLog != null) {
// 调用 适配器 log 方法
accessLog.log(request, response, time);
logged = true;
}
if (getParent() != null) {
getParent().logAccess(request, response, time,
(useDefault && !logged));
}
} @Override
public AccessLog getAccessLog() {
// 默认 false
if (accessLogScanComplete) {
return accessLog;
}
// AccessLog 适配器
AccessLogAdapter adapter = null;
// 获取所有注册的 阀门 Valve
Valve valves[] = getPipeline().getValves();
for (Valve valve : valves) {
// 判断 Valve 的类型
if (valve instanceof AccessLog) {
if (adapter == null) {
adapter = new AccessLogAdapter((AccessLog) valve);
} else {
adapter.add((AccessLog) valve);
}
}
}
if (adapter != null) {
accessLog = adapter;
}
accessLogScanComplete = true;
return accessLog;
}

自定义 AccessLog

在 server.xml 中 ,配置 Valve ,在解析 server.xml 会自动注册。

public class WswAccessLogValve extends AbstractAccessLogValve {

    @Override
protected void log(CharArrayWriter message) {
System.out.println("access log");
}
}
// message
// ||
// VV
// 0:0:0:0:0:0:0:1 - - [08/Dec/2018:23:47:07 +0800] "GET /tomcat/ HTTP/1.1" 200 139
<!-- server.xml Host 节点 -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" suffix=".txt"
prefix="localhost_access_log"
pattern="%h %l %u %t &quot;%r&quot; %s %b" /> <Valve className="org.apache.catalina.valves.WswAccessLogValve"/>
log			 			// AccessLogValve 中输出
access log // WswAccessLogValve 中输出

Tomcat中日志组件的更多相关文章

  1. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  2. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  3. java中的日志组件-log4j

    1.为什么使用日志组件 Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT的事件记录器:还可以控制每一 ...

  4. [.Net Core] 在 Mvc 中简单使用日志组件

    在 Mvc 中简单使用日志组件 基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出. 目录 使用内置的日志组件 简单过渡到第三方组件 - NLog 使用内置的日志 下面使用控制器 Hom ...

  5. 玩转ASP.NET Core中的日志组件

    简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...

  6. .Net Core中的日志组件(Logging)

    1.介绍 Logging组件是微软实现的日志记录组件包括控制台(Console).调试(Debug).事件日志(EventLog)和TraceSource,但是没有实现最常用用的文件记录日志功能(可以 ...

  7. tomcat中的日志开关文件(logging.properties)介绍

    以tomcat-6.0.29为例: http://www.ossez.com/thread-18138-1-1.html #配置tomcat的日志输出方式,这里表示文件输出和控制台输出.handler ...

  8. Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中

    Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中 在Linux系统中,Tomcat 启动后默认将很多信息都写入到 catalina.out 文件中,我们可以通过tail  ...

  9. Tomcat中的服务器组件和 服务组件

    开始学习Tocmat时,都是学习如何通过实例化一个连接器 和 容器 来获得一个Servlet容器,并将连接器  和 servlet容器相互关联,但是之前学习的都只有一个连接器可以使用,该连接器服务80 ...

随机推荐

  1. fzou 1759 Super A^B mod C

    Problem 1759 Super A^B mod CAccept: 456    Submit: 1488Time Limit: 1000 mSec    Memory Limit : 32768 ...

  2. 第N次学习javaIO之后

    io按流分 输入流.输出流 io按类型分(是类型吧) 字节流.字符流 ------------------------------------- 先说说一直以来混淆什么时候用输入流,什么时候用输出流. ...

  3. lincode 题目记录6

    the Duplicate Number  132 PatternFind 找重复的数字··直接暴力枚举是不行的···又超时提示·· 暴力枚举的写法· res=0 def findDuplicate( ...

  4. VC+++ 操作word

    最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...

  5. Java设计模式—命令模式

    命令模式是一个高内聚的模式. 定义如下:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 通用类图如下: 角色说明: ● Re ...

  6. Avalon探索之旅

    avalon2是一款基于虚拟DOM与属性劫持的 迷你. 易用. 高性能 的 前端MVVM框架, 拥有超优秀的兼容性, 支持移动开发, 后端渲染, WEB Component式组件开发, 无需编译, 开 ...

  7. sql join实例图解

    https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ 1. inner join: 所有满足join条件的两个table对应 ...

  8. 微软在WPC 2015中为“伙伴们”带来了什么?

    在微软 WPC 2015(微软全球合作伙伴大会)上,微软全球渠道总监 Phil Sorgen 指出,微软总营收的 92% 来自合作伙伴.这句话验证了微软与合作伙伴间日益紧密的合作关系,也点出了本次大会 ...

  9. fiddler抓包出现Tunnel to

    在抓包的时候,有时候会遇到很多的tunnel to,图标是一把锁的形状,如下图: connect是为了建立http tunnel,connect是http众多方法中的其中一种,它跟post.get.p ...

  10. 中文乱码(Python、WEB、ajax)

    http://my.oschina.net/leejun2005/blog/74430 #查看errorb是unicode,还是stringprint isinstance(errorb,unicod ...