Grails - 不登录 Tomcat

Posted

技术标签:

【中文标题】Grails - 不登录 Tomcat【英文标题】:Grails - No Logging In Tomcat 【发布时间】:2011-10-11 04:02:30 【问题描述】:

我无法让 grails log4j 日志记录在 Tomcat6 中工作。我previously thought 的问题与生产模式有关,但现在我相信问题是 tomcat。

我的 Config.groovy 中有一个 log4j 配置,当我在 STS 中运行应用程序时,它可以正确设置日志记录。我正在使用精彩的 app-info 插件,它确认正在设置正确的日志记录值。

但是,当我使用相同的代码执行 grails war 甚至 grails dev war 并将其插入 Tomcat 中的 webapps 文件夹时,不会发生日志记录。当我现在查看应用程序信息以进行日志记录时,我得到了一个基本的 log4j.xml,它在我的配置中没有任何内容。另外,当我查看 catalina.out 时,我看到:

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

为了完整起见,这里是在 STS 中正常工作的配置,但在直接在 Tomcat 中运行时却没有:

log4j = 
    String logDirectory = "$System.getProperty('catalina.base') ?: '.'/logs"

    appenders 
        console name: "stdout", layout: pattern(conversionPattern: "%dyyyy-MMM-dd HH:mm:ss,SSS [%t] %c %x%n %-5p %m%n")
        file name: "errors", file: "pps-errors.log", layout: pattern(conversionPattern: "%dyyyy-MMM-dd HH:mm:ss,SSS [%t] %c %x%n %-5p %m%n")
        appender new org.apache.log4j.DailyRollingFileAppender(name:"roll", datePattern: "'.'yyyy-MM-dd", file:"pps-rolling.log", layout: pattern(conversionPattern: "%dyyyy-MMM-dd HH:mm:ss,SSS [%t] %c %x%n %-5p %m%n"))
    


    root  info "stdout", "roll", "errors" 
    // Log all at the error level
    info 'org.apache.',
    'org.tomcat.',
    'grails.app',
    'org.acegisecurity',
    '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'
    warn 'grails.app'

这是在 STS 中运行时的 app-info 日志记录输出:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE log4j:configuration SYSTEM 'log4j.dtd'>

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
   <appender name="stacktraceLog" class="org.apache.log4j.FileAppender">
      <param name="file" value="/home/devon/Documents/SynaSync/Projects/ProjectPointSpread/Source/trunk/target/stacktrace.log"/>
      <param name="name" value="stacktraceLog"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="conversionPattern" value="%d [%t] %-5p %c2 %x - %m%n"/>
      </layout>
   </appender>
   <appender name="roll" class="org.apache.log4j.DailyRollingFileAppender">
      <param name="file" value="pps-rolling.log"/>
      <param name="name" value="roll"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="conversionPattern" value="%dyyyy-MMM-dd HH:mm:ss,SSS [%t] %c %x%n %-5p %m%n"/>
      </layout>
   </appender>
   <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
      <param name="name" value="stdout"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="conversionPattern" value="%dyyyy-MMM-dd HH:mm:ss,SSS [%t] %c %x%n %-5p %m%n"/>
      </layout>
   </appender>
   <appender name="errors" class="org.apache.log4j.FileAppender">
      <param name="file" value="pps-errors.log"/>
      <param name="name" value="errors"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="conversionPattern" value="%dyyyy-MMM-dd HH:mm:ss,SSS [%t] %c %x%n %-5p %m%n"/>
      </layout>
   </appender>
   <logger name="StackTrace" additivity="false">
      <appender-ref ref="stacktraceLog"/>
   </logger>
   <logger name="grails.app">
      <level value="WARN"/>
   </logger>
   <logger name="org.acegisecurity">
      <level value="INFO"/>
   </logger>
   <logger name="org.apache.">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.commons">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.orm.hibernate">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.plugins">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.web.mapping">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.web.mapping.filter">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.web.pages">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.web.servlet">
      <level value="INFO"/>
   </logger>
   <logger name="org.codehaus.groovy.grails.web.sitemesh">
      <level value="INFO"/>
   </logger>
   <logger name="org.hibernate">
      <level value="INFO"/>
   </logger>
   <logger name="org.springframework">
      <level value="INFO"/>
   </logger>
   <logger name="org.tomcat.">
      <level value="INFO"/>
   </logger>
   <root>
      <level value="INFO"/>
      <appender-ref ref="stdout"/>
      <appender-ref ref="roll"/>
      <appender-ref ref="errors"/>
   </root>
</log4j:configuration>

这是直接在 tomcat6 中运行时的 app-info 日志输出:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE log4j:configuration SYSTEM 'log4j.dtd'>

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
   <logger name="Test">
      <level value="ALL"/>
   </logger>
   <root>
      <level value="DEBUG"/>
   </root>
</log4j:configuration>

如果有帮助,我正在使用 Grails 1.3.7。

【问题讨论】:

你找到解决方案了吗?!很好奇! 我只是在我的 tomcat 6.0.32 中进行了相同的测试,并且从 run-app 获得了相同的 log4j 输出!你可以在一个空/新项目中模拟同样的事情吗?或者这只是发生在你的项目中?! @Arthur Neves - 啊哈!我确实在默认应用程序上获得了文件。我的应用程序怎么会发生重大变化,以至于无法运行? 【参考方案1】:

这可能是您在 DSL 配置中定义环境的方式 我有类似的设置:Grails 1.3.7 + Tomcat 6.0 这对我很有用。

log4j = 
    environments 
        production 
        appenders 
            def catalinaBase = System.properties.getProperty('catalina.base')
            if (!catalinaBase) catalinaBase = '.'
            def logDirectory = "$catalinaBase/logs"

            /* log file appender config & layout */
            appender new DailyRollingFileAppender(
                name:"logfile",
                file:"$logDirectory/logfilename.log",
                layout:pattern(conversionPattern: "%dyy.MM.dd HH:mm:ss [%t] %-5p %c %x - %m%n"),
                datePattern:"'.'yyyy-MM-dd",
                threshold: org.apache.log4j.Level.ERROR 
        

        /* type of errors to log */
        error  'org.codehaus.groovy.grails.scaffolding.view.ScaffoldingViewResolver', 
               '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', // class
               'org.codehaus.groovy.grails.plugins', // plugins
               'org.codehaus.groovy.grails.orm.hibernate', // hibernate
               'org.springframework', // spring
               'org.hibernate', // hibernate



        /* jetty, not required on tomcat */
        warn   'org.mortbay.log'


        /* root logger config */
        root 
            debug 'logfile'
            additivity = true
        
    //production

    development
         /* add config for development evn*/
    

    test
         /* add config for test env*/
     

//log4j

【讨论】:

上面的sn-p来自哪个文件? 它在配置文件中:config.groovy【参考方案2】:

这与很久以前存在的虚假 web-inf 文件有关。当它不存在时,它可以正常工作。

【讨论】:

以上是关于Grails - 不登录 Tomcat的主要内容,如果未能解决你的问题,请参考以下文章

Grails:如何获取当前登录用户的用户名,这需要啥导入?

Grails Acegi 手动登录

Grails Spring Security 插件 - 修改登录用户的权限

Grails 3 Spring Security 覆盖登录表单

无法使用 grails 通过 CAS 单点登录登录

使用 Grails 创建 Google 登录