首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制Tomcat5.5中webapp中第三方组件的日志记录?

如何控制Tomcat5.5中webapp中第三方组件的日志记录?
EN

Stack Overflow用户
提问于 2011-03-29 21:43:47
回答 2查看 1.7K关注 0票数 2

我们在Linux上使用Tomcat5.5。我们的webapp使用log4j进行日志记录(基于功能而不是很多记录器),并有意将记录器的可加性设置为false。我们的记录器登录到我们自己的日志文件。他们都没有登录到控制台。

我们遇到的一个问题是,当我们的记录器的级别被设置为调试时,我们就开始从第三方组件中获得大量的catalina.out调试日志记录,特别是涛动。

在./公用/类中有一个最小的log4j.properties文件:

代码语言:javascript
复制
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

在./webapp/ourapp/webapps/classes中没有log4g.properties文件。

我尝试的第一件事是更改为log4j.rootLogger=ERROR, A1,但这并没有什么不同。

接下来,我尝试创建一个包含单行的.../webapps/ourapp/WEB-INF/classes/log4j.properties文件。

代码语言:javascript
复制
log4j.logger.com.opensymphony.oscache=ERROR

看看这是否能阻止涛动测井。的确如此,但令人惊讶的是(对我来说)它停止了所有不必要的日志记录,而不仅仅是涛动日志记录。所以我评论了这句话,然后再试一次。还是没有什么不想要的伐木。我把文件移到一边,现在不需要的日志记录又回来了。我创建了一个零长度的log4j.properties,所有不想要的日志再次消失(!)虽然这是我想要的短期内容,但它让我想知道还有哪些日志正在被丢弃(以及为什么!)所以我很不愿意仅仅依靠这个。

Tomcat 5.5文档中的“日志”一章仅仅说您可以通过在WEB/classes中放置一个属性文件来完成每个应用程序的配置,但是没有(至少我找不到)谈论它如何与公共/类中指定的配置交互。

所以:

  • ,第三方组件如何首先登录到catalina.out?我猜他们的日志记录可能会冒泡到根记录器,但是为什么即使根日志记录器级别出现错误,为什么仍然日志记录呢?
  • 为什么要在日志记录器上设置记录器级别来启动日志记录呢?我们有自己的伐木者的名字,所以不可能是伐木者的祖先。
  • 为什么一个零长度的weird /classes/log4j.properties文件也会停止大量的日志记录?
  • 如何才能以“正确”的方式来限制日志记录,而不是依赖一些奇怪的(对我来说)副作用来关闭它呢?

越来越好奇。我尝试了马特的建议,打开调试。我还为webapp制作了一个更广泛的log4j.properties文件:

代码语言:javascript
复制
log4j.rootLogger=INFO, SSOA1
log4j.appender.SSOA1=org.apache.log4j.ConsoleAppender
log4j.appender.SSOA1.layout=org.apache.log4j.PatternLayout

# Print the date in ISO 8601 format
log4j.appender.SSOA1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

log4j.logger.com.opensymphony.oscache=ERROR
#log4j.additivity.com.opensymphony.oscache=false

当猫开始的时候我看到了:

代码语言:javascript
复制
log4j: Using URL [file:/srv/www/tomcat5/base/webapps/myapp/WEB-INF/classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/srv/www/tomcat5/base/webapps/myapp/WEB-INF/classes/log4j.properties
log4j: Parsing for [root] with value=[INFO, SSOA1].
log4j: Level token is [INFO].
log4j: Category root set to INFO
log4j: Parsing appender named "SSOA1".
log4j: Parsing layout options for "SSOA1".
log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
log4j: End of parsing for "SSOA1".
log4j: Parsed "SSOA1" options.
log4j: Parsing for [com.opensymphony.oscache] with value=[ERROR].
log4j: Level token is [ERROR].
log4j: Category com.opensymphony.oscache set to ERROR
log4j: Handling log4j.additivity.com.opensymphony.oscache=[null]
log4j: Finished configuring.

但是,尽管涛动记录器的级别设置为错误,我仍然在日志中看到这样的内容:

代码语言:javascript
复制
2011-03-30 14:53:22,076 [main] DEBUG com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache - get called (key=AUDIT_KEY_OLDEST_TIMSTAMP)

如果我是在强迫涛动记录器级别出错( log4j调试输出表明我是错误的),那么为什么要发送此调试消息呢?子记录器在代码中覆盖级别?

我注意到的是,如果我在webapp的log4j.properties文件中取消了涛动记录器的“可加性”行,那么日志记录就真的消失了。因此,示波测井似乎依赖于祖先附加器,而不是它自己的。但是,更奇怪的是,将涛动记录器设置为错误并不能阻止这些事情的发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-30 21:39:36

我已经搞清楚到底怎么回事了。问题是,在webapp的另一部分的核心部分中隐藏了以下代码,这些代码在将组件放入调试模式时运行:

代码语言:javascript
复制
public static synchronized void setDebugOn(boolean debugOn) {
    if (isAllDebugOn() ^ debugOn) {
        setAllDebugOn(debugOn);
        Enumeration en = LogManager.getCurrentLoggers();
        while (en.hasMoreElements()) {
            setDebugOn((Logger) en.nextElement(), debugOn);
        }
        setDebugOn(LogManager.getRootLogger(), debugOn);
    }
}

public static void setDebugOn(String name, boolean debugOn) {
    setDebugOn(getLogger(name), debugOn);
}

private static void setDebugOn(Logger logger, boolean debugOn) {
    logger.setLevel(debugOn ? Level.DEBUG : Level.INFO);
}

换句话说,当这个组件处于调试模式时,它还将WEBAPP中的每个LOG4J记录器都放入调试模式(我已经通过更改代码来验证这一点,以在这三个组件的最后一个方法中打印出每个记录器的名称)。所以,blammo --所有碰巧使用log4j的第三方程序都开始记录它的调试输出,而不管log4j.properties说什么。叹一口气。

当我将该循环的方法更改为只处理与该组件相关的特定记录器级别时,我的log4j.properties配置就开始按预期工作。

票数 2
EN

Stack Overflow用户

发布于 2011-03-29 21:58:46

您可以将log4j.properties配置为只获取下面的代码日志,并将其放在与catalina.out不同的文件中。

处理程序= org.apache.juli.FileHandler

org.apache.juli.FileHandler.level=ALL org.apache.juli.FileHandler.directory=${catalina.base}/logs org.apache.juli.FileHandler.prefix=yourapp-name.

com.yourproject.module.package.level=ALL

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5479304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档