tomcat7日志管理--基础知识、配置、以及使用log4j做日志分割

一直想研究下tomcat的日志管理,今天终于抽出时间,通过上网查资料和亲自动手实践,终于把这一部分搞明白了。本人用的tomcat版本是7.0.55,下面写的内容也是基于此版本的配置,7以下的可能有些不同,这里就不做说明了。如有不正确的部分,欢迎大家指正。

注:关于tomcat7日志管理的部分内容来自于Apache tomcat 7.0文档中logging部分,想看源文档的可以移步:http://tomcat.apache.org/tomcat-7.0-doc/logging.html

—————————————————————————我是正文分割线—————————————————————————

下面是tomcat日志基本知识科普时间,已经了解的请跳过:

tomcat上日志的实现基于Apache Commons Logging库,因此需要引入commons-logging包(我使用的是commons-logging-1.2.jar)

在tomcat上运行web项目记录日志有三种方式:

  • 使用系统jdk自带的logging API: java.util.logging;
  • 使用java servlet规范提供的logging API: javax.servlet.ServletContext.log(..)
  • 选择使用其他的日志框架,如log4j

不同项目中使用的同一日志框架之间是相互独立的,但如果项目直接或间接地使用了java.util.logging来记录日志的话除外,因为它由系统统一加载并在不同的项目之间共享。

1.使用java.util.logging

java.util.logging API的默认实现功能有限,因此tomcat的默认配置中,将日志管理(LogManager)的实现替换为了另一个实现容器JULI,它同样支持标准JDK java.util.logging的配置机制,不同的是JULI的每一个类加载属性文件都可以被设置,并可以在其中定义处理器,这样就给了开发者更大的自由度。

JULI的日志配置分为全局配置和项目配置。全局配置位于tomcat的配置目录${catalina.base}/conf/logging.properties文件,如果该文件未配置或不可读,那么tomcat将会使用JRE中的默认日志配置,可以在${java.home}/lib/logging.properties查看配置文件的内容;项目配置则是针对不同的项目,配置文件位于WEB-INFO/classes/logging.properties.

下面代码是JRE中的日志配置文件的部分内容,可以看出其中的日志处理器为ConsoleHandler. 能够接受System.err错误日志

handlers= java.util.logging.ConsoleHandler

# To also add the FileHandler, use the following line instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

下面代码则是tomcat配置文件中的日志配置部分,可以看出增加了FIleHandler,可以将日志写入文件,同时可以为不同的logger配置各自的级别和handler

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

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

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

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

4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


############################################################
# 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

其中org.apache.juli.FileHandler是java提供的一个可以将多个实现类统一使用的入口,handler名字前可以增加前缀,前缀以String开始以字符‘.’结束,使用“.handler”可以定义root logger的handler集合

2.使用Log4j来记录日志

Log4j是一个应用比较广泛的日志框架,易于集成和使用。下面介绍如何使用Apache Log4j重新配置tomcat以取代java.util.logging来进行项目日志管理。

如果你只是想对当前的项目运用log4j,那么只需要将log4j.jar,log4j.properties分别放入项目的WEB-INFO/lib和WEB-INFO/classes文件夹下即可;但如果你想将log4j运用到所有运行于tomcat的项目中,那么还需要以下配置步骤:

1) 首先创建一个log4j.properties文件,并将其放置在tomcat的lib目录$CATALINA_BASE/lib下。以下配置内容摘自tomcat官方文档日志配置一节:

log4j.rootLogger = INFO, CATALINA

# Define all the appenders
log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
log4j.appender.CATALINA.Append = true
log4j.appender.CATALINA.Encoding = UTF-8
# Roll-over the log once per day
log4j.appender.CATALINA.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.LOCALHOST = org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File = ${catalina.base}/logs/localhost
log4j.appender.LOCALHOST.Append = true
log4j.appender.LOCALHOST.Encoding = UTF-8
log4j.appender.LOCALHOST.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File = ${catalina.base}/logs/manager
log4j.appender.MANAGER.Append = true
log4j.appender.MANAGER.Encoding = UTF-8
log4j.appender.MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.HOST-MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST-MANAGER.File = ${catalina.base}/logs/host-manager
log4j.appender.HOST-MANAGER.Append = true
log4j.appender.HOST-MANAGER.Encoding = UTF-8
log4j.appender.HOST-MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding = UTF-8
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost] = INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] =\
  INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager] =\
  INFO, HOST-MANAGER

 2) 下载log4j的jar包,需要1.2以上版本

 3) 下载tomcat-juli.jar、tomcat-juli-adapters.jar作为tomcat的外部组件。注意,此处的tomcat-juli.jar和默认的不同,它包含了Apache Commons Logging的全部实现

 4) 如果你想使用log4j作为tomcat的全局配置,那么首先将log4j.jar、tomcat-juli-adapters.jar放入$CATALINA_HOME/lib目录下,然后将$CATALINA_HOME/bin/tomcat-juli.jar替换为下载的tomcat-juli.jar

 5) 如果你使用不同的$CATALINA_HOME和$CATALINA_BASE来运行tomcat,并且希望采用同一个$CATALINA_BASE来配置log4j,那么还需要下面几步操作:

    创建$CATALINA_BASE/bin和$CATALINA_BASE/lib目录;

    将log4j.jar和tomcat-juli-adapters.jar放入$CATALINA_BASE/lib下;

    将tomcat-juli.jar放入$CATALINA_BASE/bin下;

    如果你是以security manager运行的tomcat,那么还需要编辑$CATALINA_BASE/conf/catalina.policy文件来让它使用不同的tomcat-juli.jar.

 6) 删除$CATALINA_BASE/conf/logging.properties文件

 7) 重启tomcat

通过上面的步骤,使用log4j替代tomcat默认的java.util.logging来输出日志就配置完成了。

猜你喜欢

转载自blog.csdn.net/cfydaniel/article/details/41348449