Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式

本文介绍如何使用Log4j接管Tomcat的日志输出,并按天分割catalina.out等日志文件,有效解决日志文件过大问题。通过配置Log4j,实现不同类型的日志分别输出到指定文件。

Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式,按天存放,解决catalina.out日志文件过大问题

1. 准备jar包:

    log4j-1.2.17.jar (从 http://www.apache.org/dist/logging/log4j/1.2.17/ 下载)

    tomcat-juli.jar, tomcat-juli-adapters.jar (从 http://www.apache.org/dist/tomcat/tomcat-7/v7.0.52/bin/extras/ 下载,根据你的Tomcat版本选择对应的分支)

2. 将上面的三个jar包拷贝到 Tomcat 的 lib 目录下;

3. 将 tomcat-juli.jar 拷贝到 Tomcat 的 bin 目录下,替换原有的jar包;

4. 修改 Tomcat 的 conf/context.xml 文件,将<Context>为<Context swallowOutput="true">

  (增加 swallowOutput="true" 的属性配置,只有这样才能完全的把tomcat的stdout给接管过来。这一步很关键 在官网及网上找了许多资料都没有提及。);

5. 删除 Tomcat 的 conf/logging.properties 文件(或者重命名-建议);

6. 在 Tomcat 的 lib 目录下创建 log4j.properties 文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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
# 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





原文转自:http://my.oschina.net/jsan/blog/205669
<think>我们正在讨论MyBatis日志输出到Tomcatcatalina.out文件的原因和配置。根据之前的讨论,我们知道Tomcat默认使用java.util.logging(JUL)作为日志框架,而MyBatis可以使用多种日志实现(如SLF4J、Log4j等)。如果MyBatis的日志被输出到了catalina.out,这通常是因为MyBatis的日志被路由到了Tomcat的JUL,而Tomcat的JUL默认将日志输出到控制台(即catalina.out)。原因分析:1.当MyBatis没有配置特定的日志实现时,它会按照其内置的日志查找顺序(在mybatis-config.xml中可配置)来选择日志实现。MyBatis的日志查找顺序如下(按顺序查找,使用第一个找到的):-SLF4J-ApacheCommonsLogging-Log4j2-Log4j-JDKlogging(JUL)2.如果前面的日志实现都没有找到,MyBatis会使用JDKlogging(JUL),而Tomcat默认使用JUL,并且Tomcat的JUL配置默认将日志输出到控制台(catalina.out)。3.因此,如果应用中没有引入任何其他日志框架(如SLF4J、Log4j等),MyBatis就会回退到JUL,从而将日志输出到catalina.out。配置方法:如果我们希望MyBatis的日志输出到catalina.out,那么不需要额外配置,因为默认情况下(使用JUL)就会这样。但是,如果我们希望改变MyBatis的日志行为(比如输出到文件,或者使用其他日志框架),我们可以:1.引入其他日志框架(如Log4j2)并配置,这样MyBatis会自动使用该框架。2.或者,明确指定MyBatis使用的日志实现(在mybatis-config.xml中):```xml<configuration><settings><settingname="logImpl"value="LOG4J2"/></settings></configuration>```如果我们希望MyBatis的日志不输出到catalina.out,而是输出到我们自己的日志文件中,那么我们需要做以下几步:1.引入我们选择的日志框架(例如Log4j2)的依赖。2.排除Tomcat默认的JUL(或者配置我们的日志框架来接管JUL的日志),但通常我们只需要配置自己的日志框架即可。3.配置日志框架(如log4j2.xml)来指定MyBatis日志的输出位置。但是,如果我们不想引入额外的日志框架,而只是想控制JUL的日志输出,我们可以修改Tomcat的logging.properties文件。例如,我们可以将MyBatis相关日志级别设置为更高级别(如SEVERE)以减少输出,或者将其输出重定向到文件而不是控制台。在Tomcat的logging.properties中,我们可以这样配置:1.找到控制台处理器(ConsoleHandler)的配置,默认是将日志输出到控制台(即catalina.out)。2.我们可以修改控制台处理器的级别,或者添加新的FileHandler来将日志输出到文件。但是,需要注意的是,MyBatis的日志记录器名称通常以`org.apache.ibatis`开头,或者具体Mapper的命名空间(如dao接口的全限定名)。因此,如果我们想单独控制MyBatis的日志,可以在logging.properties中添加:```#设置MyBatis核心日志记录器的级别和处理器org.apache.ibatis.level=FINE#如果我们不想让MyBatis的日志输出到控制台,可以将其指向一个文件处理器#首先定义一个文件处理器handlers=...,org.apache.ibatis.FileHandler#然后配置这个文件处理器org.apache.ibatis.FileHandler.level=FINEorg.apache.ibatis.FileHandler.directory=${catalina.base}/logsorg.apache.ibatis.FileHandler.prefix=mybatis.org.apache.ibatis.FileHandler.formatter=java.util.logging.SimpleFormatter```然而,这种方法比较复杂,通常建议使用更强大的日志框架(如Log4j2)来管理日志。总结:MyBatis日志输出到catalina.out的原因是因为它使用Tomcat默认的JUL日志框架,并且JUL的ConsoleHandler将日志输出到了控制台(即catalina.out)。配置方式:1.默认情况下(使用JUL)就会输出到catalina.out。2.若要改变,可以:a)引入其他日志框架(如Log4j2)并配置,然后指定MyBatis使用该日志框架。b)或者,修改Tomcat的logging.properties,调整JUL的配置(比如将MyBatis的日志重定向到文件,或者关闭控制台输出)。注意:如果我们修改了Tomcat的logging.properties,需要重启Tomcat才能生效。引用说明:用户提供的引用中提到了如何关闭catalina.out的日志输出(引用[4])以及如何用Log4j替代Tomcat的默认日志(引用[2][3])。这些方法同样适用于控制MyBatis的日志输出。因此,如果我们不希望MyBatis的日志输出到catalina.out,我们可以:-方法1:关闭Tomcat的控制台日志(引用[4]):在logging.properties中设置:`java.util.logging.ConsoleHandler.level=OFF`但这样会关闭所有通过JUL输出到控制台的日志(不仅仅是MyBatis的日志)。-方法2:使用Log4j接管Tomcat的日志(引用[2][3]),这样Tomcat的日志(包括catalina.out)将按Log4j的配置输出,同时我们也可以配置MyBatis使用Log4j,从而统一管理。-方法3:在应用中配置自己的日志框架(如Log4j2),并确保MyBatis使用该框架,这样MyBatis的日志就不会走Tomcat的JUL,也就不会输出到catalina.out。根据用户提供的引用,我们可以参考这些方法来实现对MyBatis日志输出的控制。</think>### MyBatis日志输出到Tomcat catalina.out的原因及配置机制 #### 原因分析 1. **日志框架继承关系** MyBatis自身不提供日志实现,而是通过以下机制输出日志: - 当应用未明确配置日志框架时,MyBatis默认继承Tomcat的`java.util.logging`(JUL)实现 - JUL的`ConsoleHandler`默认将日志输出到`System.out`,最终写入`catalina.out`[^2][^4] 2. **配置缺失时的默认行为** 若项目中缺少以下配置,MyBatis日志将流向Tomcat默认输出: ```mermaid graph LR A[MyBatis日志] --> B{是否配置独立日志框架?} B -->|否| C[使用Tomcat JUL] C --> D[ConsoleHandler] D --> E[catalina.out] B -->|是| F[自定义日志文件] ``` 3. **未正确隔离日志系统** 当同时存在以下情况时会发生: - 未在`mybatis-config.xml`中指定`<setting name="logImpl" value="LOG4J2"/>` - 未在应用中排除Tomcat的JUL依赖 - 未配置Log4j2等独立日志框架 #### 配置解决方案 ##### 方案1:禁用catalina.out输出(推荐) 修改`$CATALINA_HOME/conf/logging.properties`: ```properties # 关闭控制台日志处理器 java.util.logging.ConsoleHandler.level = OFF # 单独配置MyBatis日志级别 org.apache.ibatis.level = WARNING ``` 重启Tomcat生效[^1][^4] ##### 方案2:迁移到Log4j2 1. **添加依赖** (`pom.xml`) ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jul</artifactId> <!-- 桥接JUL到Log4j2 --> <version>2.17.1</version> </dependency> ``` 2. **配置`log4j2.xml`** ```xml <Configuration> <Appenders> <File name="MybatisLog" fileName="logs/mybatis.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <Loggers> <Logger name="org.apache.ibatis" level="DEBUG" additivity="false"> <AppenderRef ref="MybatisLog"/> </Logger> <Root level="ERROR"> <AppenderRef ref="MybatisLog"/> </Root> </Loggers> </Configuration> ``` 3. **添加JVM参数** (`setenv.sh`) ```bash export CATALINA_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager" ``` ##### 方案3:定期清理catalina.out(临时方案) ```bash # 清空而不删除文件 echo "" > $CATALINA_BASE/logs/catalina.out # 或使用日志轮转工具 install logrotate -y cat > /etc/logrotate.d/tomcat <<EOF $CATALINA_BASE/logs/catalina.out { daily rotate 7 missingok compress copytruncate } EOF ``` [^5] #### 关键配置点 | 配置位置 | 作用 | 影响范围 | |-------------------------|----------------------------------------------------------------------|------------------| | `logging.properties` | 控制Tomcat原生日志行为 | 所有JUL日志 | | `log4j2.xml` | 定义自定义日志格式和输出路径 | 应用级日志 | | MyBatis的`logImpl`设置 | 指定MyBatis使用的日志实现(LOG4J2/SLF4J等) | MyBatis专属日志 | | `java.util.logging.manager` | 覆盖JVM默认日志管理器 | 整个Tomcat实例 | > **最佳实践**:通过方案2将MyBatis日志与Tomcat系统日志完全隔离,避免`catalina.out`膨胀问题[^2][^3] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值