【问题标题】:log4j with Grails 3.2.3: I don't get any logging带有 Grails 3.2.3 的 log4j:我没有得到任何日志记录
【发布时间】:2017-01-12 11:19:45
【问题描述】:

我无法让 log4j 在使用 Grails 3.2.3 的项目中工作。 我的目标是获取 spring 安全插件的详细日志,因为我遇到了一些问题并想知道发生了什么(尽管我提供了正确的凭据,但我无法登录)。

我在grails-app/conf/application.groovy 中添加了以下几行:

log4j = {
    all 'org.springframework'
        'org.grails.plugins:spring-security-core'
    debug 'grails.app'

    appenders {
        file name: 'file', file:'logs/logging.log'
    }

    root {
        all 'stdout', 'file'
    }
}

但是当我在交互模式下使用grails run-apprun-app 运行应用程序时,不会创建文件,并且控制台中没有输出,即使我尝试登录并且登录失败(这应该当然会创建一些日志消息,尤其是因为日志级别为“all”)。

我不是log4j 的专家。我以前从未使用过它。 我阅读了一些教程和文档,但它们都与普通的 java 程序有关,而不是 Grails。

我的大部分 Grails 配置都在 YAML (application.yml) 中,只有 spring 和 log4j 设置在单独的 application.groovy 中。据我了解,Grails 将它们合并为一个配置对象。

我的配置中缺少什么?

【问题讨论】:

    标签: spring logging grails log4j


    【解决方案1】:

    默认情况下,logback 在 Grails 3.x 中用于日志记录。为了激活它,您的grails-app/conf 中必须有一个logback.groovy。通常它看起来像:

    import grails.util.BuildSettings
    import grails.util.Environment
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.FileAppender
    
    // See http://logback.qos.ch/manual/groovy.html for details on configuration
    appender( 'STDOUT', ConsoleAppender ) {
      encoder( PatternLayoutEncoder ){ pattern = '%d{HH:mm:ss.SSS} [%thread] %level %logger{36} - %msg%n' }
    }
    
    root INFO, ['STDOUT']
    
    logger 'org.springframework.security.web.authentication.rememberme', DEBUG
    
    def targetDir = BuildSettings.TARGET_DIR
    if( Environment.developmentMode && targetDir ){
      appender( 'FULL_STACKTRACE', FileAppender ){
        file = "${targetDir}/stacktrace.log"
        append = true
        encoder( PatternLayoutEncoder ){ pattern = '%d{HH:mm:ss.SSS} [%thread] %level %logger{36} - %msg%n' }
      }
      logger 'StackTrace', ERROR, ['FULL_STACKTRACE'], false
    }
    

    这里 Spring Sec 的 rememberme 服务以 DEBUG 级别记录到标准输出

    【讨论】:

    • 非常感谢!出于某种原因,我错过了 Grails 文档中的这些信息。现在日志已创建。仍然需要进行一些微调,但多亏了你,它才能奏效。
    【解决方案2】:

    您没有提到Log4j 的版本,但是,我猜它是Log4j2,正如您所说的Grails 3.2.3。因此,我下面的建议是基于Log4j2manual。根据 Log4j2 手册,您必须在项目类路径中有一个配置文件。类路径可以是src/main/groovy/resourcesgrails-app/conf。配置文件可以是{xml|json|yaml},如手册中所述。

    以下是适用于我的项目的配置文件的非常简单的内容。

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="INFO">
        <Properties>
            <Property name="baseDir">logs</Property>
        </Properties>
        <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout
                        pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
            </Console>
            <RollingFile name="RollingFile" fileName="${baseDir}/app.log"
                         filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd}.log.gz"
                         filePermissions="rw-------">
                <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
                <CronTriggeringPolicy schedule="0 0 0 * * ?"/>
                <DefaultRolloverStrategy stopCustomActionsOnError="true">
                    <PosixViewAttribute basePath="${baseDir}/$${date:yyyy-MM}" filePermissions="r--r--r--">
                        <IfFileName glob="*.gz" />
                    </PosixViewAttribute>
                </DefaultRolloverStrategy>
            </RollingFile>
        </Appenders>
        <Loggers>
            <Root level="debug" additivity="false">
                <AppenderRef ref="RollingFile" />
                <AppenderRef ref="Console" />
            </Root>
        </Loggers>
    </Configuration>
    

    另外,这个社区有一个question,我认为您可能需要以防万一。该问题试图详细说明如何在 Grails 3 中配置 log4j2

    我希望这个解释能帮助您解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 2018-11-16
      • 2015-08-30
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多