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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j与Grails 3.2.3:我没有得到任何记录相关的知识,希望对你有一定的参考价值。

我无法让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将它们合并为一个配置对象。

我的配置错过了什么?

答案

默认情况下,logback在Grails 3.x中用于记录。为了激活它,你必须在你的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

另一答案

你没有提到Log4j的版本,但是,我想这是Log4j2正如你所说的Grails 3.2.3。因此,我在下面的建议是基于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

我希望这个解释有助于澄清你的问题。

以上是关于log4j与Grails 3.2.3:我没有得到任何记录的主要内容,如果未能解决你的问题,请参考以下文章

Grails 应用程序中的 Log4J 问题,它依赖于 comons-logging

Grails - 如何从 WAR 中删除 log4j

缺少 Grails 弹簧安全插件插件?

我们如何将更高版本的 Log4j 设置为 grails 应用程序

如何在 grails 中禁用 log4j 插件?

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