使用Grep控制台掌握IDE日志记录

每个程序员为了完成工作而需要做的许多日常活动之一就是控制应用程序的日志输出。 如果正确正确地进行了日志记录,则可以深入了解应用程序的内部运行情况,并且可能是分析和优化代码行为的重要资源。 无论是在产品生命周期的开发阶段还是维护/支持阶段,对于许多程序员来说,通常都认为这项任务不愉快。 但是,由于日志分析非常重要且经常需要,因此通常没有简单的解决方法。 在本文中,我将提供一个优雅的解决方案,以在IDE内的应用程序开发阶段检查日志。


如果您碰巧是参与企业应用程序开发的程序员,那么您会很清楚应用程序日志可以扩展到的大小。 给定这些日志的大小和复杂性,查找某些感兴趣的事件通常是一项繁琐的任务。 在我们的团队中,我们确定了投资组合中所有应用程序共有的三个基本事件:

  • 执行SQL表达式
  • 交易开始和结束
  • Web服务请求和响应

Grep控制台

鉴于我们的开发实践以及Spring框架支持大多数产品的事实,我们最喜欢的IDE是Spring Tool Suite (简称STS)。 由于STS是基于Eclipse IDE构建的,因此它带有庞大的Eclipse Marketplace 。 如果您看起来足够深,则可能会找到所有内容。 在许多有用的工具和插件中,Marketplace还存储了一个很小但功能强大的插件,称为Grep console 。 这个小项目是由玛丽安·谢登尼格Marian Schedenig )开发和维护的。 它的作用是允许您基于分配的正则表达式定义一组应用于日志记录控制台的样式。

如果您像我一样,并且默认的Eclipse主题(字体,颜色,字体大小和内容)对您不起作用,则可能是您正在使用一些插件来调整IDE的外观。 我个人更喜欢Eclipse Color Themes插件和Gedit Original Oblivion主题。 这个项目的好处是,整个主题设置都可以以一种很好的呈现方式在线获得。 这就是事情变得有趣的地方。 这使程序员可以跨代码和日志创建一致的样式,从而提供了一种非常简单直观的方式来组织您的想法并改善您的总体方向。

运行中的Grep控制台

以下各段展示了所提到的三个有趣事件的应用样式。

执行SQL表达式

分析日志的最基本任务之一是找到某些SQL表达式的执行位置。 在我们的项目中,我们将datasource-proxy用于SQL日志记录,该项目为JDBC API提供了代理类来拦截正在执行的查询。 因此,我们能够轻松地将Grep控制台regexp映射到CommonsQueryLoggingListener类,该类记录任何数据源交互。 给定我们的本地样式设置,这就是在Eclipse IDE的控制台视图中看到的内容。

颜色: #1eff67
表达式: .*net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener.*

2013-11-18 09:00:08,893 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:1, Num:1, Query:{[select SQ_S_SYS_MON.nextval from dual][]}
2013-11-18 09:00:08,896 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:2, Num:1, Query:{[insert into S_SYS_MON (COL_A, COL_B, COL_C) values (?, ?, ?)][1, 2013-11-18 08:59:07.872, A]}
2013-11-18 09:01:10,920 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:1, Num:1, Query:{[select SQ_S_SYS_MON.nextval from dual][]}
2013-11-18 09:01:10,924 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:3, Num:1, Query:{[insert into S_SYS_MON (COL_A, COL_B, COL_C) values (?, ?, ?)][2, 2013-11-18 09:59:07.872, B]}
2013-11-18 09:02:12,946 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:1, Num:1, Query:{[select SQ_S_SYS_MON.nextval from dual][]}
2013-11-18 09:02:12,949 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:2, Num:1, Query:{[insert into S_SYS_MON (COL_A, COL_B, COL_C) values (?, ?, ?)][3, 2013-11-18 10:59:07.872, C]}
2013-11-18 09:03:14,971 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:1, Num:1, Query:{[select SQ_S_SYS_MON.nextval from dual][]}
2013-11-18 09:03:14,974 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:2, Num:1, Query:{[insert into S_SYS_MON (COL_A, COL_B, COL_C) values (?, ?, ?)][4, 2013-11-18 11:59:07.872, D]}
2013-11-18 09:04:16,999 [systemMonitoringScheduler-1] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:2, Num:1, Query:{[select SQ_S_SYS_MON.nextval from dual][]}

交易开始和结束

始终注意事务是一个好主意,尤其是在调试时。 使用Grep控制台,对于给定事务,它非常容易找到日志的相关部分。 在应用适当的表达方式和颜色样式之后,整个事务管理在日志中将变得非常清晰可见,并且不会被埋在日志行中。 如您所见,仅根据颜色分配即可立即识别整个情况。

颜色: #ffff00
表达式: .*org.hibernate.transaction.JDBCTransaction.*

2013-11-18 08:36:51,211 [http-bio-8080-exec-6] DEBUG org.hibernate.transaction.JDBCTransaction – begin
2013-11-18 08:36:51,211 [http-bio-8080-exec-6] DEBUG org.hibernate.transaction.JDBCTransaction – current autocommit status: true
2013-11-18 08:36:51,212 [http-bio-8080-exec-6] DEBUG org.hibernate.transaction.JDBCTransaction – disabling autocommit
2013-11-18 08:36:51,223 [http-bio-8080-exec-6] DEBUG net.ttddyy.dsproxy.listener.CommonsQueryLoggingListener – Name:dmDataSource, Time:8, Num:1, Query:{[select count(*) from ABC where a like ? order by b asc][AI%]}
2013-11-18 08:36:51,226 [http-bio-8080-exec-6] DEBUG org.hibernate.transaction.JDBCTransaction – commit
2013-11-18 08:36:51,229 [http-bio-8080-exec-6] DEBUG org.hibernate.transaction.JDBCTransaction – re-enabling autocommit
2013-11-18 08:36:51,230 [http-bio-8080-exec-6] DEBUG org.hibernate.transaction.JDBCTransaction – committed JDBC Connection

Web服务请求和响应

我感兴趣的最后一个事件是由于我们的应用程序需要/提供的集成程度而接收到SOAP请求或响应。 通过指定以下两个表达式,我们现在能够在消息进入/离开我们的应用程序领域时精确地跟踪点。

颜色: #03abff
表达式: .*org.springframework.ws.client.MessageTracing.*
表达式: .*org.springframework.ws.server.MessageTracing.*

2013-11-18 10:31:48,288 [http-bio-8080-exec-3] TRACE org.springframework.ws.soap.saaj.support.SaajUtils – SOAPElement [com.sun.xml.internal.messaging.saaj.soap.ver1_1.Envelope1_1Impl] implements SAAJ 1.3
2013-11-18 10:31:48,315 [http-bio-8080-exec-3] TRACE org.springframework.ws.server.MessageTracing.received – Received request [<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://a.b.c.com/product/v1.0">
<soapenv:Header/>
<soapenv:Body>
<xsd:getItem>
<xsd:itemId>1</xsd:itemId>
</xsd:getItem>
</soapenv:Body>
</soapenv:Envelope>]
2013-11-18 10:31:48,319 [http-bio-8080-exec-3] TRACE org.springframework.ws.soap.saaj.support.SaajUtils – SOAPElement [com.sun.xml.internal.messaging.saaj.soap.ver1_1.Body1_1Impl] implements SAAJ 1.3
2013-11-18 10:31:48,321 [http-bio-8080-exec-3] DEBUG org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping – Looking up endpoint for [{http://a.b.c.com/product/v1.0}getItemRequest]
2013-11-18 10:31:48,321 [http-bio-8080-exec-3] DEBUG org.springframework.ws.soap.server.SoapMessageDispatcher – Endpoint mapping [org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping@7115660] maps request to endpoint [public com.c.b.a.v10.getItem com.c.b.a.ws.ws.endpoint.ItemQuery.getItem(com.c.b.a.v10.getItemRequestDocument)]
2013-11-18 10:31:48,324 [http-bio-8080-exec-3] TRACE org.springframework.ws.soap.saaj.support.SaajUtils – SOAPElement [com.sun.xml.internal.messaging.saaj.soap.ver1_1.Header1_1Impl] implements SAAJ 1.3
2013-11-18 10:31:48,325 [http-bio-8080-exec-3] DEBUG org.springframework.ws.soap.server.SoapMessageDispatcher – Testing endpoint adapter [org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter@16a77b1c]

结论

使用此插件确实可以简化开发过程,使您不必担心比浏览日志记录更重要的问题。 设置非常简单,唯一的限制是您可以找到感兴趣的事件并为其创建匹配规则。 另一个很大的好处是能够按照IDE的外观自定义控制台日志,从而提供统一的开发环境。 这对于团队合作也非常有用,因为通过定义一组通用样式,即使在您的同事计算机上,您也始终会遇到相同的日志记录输出。 我联系了Grep控制台的开发人员,询问是否可以在Grep控制台中打开外部文件以应用样式,他说这是一个有趣的想法,因此我们可能会在以后的插件版本中使用此功能。 综上所述,我发现Grep控制台是增强开发过程的重要工具之一,可以诚实地建议使用它。

翻译自: https://www.javacodegeeks.com/2014/06/master-your-ide-logging-with-grep-console.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值