【问题标题】:Production settings file for log4j?log4j 的生产设置文件?
【发布时间】:2011-04-02 01:25:45
【问题描述】:

这是我当前的 log4j 设置文件。这些设置是否适合生产使用,或者我应该删除/调整或更改某些内容吗?我问是因为我的所有线程都因为 log4j 阻塞而被挂起。我检查了我只使用 113 的打开文件描述符。

# ***** Set root logger level to WARN and its two appenders to stdout and R.
log4j.rootLogger=warn, stdout, R

# ***** stdout is set to be a ConsoleAppender.
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# ***** stdout uses PatternLayout.
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# ***** Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

# ***** R is set to be a RollingFileAppender.
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=logs/myapp.log
# ***** Max file size is set to 100KB
log4j.appender.R.MaxFileSize=102400KB
# ***** Keep one backup file
log4j.appender.R.MaxBackupIndex=5
# ***** R uses PatternLayout.
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %d %c - %m%n


#set httpclient debug levels
log4j.logger.org.apache.component=ERROR,stdout 
log4j.logger.httpclient.wire=ERROR,stdout 
log4j.logger.org.apache.commons.httpclient=ERROR,stdout 
log4j.logger.org.apache.http.client.protocol=ERROR,stdout

更新*** 从我的所有线程中添加线程转储示例 (100)

"pool-1-thread-5" - Thread t@25
   java.lang.Thread.State: BLOCKED on org.apache.log4j.spi.RootLogger@1d45a585 owned by: pool-1-thread-35
    at org.apache.log4j.Category.callAppenders(Category.java:201)
    at org.apache.log4j.Category.forcedLog(Category.java:388)
    at org.apache.log4j.Category.error(Category.java:302)

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    toString() 产生嵌套日志时,Log4j 1.2 容易受到deadlocks 的攻击。

    查看诸如 Log4J can create deadlock conditions (concurrent package donation)Deadlock with RollingFileAppender 之类的老年仍未解决的问题。

    在并发负载较重的情况下,它还存在性能扼杀的锁同步问题。 喜欢Category callAppenders synchronization causes java.lang.Thread.State: BLOCKEDMove org.apache.log4j.Category to reentrant read/write locks

    即使AsyncAppender 也不是没有过多的锁: AsyncAppender.doAppend() does not need to be synchronizedDeadlock in 1.2.15 caused by AsyncAppender and ThrowableInformation classes。还要提防AsyncAppender overflow

    一个警告是始终将根类别级别限制为至少 INFO 或更高。这将防止记录调用获取上述问题中提到的不必要的锁。仅仅限制 appender 阈值是不够的,因为稍后会考虑到它。见explanation with publish/subscribe analogy

    要回答您关于阈值如何与类别相互作用的问题, 基本上认为它是一个发布/订阅。类别集 记录器发布的内容,阈值设置订阅 appender 的级别。

    如果需要,可以单独为嵌套的兴趣类别赋予较低的优先级。

    【讨论】:

      【解决方案2】:

      您是否使用标准 private static final Logger logger = Logger.getLogger(Foo.class); 为每个类创建一个 Logger,其中 Foo 是声明记录器的类?如果您的整个应用程序中只有 1 个 Logger 实例,那么如果有大量日志记录,则可能会发生争用。

      【讨论】:

        【解决方案3】:

        %F:%L 对性能有严重影响。虽然我看不出它们会如何导致锁定,但我会考虑在生产环境中忽略它们。

        【讨论】:

        • 同意。相反,使用调试信息编译您的代码,当错误发生时,您将在堆栈跟踪中获得行号。
        【解决方案4】:

        这看起来很正常。我看不出这本身是如何导致 log4j 阻塞的。也许您可以发布您的问题的线程转储?

        【讨论】:

          猜你喜欢
          • 2015-09-22
          • 2020-04-12
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-19
          相关资源
          最近更新 更多