log4j与Grails 3.2.3:我没有得到任何记录

时间:2017-01-12 11:19:46

标签: spring logging grails log4j

我无法让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运行应用程序时,没有创建文件,并且控制台中没有输出,即使我尝试登录并登录失败(当然应该创建一些日志消息,特别是因为日志级别"所有")。

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

我的Grails配置大多数都是YAML(application.yml),只有spring和log4j设置位于单独的application.groovy中。据我所知,Grails将它们合并为一个配置对象。

我的配置中有什么错过?

2 个答案:

答案 0 :(得分:2)

Grails 3.x中使用默认logback进行日志记录。要激活它,您的logback.groovy必须有grails-app/conf。通常它看起来像:

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级别登录到stdout

答案 1 :(得分:0)

您没有提到Log4j的版本,但是,正如您所说的Grails 3.2.3,我猜它是Log4j2。因此,我下面的建议基于Log4j2 manual。根据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

我希望这种解释有助于您解决问题。