首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

精通 Grails 在企业中使用 Grails(3)

精通 Grails 在企业中使用 Grails(3)

通过 Grails 使用 log4j打开 grails-app/conf/Config.groovy 查看 log4j 设置(如清单 6 所示):
清单 6. Config.groovy 中的 log4j 设置
1
2
3
4
5
6
log4j {
   appender.stdout = "org.apache.log4j.ConsoleAppender"
   appender.'stdout.layout'="org.apache.log4j.PatternLayout"
   appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'
   // and so on...
}




启动 Grails 应用程序时,命令提示符上出现的大多数消息是 log4j 消息。这要归功于 org.apache.log4j.ConsoleAppender(更多关于 log4j 的基础知识,请参阅 )。
注册 log4j MBean如果需要在没有 JMX 的情况下调整 Grails 的登录设置,只需简单地编辑这个文件并重新启动服务器,但如果更愿意调整这些设置而不重新启动服务器,或者想远程调整它们,那应该怎样做呢?这看起来似乎是 JMX 可选的完美方法。幸运的是,log4j 附带一个方便执行这些任务 MBean。您所需做的只是注册 log4j MBean。
将 entry的 XML(如清单 7 所示)添加到 resources.xml。这将把 log4j MBean 注入到 MBean 服务器。
清单 7. 将 MBean 注入到 MBean 服务器
1
2
3
4
5
6
7
8
9
10
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter">   
<property name="server" ref="mbeanServer"/>
<property name="beans">
   <map>
     <entry key="log4j:hierarchy=default">
       <bean class="org.apache.log4j.jmx.HierarchyDynamicMBean"/>
     </entry>        
   </map>
</property>
</bean>




重新启动 Grails,然后重新启动 JConsole。如果连接到端口 9004上的 localhost,新的 log4j MBean 应该显示在 MBeans 选项卡中。展开 log4j 树元素,单击默认值,然后单击 Info 选项卡。从刚添加到 resources.xml(参见图 5)的条目中,可以看到配置片段:
图 6. 查看默认 MBean 信息现在可以通过 JMX 看到 log4j 了,下一步是调整一些登录设置。
动态更改 log4j 设置假设现在 Grails 应用程序表现异常。您应该查找问题的根源。查看 grails-app/conf/Config.groovy,您会发现根登录程序将它的输出发送到控制台,但过滤器被设置为 error—rootLogger="error,stdout"。您希望将登录级别更改为 trace来提高控制台的输出量。
看一下 JConsole。在 log4j 文件夹下,您应该可以看到根 MBean。可以看到优先级属性被设置为 ERROR,就像在 Config.groovy 中一样。双击 ERROR值并输入 TRACE,如图 6 所示:
图 7. 将根登录程序优先级从 ERROR更改为 TRACE为了验证控制台比以前更好用,在浏览器中,在 Grails 应用程序的主页上单击到 AirportMappingController的链接。在大量新的输出中,您应该可以找到一些有关 Grails 如何导入初始列表的详细信息。请参阅清单 8 中的样例:
清单 8. 增加 log4j 输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[11277653] metaclass.RedirectDynamicMethod
Dynamic method [redirect] looking up URL mapping for
controller [airportMapping] and action
    and
    params [["action":"index", "controller":"airportMapping"]]
    with [URL Mappings
    ------------
    org.codehaus.groovy.grails.web.mapping.ResponseCodeUrlMapping@1bab0b
    /rest/airport/(*)?
    /(*)/(*)?/(*)?
    ]
    [11277653] metaclass.RedirectDynamicMethod Dynamic method
    [redirect] mapped to URL [/trip/airportMapping/list]
    [11277653] metaclass.RedirectDynamicMethod Dynamic method
    [redirect] forwarding request to [/trip/airportMapping/list]
    [11277653] metaclass.RedirectDynamicMethod Executing redirect
    with response
    [com.opensymphony.module.sitemesh.filter.PageResponseWrapper@19243f]




什么时候可以安全忽略 ?如果您曾经运行过 Grails 1.0.3,可能会注意到一条频繁出现在控制台输出中的奇怪错误 —[Fatal Error] :-1:-1: Premature end of file。大多数人仅仅是忽略它,因为它似乎真的不会引起任何错误(不管致命与否)。
如果将登录级别转变为 trace,您就会看到有关致命错误的详细信息:converters.XMLParsingParameterCreationListener Error parsing incoming XML request: Error parsing XML。
正如大量冗长的日志输出所解释的那样,Grails 试图解析每个传入请求,把请求当作 XML。大多数请求不是 XML,因此请求处理程序将根据实际情况报告错误,但仍然会正确地处理请求。
这个 “谎报军情的小 bug” 在版本 1.0.4 中得到了修复。

更改 log4j ConversionPattern现在需要更改输出模式。在 Config.groovy 中,使用下面这一行设置模式:appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'。查看 log4j 文档,您决定将它设置为更具描述性的东西。
单击 JConsole 中的 stdoutMBean。将 conversionPattern属性从它的原始值更改为 [%5p] %d{hh:mm:ss} (%F:%M:%L)%n%m%n%n。生成一些新的日志输出后,我将描述这些奇怪的符号的含义(请参阅 ,了解设置 conversionPattern的更多信息)。
图 8. 在 PatternLayout中更改 conversionPattern现在再次在 Web 浏览器中单击主页链接和 AirportMappingController链接。输出的格式发生了很大变化,如清单 9 所示:
清单 9. 使用新的 conversionPattern的控制台输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[DEBUG] 09:04:47 (RedirectDynamicMethod.java:invoke:127)
Dynamic method [redirect] looking up URL mapping for controller
[airportMapping] and action
    and params
    [["action":"index", "controller":"airportMapping"]] with [URL Mappings
    ------------
    org.codehaus.groovy.grails.web.mapping.ResponseCodeUrlMapping@e73cb7
    /rest/airport/(*)?
    /(*)/(*)?/(*)?
    ]

    [DEBUG] 09:04:47 (RedirectDynamicMethod.java:invoke:144)
    Dynamic method [redirect] mapped to URL [/trip/airportMapping/list]

    [DEBUG] 09:04:47 (RedirectDynamicMethod.java:redirectResponse:162)
    Dynamic method [redirect] forwarding request to [/trip/airportMapping/list]

    [DEBUG] 09:04:47 (RedirectDynamicMethod.java:redirectResponse:168)
    Executing redirect with response
      [com.opensymphony.module.sitemesh.filter.PageResponseWrapper@47b2e7]




现在您可以看到输出,以下是详细过程:%p写出优先级别。这些消息很明显是 DEBUG级别。%d{hh:mm:ss}以小时:分钟:秒的格式显示日期戳。(%F:%M:%L)将文件名、方法和行编号放在括号内。最后,%n%m%n%n写入一个新行、消息和其他两行。
通过 JMX 对 log4j 所做的更改不是持久化的。如果重新启动 Grails,它会恢复到  Config.groovy 中的持久化设置。这意味着您可以任意处理 JMX 设置,而不用担心会永久打乱事情。对于 ConversionPattern,使用 JMX 是体验设置的很好方法,您可以找到最喜欢的设置。但是不要忘了将模式复制到 Config.groovy,以使更改是持久化的。
返回列表