log4j 在Grails中使用文件追加器和stdout进行日志记录配置

35g0bw71  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(193)

我的Grails应用程序中有一个配置错误,导致我的appender将输出发送到错误的位置,或者根本不发送输出。似乎有很多关于重复日志记录的问题,但我无法将任何答案应用到我的情况。
下面是我的日志配置片段:

log4j = {

        appenders {
                // appender for usage tracking
                appender new org.apache.log4j.RollingFileAppender(
                        name:"usageAppender",
                        maxFileSize:"1000KB",
                        maxBackupIndex: 10000,
                        file: "/var/log/tomcat6/app/usage.log",
                        layout:pattern(conversionPattern: '%d{DATE} %5p %c{1}:%L - %m%n')
                )
                appender new org.apache.log4j.RollingFileAppender(
                        name:"application",
                        maxFileSize:"1000KB",
                        maxBackupIndex: 10000,
                        file:"/var/log/tomcat6/app/application.log",
                        layout:pattern(conversionPattern: '%d{DATE} %8X{memoryused} %5p %t %c{1}:%L %X{username} %X{request} - %m%n')
                )
                console name:'stdout', layout:pattern(conversionPattern: '%d{DATE} %8X{memoryused} %5p %t %c{1}:%L %X{username} %X{request} - %m%n')
        }
        root {
                // also tried error 'stdout'
                error  'application'
        }

        error  'org.codehaus.groovy.grails.web.servlet',  //  controllers
                   'org.codehaus.groovy.grails.web.pages', //  GSP
                   'org.codehaus.groovy.grails.web.sitemesh', //  layouts
                   'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
                   'org.codehaus.groovy.grails.web.mapping', // URL mapping
                   'org.codehaus.groovy.grails.commons', // core / classloading
                   'org.codehaus.groovy.grails.plugins', // plugins
                   'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
                   'org.springframework',
                   'org.hibernate'

        info 'usageAppender':'usage.gui'
}

当我的程序运行时,输出出现在catalina.outusage.logapplication.log中。直接发送到stdout(绕过log4j)的输出出现在 Catalina .out中。
如果我设置

info additivity: false 'usageAppender': 'usage.gui'

然后,两个文件附加器都不记录任何内容,但stdout仍然进入 Catalina .out(绕过log4j)。
我希望'usage.gui'记录器的输出转到usage.log文件,所有其他日志记录的输出转到application.log文件,所有print语句输出转到catalina.out。我不希望有冗余的日志记录。我该如何配置?

  • UPDATE* 作为对@dmahapatro问题的回答,可以使用标准的grails日志记录来完成应用程序的日志记录
log.trace('some event');

或者使用如下创建的自定义记录器:

def usageLog
public UsageService() {
    usageLog = Logger.getLogger("usage.gui")
}

并通过调用以下函数来使用:

protected void writeRecord(String topicId, String user, Long id, Long priorId, Long clientTime, String component, String action, String otherData) {
    String msg = "$topicId\t$user\t$id\t$priorId\t$clientTime\t$component\t$action\t$otherData"
    usageLog.info(msg)
}
8hhllhi2

8hhllhi21#

请尝试此设置。

  • stdout保留在根目录(如果需要,请将级别更改为info/debug/all)。将添加性设置为false,以限制控制台日志添加到usageapplication附加器。
  • 其他附加器继承自root,将applicationusage设置为additivityfalse以限制控制台日志记录。
  • 针对application使用grails.app,以记录application.log中的所有应用程序相关日志。

如:

root {
         error 'stdout'
         additivity: false
     }

info usageAppender: 'usage.gui'
        additivity: false

info application: 'grails.app'
       additivity: false

注:-
不同日志记录级别的日志将不适用于相同的程序包结构。例如:

info usageAppender: 'usage.gui'
error usageAppender1: 'usage.gui'

将仅记录usage.guierror

pvcm50d1

pvcm50d12#

大多数时候你看不到src/groovy的日志打印,因为在应用程序中设置了更高级别的错误。所以如果你把所有类的日志设置为调试级别,那么日志调试就可以工作了。

相关问题