【问题标题】:Grails Logging Config IgnoredGrails 日志记录配置被忽略
【发布时间】:2013-03-07 03:33:18
【问题描述】:

Log4j 似乎忽略了我在 Config.groovy 中的一些 Grails 日志记录设置,但没有忽略其他设置。我在 tomcat 上运行 Grails 2.2.1。

我已经设置了我的配置文件(如下)以将所有错误和更高消息记录到控制台(映射到 tomcat 中的 catalina.out),解析、调度和联合包中的所有信息和更高消息到master.log 和所有调试 parse、schedule 和 syndicate 包中的更高消息到它们各自的 parse、schedule 和 syndicate 日志。

附加程序部分中提到的所有文件都在适当的位置创建,并接收日志消息。但是,ma​​ster.log 正在接收调试消息,并且 master.log 和 syndicate.log 的大小都增长到 19GB,而配置明确将它们限制为 25MB。 .

谁能看到我做错了什么? grails 怎么会尊重我的配置中的一行而不是下一行?我的 Config.groovy 文件的相关部分是:

log4j = {
// Uncomment to override the default logging level across all
//   classes.
root {
      warn catalinaOut
}

appenders {
  // this line prevents all messages from being duplicated to stdout DONT DELETE
    console name: "stdout",
            layout: pattern(conversionPattern: "")
    console name: "catalinaOut",
                layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
    file name: "dcsFileAppender",
                file: "logs/data-collection-system/master.log",
                maxFileSize: "25MB",in
                maxBackupIndex: 10,
                layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
    file name: "parseFileAppender",
                file: "logs/data-collection-system/parse.log",
                maxFileSize: "25MB",
                maxBackupIndex: 10,
                layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
    file name: "scheduleFileAppender",
                file: "logs/data-collection-system/schedule.log",
                maxFileSize: "25MB",
                maxBackupIndex: 10,
                layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
    file name: "syndicateFileAppender",
                file: "logs/data-collection-system/syndicate.log",
                maxFileSize: "25MB",
                maxBackupIndex: 10,
                layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
}

environments {
    production {
      info dcsFileAppender: ["com.progauge.icp.parse", "com.progauge.icp.schedule", "com.progauge.icp.syndicate"]
      all parseFileAppender: ["com.progauge.icp.parse"],
        scheduleFileAppender: ["com.progauge.icp.schedule"],
        syndicateFileAppender: ["com.progauge.icp.syndicate"]
    }
}
}

作为旁注,我必须将 stdout 的模式设置为空字符串,因为我不想要标准的控制台日志记录行为,但是将 appender 设置为 null 会破坏我的自定义控制台日志记录,这也是我不想要的.

【问题讨论】:

    标签: tomcat grails logging log4j


    【解决方案1】:

    到目前为止,我发现您的配置存在三个主要问题:

    • 设置日志级别每个记录器 - 如果你想从同一个记录器发送不同级别的消息到不同的附加器,那么你需要将记录器设置为最详细的级别,然后设置一个 阈值在相关的附加程序上过滤掉日志级别太细的消息。
    • 如果您想限制文件大小并进行备份,那么您应该使用rollingFile 类型的附加程序而不是file
    • 要抑制默认的stdout appender,您应该使用'null'(这是与null 值相反的四个字符串null,并定义了一个Log4J NullAppender,一个忽略写入的任何日志消息的接收器给它)。

    试试这样的:

    log4j = {
      // Uncomment to override the default logging level across all
      // classes.
      root {
          warn 'catalinaOut'
      }
    
      appenders {
        // this line prevents all messages from being duplicated to stdout
        'null' name: "stdout"
    
        console name: "catalinaOut",
                    layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
    
        // threshold to make this appender only log INFO and higher messages
        rollingFile name: "dcsFileAppender",
                    file: "logs/data-collection-system/master.log",
                    maxFileSize: "25MB",
                    maxBackupIndex: 10,
                    layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n"),
                    threshold: org.apache.log4j.Level.INFO
    
        rollingFile name: "parseFileAppender",
                    file: "logs/data-collection-system/parse.log",
                    maxFileSize: "25MB",
                    maxBackupIndex: 10,
                    layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
        rollingFile name: "scheduleFileAppender",
                    file: "logs/data-collection-system/schedule.log",
                    maxFileSize: "25MB",
                    maxBackupIndex: 10,
                    layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
        rollingFile name: "syndicateFileAppender",
                    file: "logs/data-collection-system/syndicate.log",
                    maxFileSize: "25MB",
                    maxBackupIndex: 10,
                    layout: pattern(conversionPattern: "%-5p [%d] %c{2} %m%n")
      }
    
      environments {
        production {
          all parseFileAppender: ["com.progauge.icp.parse"],
            scheduleFileAppender: ["com.progauge.icp.schedule"],
            syndicateFileAppender: ["com.progauge.icp.syndicate"],
            dcsFileAppender: ["com.progauge.icp.parse", "com.progauge.icp.schedule", "com.progauge.icp.syndicate"]
        }
      }
    }
    

    【讨论】:

    • 嗯,对 stdout 的更改杀死了所有到控制台的日志记录,但其他两个建议有效,而这正是我所关心的。谢谢。
    • @therealmitchconnors 而不是尝试完全抑制默认的 stdout 附加程序并在其位置创建另一个控制台附加程序,只是说 console name:'stdout', layout:... 并使用 stdout 而不是 catalinaOut 会更简单
    • 问题是,当我这样做时,我会得到两个进入控制台的每条日志消息的实例:一个通过我配置的记录器,另一个通过 grails 的隐式默认记录器。
    • 如果您使用 grails 版本 1.3.7 以避免 Tomcat 将日志记录复制到标准输出记录器,则必须删除 console 附加程序。 log4j { r -> r.removeAppender('console') }
    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多