读书笔记《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 分别。
巨力
以前版本的 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 分别。
记录器、附加程序和布局
在为应用程序实现日志记录机制时,我们会使用一些重要的日志记录组件。每个术语在跟踪应用程序事件方面都有其各自的重要性。让我们分别讨论每个术语以了解它们的用法:
Loggers: 可以定义为日志文件的逻辑名。此逻辑名称写在应用程序代码中。我们可以为每个应用程序配置一个独立的记录器。
Appenders:生成日志的过程由appenders处理。 appender的种类很多,例如 FileAppender、ConsoleAppender、SocketAppender等,log4j中都有。以下是 log4j 的 appender 的一些示例:
前面四行 appender 定义了 log4j 中的 DailyRollingFileAppender,其中文件名为
catalina.out
。这些日志将启用 UTF-8 编码。笔记
如果
log4j.appender.CATALINA.append=false
,则不会在日志文件中更新日志。Layout: 定义为日志文件中显示的日志格式。 appender 使用布局来格式化日志文件(也称为模式)。突出显示的代码显示了访问日志的模式:
笔记
记录器、附加程序和布局一起帮助开发人员捕获应用程序事件的日志消息。
Tomcat 7 中的登录类型
我们可以根据需要以不同的方式在 Tomcat 7 中启用日志记录。我们可以在Tomcat中配置的日志记录类型共有五种,例如应用程序、服务器、控制台等。下图显示了 Tomcat 7 的不同类型的日志记录。这些方法根据环境需要相互结合使用。例如,如果您遇到无法显示 Tomcat 服务的问题,那么控制台日志对于识别问题非常有帮助,因为我们可以验证实时启动顺序。让我们简要讨论每种日志记录方法:
应用程序日志
这些日志用于在运行应用程序事务时捕获应用程序事件。这些日志对于识别应用程序级别的问题非常有用。例如,假设您的应用程序在特定转换时性能很慢,那么该转换的详细信息只能在应用程序日志中跟踪。应用程序日志的最大优势是我们可以为每个应用程序配置单独的日志级别和日志文件,使管理员可以非常轻松地对应用程序进行故障排除。
笔记
Log4j 用于 90% 的应用程序日志生成案例。
控制台日志
该日志为您提供了 Tomcat 7 启动和加载程序序列的完整信息。日志文件名为 catalina.out
,位于 TOMCAT_HOME/logs
。此日志文件在检查任何环境的应用程序部署和服务器启动测试时非常有用。该日志配置在Tomcat文件 catalina.sh
中,可以在 TOMCAT_HOME/bin
中找到。
上一个屏幕截图显示了 Tomcat 日志记录的定义。默认情况下,控制台日志配置为 INFO 模式。
笔记
Tomcat 中有不同级别的日志记录,例如 WARN、INFO、CONFIG 和 FINE。我们将在本章的 Tomcat 7 中的日志级别类型 部分详细讨论每个日志级别。
上一个屏幕截图显示了 Tomcat 服务启动后的 Tomcat 日志文件位置。
前面的屏幕截图显示了 catalina.out
文件的输出,其中Tomcat 服务在 1903 ms
内启动。
访问日志
谁访问了该应用程序
访问应用程序的哪些组件
源IP等
这些日志在许多应用程序的流量分析以分析带宽需求方面发挥着至关重要的作用,它们还有助于在重负载下对应用程序进行故障排除。这些日志在 TOMCAT_HOME/conf
中的 server.xml
中配置。以下屏幕截图显示了访问日志的定义。您可以根据环境和审核要求自定义它们。
让我们讨论一下访问日志的模式格式,并了解如何自定义日志格式:
类名: 该参数定义用于生成日志的类名。默认情况下,Apache Tomcat 7 使用
org.apache.catalina.valves.AccessLogValve
类作为访问日志。目录: 此参数定义日志文件的目录位置。所有的日志文件都在日志目录中生成——
TOMCAT_HOME/logs
——但是我们可以根据我们的环境设置自定义日志位置,然后在定义中更新目录路径访问日志。Prefix: 该参数定义了访问日志文件名的前缀,即默认情况下,访问日志文件由name生成
localhost_access_log.yy-mm-dd.txt.
模式: 这个参数定义了日志文件的格式。该模式是管理员定义的值的组合,例如,
%h
= 远程主机地址。以下屏幕截图显示了 Tomcat 7 的默认日志格式。访问日志显示远程主机地址、请求的日期/时间、用于响应的方法、URI 映射和 HTTP 状态代码。
笔记
如果您为应用程序安装了 Web 流量分析工具,则必须将访问日志更改为不同的格式。
Tomcat 7 中的日志级别类型
为 Tomcat 日志服务 (JULI) 定义了七个级别。它们可以根据应用程序的要求进行设置。下图展示了 JULI 的日志级别顺序:
JULI 中的每个日志级别都有自己的功能。下表显示了 JULI 中每个日志级别的功能:
日志级别 |
描述 |
---|---|
严重(最高) |
捕获异常和错误 |
警告 |
警告信息 |
信息 |
与服务器活动相关的信息性消息 |
配置 |
配置信息 |
很好 |
服务器事务的详细活动(类似于调试) |
更精细 |
比 FINE 更详细的日志 |
最好(最少) |
整个事件流(类似于跟踪) |
例如,让我们从 logging.properties 中获取一个 appender,并找出使用的日志级别; localhost 的第一个日志附加程序使用 FINE 作为日志级别,如以下代码片段所示:
以下代码显示了使用 JULI 登录 Tomcat 7 的默认文件处理程序配置。提到了属性和日志级别:
日志4j
Log4j 是由 Apache 软件基金会运营的项目。该项目有助于在服务器和应用程序的各个级别启用日志。
log4j 的主要优点是可管理性。它为开发人员提供了在配置文件级别更改日志级别的自由。此外,您可以在配置级别启用/禁用日志,因此无需更改代码。我们可以根据应用单独定制日志模式。 Log4j 有六个日志级别。下图展示了log4j中不同类型的日志级别:
log4j 的日志级别
log4j 中的每个日志级别都有自己的功能。下表显示了 log4j 中每个日志级别的功能:
日志级别 |
描述 |
---|---|
关闭 |
当您希望将日志记录设置为 |
致命 |
此日志级别将打印导致提前终止的严重错误。 |
错误 |
此日志级别用于捕获运行时错误或意外情况。 期望这些在状态控制台上立即可见。 |
警告 |
此级别在以前的版本中使用。 它为您提供几乎错误,以及其他不希望或意外但不一定错误的运行时情况< /em>。 期望这些在状态控制台上立即可见。 |
信息 |
此日志级别将定义有趣的运行时事件(启动/关闭)。 最好将日志放在 INFO 级别。 |
调试 |
在此级别中定义了有关通过系统的流量的详细信息。 |
追踪 |
此日志级别捕获系统和应用程序中的所有事件。 |
如何使用 log4j
1. 从官方网址下载 apache-log4j-1.2.X.tar.gz http://logging.apache.org/log4j/1.2/download.html,其中 X 是次要版本。
2.解压文件夹,将
log4j.jar
放入lib
forTOMCAT_HOME/lib
并从lib
中删除juli*.jar
。4. 在
TOMCAT_HOME/CONF
中创建文件log4j.properties
并为Tomcat实例定义日志附加器。以下屏幕截图显示了catalina.out
的附加程序。此外,突出显示的代码显示了每天的日志翻转:笔记
您可以使用之前以粗体标记的 log4j appender,根据大小、日期、小时等自定义日志轮换。
5. 重新启动 Tomcat 服务。
笔记
生产环境重要提示
DEBUG 和 TRACE 模式是故障排除的理想模式,但我们必须在日志分析后禁用它们。对于生产环境,理想的模式是 INFO(DEBUG 和 TRACE 会生成大量日志记录,也会影响服务器性能)。
应在生产环境中每天启用附加程序。这有助于管理员非常轻松地执行日志分析(文件大小更小)。
Tomcat 7 的值
值被定义为改变日志中字符串模式的标识符。假设您想知道访问该网站的远程主机的 IP 地址,那么您添加日志附加器中提到的以下值的组合。比如我们自定义Tomcat 7的访问日志。默认情况下,Tomcat的访问日志定义如下:
我们想要更改日志模式以显示处理请求所花费的时间。我们必须在模式中添加 %T
。修改后的代码如下所示:
下表显示了 Tomcat 7 中用于日志模式自定义的值:
价值观 |
描述 |
---|---|
%a |
远程 IP 地址 |
%A |
本地 IP 地址 |
%b |
发送的字节数,不包括 HTTP 标头,如果为零,则为 '' |
%B |
发送的字节数,不包括 HTTP 标头 |
%h |
远程主机名(或 IP 地址,如果连接器的 |
%H |
请求协议 |
%l |
来自 identd 的远程逻辑用户名 |
%m |
请求方法(GET、POST 等) |
%p |
收到此请求的本地端口 |
%q |
查询字符串(如果存在,则以“?”开头) |
%r |
请求的第一行(方法和请求 URI) |
%s |
响应的 HTTP 状态码 |
%S |
用户会话 ID |
%t |
日期和时间,采用通用日志格式 |
%u |
已通过身份验证的远程用户(如果有) |
%U |
请求的 URL 路径 |
%v |
本地服务器名称 |
%D |
处理请求所花费的时间,以毫秒为单位 |
%T |
处理请求所花费的时间,以秒为单位 |
%我 |
当前请求线程名称(可以稍后与堆栈跟踪进行比较) |
概括
在本章中,我们讨论了使用 log4j 和 JULI 在 Tomcat 7 中启用日志的不同方法。此外,我们还讨论了用于日志分析、提示和技巧的最佳实践。
在下一章中,我们将讨论 Web 管理员在管理和维护应用程序生产环境时面临的实时问题。所以,准备好享受真正的乐趣吧!