vlambda博客
学习文章列表

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

第 6 章登录 Tomcat 7

日志服务在管理员和开发人员的生活中发挥着至关重要的作用,以管理从开发阶段到生产问题的应用程序。日志服务可以帮助您找到 Web 应用程序中的实际问题。此外,它在许多应用程序的性能调整中发挥着重要作用。

在本章中,我们将讨论:

  • Tomcat 7 中的日志记录服务

  • 巨力

  • 日志4j

  • 日志级别

  • 阀门组件

  • 日志分析

巨力

以前版本的 Tomcat(直到 5.x)使用​​ Apache 通用日志服务来生成日志。这种日志记录机制的一个主要缺点是它只能处理单个 JVM 配置,并且难以为独立应用程序的每个类加载器配置单独的日志记录。为了解决这个问题,Tomcat 开发人员为 Tomcat 6 版本引入了一个单独的 API,它具有在 Tomcat 日志中捕获每个类加载器活动的能力。它基于 java.util.logging 框架。

默认情况下,Tomcat 7 使用自己的 Java logging API 来实现日志服务。这也称为 JULI。此 API 可以在 Tomcat 7 目录结构 (tomcat-juli.jar) 的 TOMCAT_HOME/bin 中找到。以下截图显示了 bin目录的目录结构, tomcat-juli.jar所在的目录。 JULI 还为每个 Web 应用程序提供了自定义日志记录的功能,它还支持每个应用程序的私有日志记录配置。借助单独的类加载器日志记录的增强功能,它还有助于在运行时卸载类时检测内存问题。

笔记

有关 JULI 和类加载问题的更多信息,请参阅 http://tomcat.apache.org/tomcat-7.0-doc/logging.html http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 分别。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

巨力


以前版本的 Tomcat(直到 5.x)使用​​ Apache 通用日志服务来生成日志。这种日志记录机制的一个主要缺点是它只能处理单个 JVM 配置,并且难以为独立应用程序的每个类加载器配置单独的日志记录。为了解决这个问题,Tomcat 开发人员为 Tomcat 6 版本引入了一个单独的 API,它具有在 Tomcat 日志中捕获每个类加载器活动的能力。它基于 java.util.logging 框架。

默认情况下,Tomcat 7 使用自己的 Java logging API 来实现日志服务。这也称为 JULI。此 API 可以在 Tomcat 7 目录结构 (tomcat-juli.jar) 的 TOMCAT_HOME/bin 中找到。以下截图显示了 bin目录的目录结构, tomcat-juli.jar所在的目录。 JULI 还为每个 Web 应用程序提供了自定义日志记录的功能,它还支持每个应用程序的私有日志记录配置。借助单独的类加载器日志记录的增强功能,它还有助于在运行时卸载类时检测内存问题。

笔记

有关 JULI 和类加载问题的更多信息,请参阅 http://tomcat.apache.org/tomcat-7.0-doc/logging.html http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 分别。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

记录器、附加程序和布局


在为应用程序实现日志记录机制时,我们会使用一些重要的日志记录组件。每个术语在跟踪应用程序事件方面都有其各自的重要性。让我们分别讨论每个术语以了解它们的用法:

  • Loggers: 可以定义为日志文件的逻辑名。此逻辑名称写在应用程序代码中。我们可以为每个应用程序配置一个独立的记录器。

  • Appenders:生成日志的过程由appenders处理。 appender的种类很多,例如 FileAppender、ConsoleAppender、SocketAppender等,log4j中都有。以下是 log4j 的 appender 的一些示例:

    log4j.appender.CATALINA=org.apache.log4j.DailyRollingFileAppender log4j.appender.CATALINA.File=${catalina.base}/logs/catalina.out log4j.appender.CATALINA.Append=true log4j.appender.CATALINA.Encoding=UTF-8 

    前面四行 appender 定义了 log4j 中的 DailyRollingFileAppender,其中文件名为 catalina.out。这些日志将启用 UTF-8 编码。

    笔记

    如果 log4j.appender.CATALINA.append=false,则不会在日志文件中更新日志。

    # Roll-over the log once per day log4j.appender.CATALINA.DatePattern='.'dd-MM-yyyy'.log' log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n 

    前三行代码显示了日志每天滚动一次。

  • Layout: 定义为日志文件中显示的日志格式。 appender 使用布局来格式化日志文件(也称为模式)。突出显示的代码显示了访问日志的模式:

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false"/> 

    笔记

    记录器、附加程序和布局一起帮助开发人员捕获应用程序事件的日志消息。

Tomcat 7 中的登录类型


我们可以根据需要以不同的方式在 Tomcat 7 中启用日志记录。我们可以在Tomcat中配置的日志记录类型共有五种,例如应用程序、服务器、控制台等。下图显示了 Tomcat 7 的不同类型的日志记录。这些方法根据环境需要相互结合使用。例如,如果您遇到无法显示 Tomcat 服务的问题,那么控制台日志对于识别问题非常有帮助,因为我们可以验证实时启动顺序。让我们简要讨论每种日志记录方法:

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

应用程序日志

这些日志用于在运行应用程序事务时捕获应用程序事件。这些日志对于识别应用程序级别的问题非常有用。例如,假设您的应用程序在特定转换时性能很慢,那么该转换的详细信息只能在应用程序日志中跟踪。应用程序日志的最大优势是我们可以为每个应用程序配置单独的日志级别和日志文件,使管理员可以非常轻松地对应用程序进行故障排除。

笔记

Log4j 用于 90% 的应用程序日志生成案例。

服务器日志

服务器日志与控制台日志相同。服务端日志唯一的好处就是可以随时调取,但是我们从控制台登出后就无法使用控制台日志了。

控制台日志

该日志为您提供了 Tomcat 7 启动和加载程序序列的完整信息。日志文件名为 catalina.out,位于 TOMCAT_HOME/logs。此日志文件在检查任何环境的应用程序部署和服务器启动测试时非常有用。该日志配置在Tomcat文件 catalina.sh中,可以在 TOMCAT_HOME/bin中找到。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

上一个屏幕截图显示了 Tomcat 日志记录的定义。默认情况下,控制台日志配置为 INFO 模式。

笔记

Tomcat 中有不同级别的日志记录,例如 WARN、INFO、CONFIG 和 FINE。我们将在本章的 Tomcat 7 中的日志级别类型 部分详细讨论每个日志级别。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

上一个屏幕截图显示了 Tomcat 服务启动后的 Tomcat 日志文件位置。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

前面的屏幕截图显示了 catalina.out 文件的输出,其中Tomcat 服务在 1903 ms 内启动。

访问日志

访问日志是自定义日志,提供以下信息:

  • 谁访问了该应用程序

  • 访问应用程序的哪些组件

  • 源IP等

这些日志在许多应用程序的流量分析以分析带宽需求方面发挥着至关重要的作用,它们还有助于在重负载下对应用程序进行故障排除。这些日志在 TOMCAT_HOME/conf 中的 server.xml 中配置。以下屏幕截图显示了访问日志的定义。您可以根据环境和审核要求自定义它们。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

让我们讨论一下访问日志的模式格式,并了解如何自定义日志格式:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false"/>
  • 类名: 该参数定义用于生成日志的类名。默认情况下,Apache Tomcat 7 使用 org.apache.catalina.valves.AccessLogValve 类作为访问日志。

  • 目录: 此参数定义日志文件的目录位置。所有的日志文件都在日志目录中生成——TOMCAT_HOME/logs——但是我们可以根据我们的环境设置自定义日志位置,然后在定义中更新目录路径访问日志。

  • Prefix: 该参数定义了访问日志文件名的前缀,即默认情况下,访问日志文件由name生成 localhost_access_log.yy-mm-dd.txt.

  • 后缀: 该参数定义日志文件的文件扩展名。目前是 .txt 格式。

  • 模式: 这个参数定义了日志文件的格式。该模式是管理员定义的值的组合,例如, %h = 远程主机地址。以下屏幕截图显示了 Tomcat 7 的默认日志格式。访问日志显示远程主机地址、请求的日期/时间、用于响应的方法、URI 映射和 HTTP 状态代码。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

笔记

如果您为应用程序安装了 Web 流量分析工具,则必须将访问日志更改为不同的格式。

主机管理器

这些日志定义了使用 Tomcat 管理器执行的活动,例如执行的各种任务、应用程序的状态、应用程序的部署以及 Tomcat 的生命周期。这些配置是在 logging.properties上完成的,可以在 TOMCAT_HOME/conf中找到。

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

前面的屏幕截图显示了 host、manager host-manager 详细信息的定义。如果您看到定义,它会定义日志位置、日志级别和文件名前缀。

笔记

logging.properties 中,我们使用 JULI 定义文件处理程序和附加程序。

manager 的日志文件类似于以下内容:

28 Jun, 2011 3:36:23 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: list: Listing contexts for virtual host 'localhost' 28 Jun, 2011 3:37:13 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: list: Listing contexts for virtual host 'localhost' 28 Jun, 2011 3:37:42 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: undeploy: Undeploying web application at '/sample' 28 Jun, 2011 3:37:43 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: list: Listing contexts for virtual host 'localhost' 28 Jun, 2011 3:42:59 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: list: Listing contexts for virtual host 'localhost' 28 Jun, 2011 3:43:01 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: list: Listing contexts for virtual host 'localhost' 28 Jun, 2011 3:53:44 AM org.apache.catalina.core.ApplicationContext log INFO: HTMLManager: list: Listing contexts for virtual host 'localhost'

Tomcat 7 中的日志级别类型


为 Tomcat 日志服务 (JULI) 定义了七个级别。它们可以根据应用程序的要求进行设置。下图展示了 JULI 的日志级别顺序:

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

JULI 中的每个日志级别都有自己的功能。下表显示了 JULI 中每个日志级别的功能:

日志级别

描述

严重(最高)

捕获异常和错误

警告

警告信息

信息

与服务器活动相关的信息性消息

配置

配置信息

很好

服务器事务的详细活动(类似于调试)

更精细

比 FINE 更详细的日志

最好(最少)

整个事件流(类似于跟踪)

例如,让我们从 logging.properties 中获取一个 appender,并找出使用的日志级别; localhost 的第一个日志附加程序使用 FINE 作为日志级别,如以下代码片段所示:

localhost.org.apache.juli.FileHandler.level = FINE localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs localhost.org.apache.juli.FileHandler.prefix = localhost.

以下代码显示了使用 JULI 登录 Tomcat 7 的默认文件处理程序配置。提到了属性和日志级别:

############################################################ # Facility specific properties. # Provides extra control for each logger. ############################################################ org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] .level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] .handlers = 3manager.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host- manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host- manager].handlers = 4host-manager.org.apache.juli.FileHandler

日志4j


Log4j 是由 Apache 软件基金会运营的项目。该项目有助于在服务器和应用程序的各个级别启用日志。

log4j 的主要优点是可管理性。它为开发人员提供了在配置文件级别更改日志级别的自由。此外,您可以在配置级别启用/禁用日志,因此无需更改代码。我们可以根据应用单独定制日志模式。 Log4j 有六个日志级别。下图展示了log4j中不同类型的日志级别:

读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

log4j 的日志级别

log4j 中的每个日志级别都有自己的功能。下表显示了 log4j 中每个日志级别的功能:

日志级别

描述

关闭

当您希望将日志记录设置为 false(已停止日志记录)时,会设置此级别。

致命

此日志级别将打印导致提前终止的严重错误。

错误

此日志级别用于捕获运行时错误或意外情况。

期望这些在状态控制台上立即可见。

警告

此级别在以前的版本中使用。

它为您提供几乎错误,以及其他不希望或意外但不一定错误的运行时情况< /em>

期望这些在状态控制台上立即可见。

信息

此日志级别将定义有趣的运行时事件(启动/关闭)。

最好将日志放在 INFO 级别。

调试

在此级别中定义了有关通过系统的流量的详细信息。

追踪

此日志级别捕获系统和应用程序中的所有事件。

如何使用 log4j

以下是使用 log4j 需要执行的步骤:

  1. 1. 从官方网址下载 apache-log4j-1.2.X.tar.gz http://logging.apache.org/log4j/1.2/download.html,其中 X 是次要版本。

  2. 2.解压文件夹,将 log4j.jar放入 lib for TOMCAT_HOME/lib 并从 lib 中删除 juli*.jar

  3. 3。从 TOMCAT_HOME/CONF中删除 logging.properties

  4. 4. 在 TOMCAT_HOME/CONF 中创建文件 log4j.properties 并为Tomcat实例定义日志附加器。以下屏幕截图显示了 catalina.out 的附加程序。此外,突出显示的代码显示了每天的日志翻转:

    读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

    笔记

    您可以使用之前以粗体标记的 log4j appender,根据大小、日期、小时等自定义日志轮换。

  5. 5. 重新启动 Tomcat 服务。

    笔记

    生产环境重要提示

    DEBUG 和 TRACE 模式是故障排除的理想模式,但我们必须在日志分析后禁用它们。对于生产环境,理想的模式是 INFO(DEBUG 和 TRACE 会生成大量日志记录,也会影响服务器性能)。

    应在生产环境中每天启用附加程序。这有助于管理员非常轻松地执行日志分析(文件大小更小)。

日志级别映射

到目前为止,我们已经讨论了 JULI 和 log4j 的各种日志级别。让我们为 JULI 和 log4j 做一个快速的日志级别映射。下表显示了 log4j 和 JULI 的一对一映射:

JULI 中的日志级别

log4j 中的日志级别

严重

致命,错误

警告

警告

信息

信息

配置

不适用

美好的

调试

更精细

调试

最好的

痕迹

Tomcat 7 的值


值被定义为改变日志中字符串模式的标识符。假设您想知道访问该网站的远程主机的 IP 地址,那么您添加日志附加器中提到的以下值的组合。比如我们自定义Tomcat 7的访问日志。默认情况下,Tomcat的访问日志定义如下:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false"/>

我们想要更改日志模式以显示处理请求所花费的时间。我们必须在模式中添加 %T。修改后的代码如下所示:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t %T &quot;%r&quot; %s %b" resolveHosts="false"/>

下表显示了 Tomcat 7 中用于日志模式自定义的值:

价值观

描述

%a

远程 IP 地址

%A

本地 IP 地址

%b

发送的字节数,不包括 HTTP 标头,如果为零,则为 ''

%B

发送的字节数,不包括 HTTP 标头

%h

远程主机名(或 IP 地址,如果连接器的 enableLookups false)

%H

请求协议

%l

来自 identd 的远程逻辑用户名

%m

请求方法(GET、POST 等)

%p

收到此请求的本地端口

%q

查询字符串(如果存在,则以“?”开头)

%r

请求的第一行(方法和请求 URI)

%s

响应的 HTTP 状态码

%S

用户会话 ID

%t

日期和时间,采用通用日志格式

%u

已通过身份验证的远程用户(如果有)

%U

请求的 URL 路径

%v

本地服务器名称

%D

处理请求所花费的时间,以毫秒为单位

%T

处理请求所花费的时间,以秒为单位

%我

当前请求线程名称(可以稍后与堆栈跟踪进行比较)

日志分析


日志分析是一个非常重要和棘手的问题,需要非常小心地处理。如果您忽略了几行,那么您将永远无法找到问题的根本原因。在进行日志分析时需要考虑的一些最佳实践如下所述:

  • 检查问题后 1 小时的日志

  • 当错误开始时,始终转到日志中的第一个异常

  • 始终牢记问题不是由于 Tomcat 故障引起的,还要检查其他基础设施资源

在非 DOS 操作系统(Linux、Unix、Ubuntu 等)中,有两个实用程序在日志分析中非常有用, grep awk。让我们简要讨论 grep awk 实用程序:

  • grep: 此实用程序打印与搜索的字符串匹配的行。

    grep Error catalina.out 
    • 前面的命令是 grep 命令的示例,用于在文件 catalina.out 中搜索单词“error”并显示包含“错误”一词的行。

  • awk: 该命令用于模式扫描。假设我们要打印整个数据文件中的 10 列,那么这个命令就非常有用。以下屏幕截图显示了对 /opt 目录运行命令时的输出:

    find "location of directory " -type f -size +10000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }' find "/opt" -type f -size +10000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }' 
    读书笔记《apache-tomcat-7-essentials》登录Tomcat 7

日志分析有用的命令

管理员正在寻找快捷命令来有效地完成工作。以下是我在日志分析过程中收集到的一些有用的命令:

以下命令用于搜索大日志文件。有时在生产环境中,我们会收到磁盘空间不足的警报。可以使用以下命令:

  • 在 Linux 中查找大文件和目录:

find "location of directory " type f -size +10000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
  • 查找大小超过 100MB 的目录:

find / -type d -size +100000k
  • 使用 du: 按大小对目录进行排序

du --max-depth=1 -m | sort -n -r
  • 查找目录大小:

du -sh folder_name du -ch folder_name du -csh folder_name
  • 以下命令用于截断实时系统上的大量日志文件(无需回收服务即可完成日志轮换):

cat /dev/null > file_name

以下提到的命令用于在不同文件中搜索字符串:

  • 查找 ERROR 异常

grep ERROR log_file
  • 日志文件的最后 200 行:

tail -200 log_file
  • 待更新的当前日志

tail -f log_file

概括


在本章中,我们讨论了使用 log4j 和 JULI 在 Tomcat 7 中启用日志的不同方法。此外,我们还讨论了用于日志分析、提示和技巧的最佳实践。

在下一章中,我们将讨论 Web 管理员在管理和维护应用程序生产环境时面临的实时问题。所以,准备好享受真正的乐趣吧!