【问题标题】:Grails log4j appender configuration seemingly ignoredGrails log4j appender 配置似乎被忽略了
【发布时间】:2013-09-12 04:17:43
【问题描述】:

我正在尝试自定义我的 Grails 应用程序的日志记录配置,但附加程序(及其布局模式)似乎被忽略了。

在 Config.groovy 中:

log4j = {
appenders {
    console name: 'stdout', layout: pattern(conversionPattern: '%c{2} %m%n')
    file name: 'fileLogger', file: 'application.log', layout: pattern(conversionPattern: '%d{dd-MM-yyyy HH:mm:ss,SSS} %5p %c{1} - %m%n')
}

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',
       'net.sf.ehcache.hibernate'

info   'grails.app'
debug  'org.hibernate.SQL'
trace  'org.hibernate.type'
}

Log4J 实际考虑了记录器部分(例如,如果我为 hibernate 注释调试和跟踪行,那么 Hibernate 语句的记录将按预期停止)。

但我一直在尝试不同版本的 appenders 部分,但似乎都没有考虑,实际上应用于控制台的格式仅包含消息本身(例如,如果我写了

log.info("test")

在代码中我会得到

test

在控制台中,日志文件中没有任何内容。

我在该部分添加了“debug=true”,并将“org.apache.log4j”设置为跟踪,但它似乎没有任何改变。

这可能是一些微不足道的事情,但我无法弄清楚。 :/

我正在使用 Grails 2.3.0RC2。


所以我按照 Alidad 的建议做了,并将我的配置切换为:

log4j = {
appenders {
    console name: 'stdout', layout: pattern(conversionPattern: '%d{yyyy-MM-dd HH:mm:ss,SSS Z} [%t] %-5p %c{1}:%L %x - %m%n')
}

root {
    info 'stdout'
}

error  stdout:
       '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',
       'net.sf.ehcache.hibernate'

info   stdout:
       'grails.app'
}

然而,虽然这是一个改进(我的布局没有被忽略),但它也会导致所有内容都被记录两次:

2013-09-08 18:00:19,447 +0100 [localhost-startStop-1] INFO  BootStrap:152  - Init completed
Init completed
2013-09-08 18:00:19,641 +0100 [localhost-startStop-1] INFO  NimbleBootStrap:152  - Creating default user account with username:user
Creating default user account with username:user

实际上,即使我将“根”部分注释掉,也会发生这种情况。

【问题讨论】:

  • 谢谢你 - 从你的代码我拼凑了这个简单的配置。所以(在开发时)我可以将我的整个调试输出重新路由到一个文件:log4j = { appenders { // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n') file name: 'stdout', file: 'pathToLog/logFile.log', layout:pattern(conversionPattern: '%c{2} %m%n') }

标签: grails logging log4j


【解决方案1】:

尝试将附加程序应用到您的信息级别

   log4j = {
     ...
     root{
       info  'stdout'
     }
    ...
   }

我认为您缺少的是记录器不知道将消息发送到哪里。

一般你可以这样做

error myAppender:      "grails.app.controllers.BookController",
      myFileAppender:  ["grails.app.controllers.BookController",
                        "grails.app.services.BookService"],
      rollingFile:     "grails.app.controllers.BookController"

或在所有级别的根级别定义它。看看Documentation 4.1.2 日志记录


log4j = {
appenders {
    console name: 'stdout', layout: pattern(conversionPattern: '%d{yyyy-MM-dd HH:mm:ss,SSS Z} [%t] %-5p %c{1}:%L %x - %m%n')
}


error  stdout:
       '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',
       'net.sf.ehcache.hibernate'

info   stdout:
       'grails.app' , additivity: false
}

【讨论】:

  • 谢谢,这种帮助是因为我的配置不会被忽略,但会导致所有内容都输出两次。请参见上文。
  • @JohnMurdoch 我更新了我的答案,尝试使用 additivity:false。 “可加性只是确定记录器是否从其父级继承配置。”(doc)
  • 我仍然不太明白为什么在这种情况下可加性会有所帮助(因为你添加的记录的父级是谁?),但无论你粘贴什么实际上都是我想要的,所以我m 将问题标记为已回答。谢谢!
  • @JohnMurdoch 因为stdout 默认设置为根记录器,即使它是在您的情况下明确设置的。将additivity 设置为false,使您的自定义appender 不会从根记录器继承。这是我最近在回答时偶然发现的something
猜你喜欢
  • 2021-10-28
  • 2016-09-30
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2012-03-08
相关资源
最近更新 更多