Tomcat日志组件

AccessLog接口

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

AccessLogAdapter

  1. public class AccessLogAdapter implements AccessLog {
  2. private AccessLog[] logs;
  3. // 构造函数
  4. public AccessLogAdapter(AccessLog log) {
  5. Objects.requireNonNull(log);
  6. logs = new AccessLog[] { log };
  7. }
  8. // 添加新的 访问日志 AccessLog
  9. public void add(AccessLog log) {
  10. Objects.requireNonNull(log);
  11. AccessLog newArray[] = Arrays.copyOf(logs, logs.length + 1);
  12. newArray[newArray.length - 1] = log;
  13. logs = newArray;
  14. }
  15. // AccessLog 接口中的 log 方法,循环操作
  16. @Override
  17. public void log(Request request, Response response, long time) {
  18. for (AccessLog log: logs) {
  19. log.log(request, response, time);
  20. }
  21. }
  22. }

Tomcat中日志

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

  1. <!-- server.xml Host 节点 -->
  2. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  3. suffix=".txt"
  4. prefix="localhost_access_log"
  5. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  6. <!--
  7. className=org.apache.catalina.valves.AccessLogValve
  8. directory=logs 存储位置
  9. prefix 文件前缀
  10. suffix 文件后缀
  11. pattern 输出格式
  12. -->
  1. @Override
  2. public void log(CharArrayWriter message) {
  3. System.out.println("log");
  4. rotate();
  5. /* In case something external rotated the file instead */
  6. if (checkExists) {
  7. synchronized (this) {
  8. if (currentLogFile != null && !currentLogFile.exists()) {
  9. try {
  10. close(false);
  11. } catch (Throwable e) {
  12. ExceptionUtils.handleThrowable(e);
  13. log.info(sm.getString("accessLogValve.closeFail"), e);
  14. }
  15. /* Make sure date is correct */
  16. dateStamp = fileDateFormatter.format(
  17. new Date(System.currentTimeMillis()));
  18. open();
  19. }
  20. }
  21. }
  22. // Log this message
  23. try {
  24. synchronized(this) {
  25. if (writer != null) {
  26. message.writeTo(writer);
  27. writer.println("");
  28. if (!buffered) {
  29. writer.flush();
  30. }
  31. }
  32. }
  33. } catch (IOException ioe) {
  34. log.warn(sm.getString(
  35. "accessLogValve.writeFail", message.toString()), ioe);
  36. }
  37. }

调用过程

  1. // ContainerBase
  2. @Override
  3. public void logAccess(Request request, Response response, long time,
  4. boolean useDefault) {
  5. boolean logged = false;
  6. // 获取 注册的 日志组件
  7. AccessLog accessLog = getAccessLog();
  8. if (accessLog != null) {
  9. // 调用 适配器 log 方法
  10. accessLog.log(request, response, time);
  11. logged = true;
  12. }
  13. if (getParent() != null) {
  14. getParent().logAccess(request, response, time,
  15. (useDefault && !logged));
  16. }
  17. }
  18. @Override
  19. public AccessLog getAccessLog() {
  20. // 默认 false
  21. if (accessLogScanComplete) {
  22. return accessLog;
  23. }
  24. // AccessLog 适配器
  25. AccessLogAdapter adapter = null;
  26. // 获取所有注册的 阀门 Valve
  27. Valve valves[] = getPipeline().getValves();
  28. for (Valve valve : valves) {
  29. // 判断 Valve 的类型
  30. if (valve instanceof AccessLog) {
  31. if (adapter == null) {
  32. adapter = new AccessLogAdapter((AccessLog) valve);
  33. } else {
  34. adapter.add((AccessLog) valve);
  35. }
  36. }
  37. }
  38. if (adapter != null) {
  39. accessLog = adapter;
  40. }
  41. accessLogScanComplete = true;
  42. return accessLog;
  43. }

自定义 AccessLog

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

  1. public class WswAccessLogValve extends AbstractAccessLogValve {
  2. @Override
  3. protected void log(CharArrayWriter message) {
  4. System.out.println("access log");
  5. }
  6. }
  7. // message
  8. // ||
  9. // VV
  10. // 0:0:0:0:0:0:0:1 - - [08/Dec/2018:23:47:07 +0800] "GET /tomcat/ HTTP/1.1" 200 139
  1. <!-- server.xml Host 节点 -->
  2. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" suffix=".txt"
  3. prefix="localhost_access_log"
  4. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  5. <Valve className="org.apache.catalina.valves.WswAccessLogValve"/>
  1. log // AccessLogValve 中输出
  2. 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. hdu 4193 Non-negative Partial Sums 单调队列。

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. C++ STL:stack和queue

    http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/ ...

  3. CSS3字体火焰燃烧效果

    动画的CSS: // fire @keyframes fireDiv { 0% { text-shadow: 0 0 4px white, 0 -5px 4px #ff3, 2px -10px 6px ...

  4. php中怎么理解Closure的bind和bindTo

    bind是bindTo的静态版本,因此只说bind吧.(还不是太了解为什么要弄出两个版本) 官方文档: 复制一个闭包,绑定指定的$this对象和类作用域. 其实后半句表述很不清楚. 我的理解: 把一个 ...

  5. RHEL5.X 重启网卡出现./network-functions: line 78: .: ifcfg-eth0: file not found

    错误信息: 红帽RHEL5.5系统,重启网卡报错 [root@localhost network-scripts]# service network restart Shutting down int ...

  6. Linux-文件目录命令

    黑色 代表是普通的文件 蓝色 代表是目录(文件夹) 紫色 代表是图片文件 绿色 代表是可以执行的文件(脚本文件)-->存放linux命令的 红色 代表是压缩文件 clear:清屏pwd:显示当前 ...

  7. [翻译] PPDragDropBadgeView

    PPDragDropBadgeView https://github.com/smallmuou/PPDragDropBadgeView PPDragDropBadgeView is a badge ...

  8. [翻译] AsyncDisplayKit

    AsyncDisplayKit AsyncDisplayKit is an iOS framework that keeps even the most complex user interfaces ...

  9. ISA 连接非443端口的https站点提示错误

    ISA 连接非443端口的https站点提示错误:12204 The specified Secure Sockets Layer (SSL) port is not allowed. ISA Ser ...

  10. Discuz的一处越权操作,强制回复无权限帖子

    合购vip  等教程论坛  都用的是Discuz 看操作步骤: 随便找一处vip教程 接下来 我们审查元素 找到这段代码 然后修改 <a href="http://xxx.xxx.xx ...