Tomcat“Log4J”上的 Grails WAR 根本不起作用

Posted

技术标签:

【中文标题】Tomcat“Log4J”上的 Grails WAR 根本不起作用【英文标题】:Grails WAR on Tomcat "Log4J" not working at all 【发布时间】:2011-01-16 18:43:43 【问题描述】:

我在 grails 应用程序的 Config.groovy 中正确配置了 log4j DSL。使用 grails run-app 运行应用程序会转储完美的日志记录,正如我在 DSL 中指定的那样。然而,在进行 grails 战争以生成战争文件并将其部署到 tomcat 之后,日志记录就消失了。我在任何地方都看不到它工作,除了 tomcat 控制台在调试级别显示数百万条日志语句并且没有任何特定于我登录日志文件的内容。


log4j = 
        appenders 
                 appender new org.apache.log4j.DailyRollingFileAppender(name: "tomcatLog", datePattern: "'.'yyyy-MM-dd", file: "$logDirectory/snm.log".toString(), layout: pattern(conversionPattern: '[%dyyyy-MM-dd hh:mm:ss.SSS] %p %c5 %m%n'))
        
        root 
            info 'stdout', 'tomcatLog'
            additivity = true
        
        info    'grails.app',
                'grails.app.controller',
                'grails.app.bootstrap',
                'grails.app.service',
                'grails.app.task',
                'commons',
                'jsontwitter'
    

你能解释一下上面的DSL吗?它将 commons.* 和 jsontwitter.* classes 日志发送到指定的日志文件但没有控制器,服务日志保存在文件中。

谢谢, 阿拉姆·谢尔

【问题讨论】:

【参考方案1】:

你需要知道,tomcat 使用什么日志目录。这是由 grails-app/conf/Config.groovy 的以下 sn-p 完成的:

def catalinaBase = System.properties.getProperty('catalina.base')
if (!catalinaBase) catalinaBase = '.'   // just in case
def logDirectory = "$catalinaBase/logs"

// default for all environments
log4j =  root ->
     appenders 
             rollingFile name:'stdout', file:"$logDirectory/$appName.log".toString(), maxFileSize:'100KB'
             rollingFile name:'stacktrace', file:"$logDirectory/$appName_stack.log".toString(), maxFileSize:'100KB'
    

    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'
    root.level = org.apache.log4j.Level.WARN


// special settings with production env
environments 
    development 
        log4j =  root ->
            appenders 
                       console name: 'stdout', layout: pattern(conversionPattern: "%d [%t] %-5p %c %x - %m%n")
            
            warn       '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'
            debug  'com.netjay'
            root.level = org.apache.log4j.Level.INFO
        
    

【讨论】:

这会为我记录日志。但是当我更新了这个问题时,您能否看看我为我的日志记录指定的 DSL,并告诉我这可能有什么问题,因为除了源之外,来自服务、域、控制器的日志都不会发送到指定的附加程序包,例如公地和 json 推特。同样在 catalina.out 中,所有内容都被附加了,但也有大量的 DEBUG 级别日志记录:(所以这对我来说有点令人困惑。 我认为你的 DSL 中的包定义是错误的。您需要删除前缀“grails.app”。因此,如果您的域类位于包 com.mycompany.abc.MyCoolDomainClass 中,则必须在 DSL 中使用 com.mycompany.abc。如果您尚未在域类、控制器等中使用包,建议始终使用包,并且永远不要将任何东西放在根包中。【参考方案2】:

jira 上还有一个错误:http://jira.codehaus.org/browse/GRAILS-5666:Run-war 有一些类路径冲突。

Marc Palmer 说:在使用定义继承“全局”的 deps 的插件的应用程序中,日志记录被杀死

【讨论】:

以上是关于Tomcat“Log4J”上的 Grails WAR 根本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 不登录 Tomcat

Tomcat 上的多个 Grails 应用程序

Grails 应用程序 - Tomcat 与 Weblogic 上的 JNDI

为啥 Grails(在 Tomcat 中)同时记录到 catalina.out 和我的自定义文件附加程序?

MySQL 连接超时问题 - 使用 Hibernate 和 ORM 的 Tomcat 上的 Grails 应用程序

在tomcat上的grails spring security中登录用户的会话