求提取Tomcat日志时间戳的正则表达式(FluentBit对接New Relic)
Tomcat catalina.out日志FluentBit解析异常问题
问题背景
使用FluentBit解析应用日志时运行正常,但处理Tomcat的catalina.out日志时出现异常,当前使用的正则表达式为:/(?<time>Dec \d+ \d+:\d+:\d+)(?<message>.*)/
示例Tomcat日志条目
05-Aug-2022 09:01:04.533 SEVERE [http-nio-8080-exec-17] com.sun.faces.application.view.FaceletViewHandlingStrategy.handleRenderException Error Rendering View[/pages/inicio.xhtml] java.lang.IllegalStateException: WELD-000343: Unable to load the current conversation from the associated request - org.jboss.weld.context.ConversationContext.currentConversation: null, request: org.apache.catalina.connector.RequestFacade@1b943ff4 at org.jboss.weld.contexts.AbstractConversationContext.getCurrentConversation(AbstractConversationContext.java:512) at org.jboss.weld.module.jsf.ConversationAwareViewHandler.getActionURL(ConversationAwareViewHandler.java:114) at javax.faces.application.ViewHandlerWrapper.getActionURL(ViewHandlerWrapper.java:234) at com.sun.faces.renderkit.html_basic.FormRenderer.getActionStr(FormRenderer.java:237) at com.sun.faces.renderkit.html_basic.FormRenderer.encodeBegin(FormRenderer.java:136) at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:892) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:155) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:671) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at ar.com.dux.jsf.filters.CacheFilter.doFilter(CacheFilter.java:27) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at ar.com.dux.jsf.filters.SecurityFilter.conresultado(SecurityFilter.java:98) at ar.com.dux.jsf.filters.SecurityFilter.doFilter(SecurityFilter.java:83) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:183) at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:196) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:624) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1650) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) 05-Aug-2022 09:03:10.705 SEVERE [http-nio-8080-exec-16] com.sun.faces.application.view.FaceletViewHandlingStrategy.handleRenderException Error Rendering View[/pages/inicio.xhtml] java.lang.IllegalStateException: WELD-000343: Unable to load the current conversation from the associated request - org.jboss.weld.context.ConversationContext.currentConversation: null, request: org.apache.catalina.connector.RequestFacade@7f4b737c at org.jboss.weld.contexts.AbstractConversationContext.getCurrentConversation(AbstractConversationContext.java:512) at org.jboss.weld.module.jsf.ConversationAwareViewHandler.getActionURL(ConversationAwareViewHandler.java:114) at javax.faces.application.ViewHandlerWrapper.getActionURL(ViewHandlerWrapper.java:234) at com.sun.faces.renderkit.html_basic.FormRenderer.getActionStr(FormRenderer.java:237) at com.sun.faces.renderkit.html_basic.FormRenderer.encodeBegin(FormRenderer.java:136) at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:892) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1908) at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:491) at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:194) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:151) at org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:155) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:126) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:223) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:671) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at ar.com.dux.jsf.filters.CacheFilter.doFilter(CacheFilter.java:27) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at ar.com.dux.jsf.filters.SecurityFilter.conresultado(SecurityFilter.java:98) at ar.com.dux.jsf.filters.SecurityFilter.doFilter(SecurityFilter.java:83) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.omnifaces.filter.GzipResponseFilter.doFilter(GzipResponseFilter.java:183) at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:196) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:624) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1650) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
问题原因
- 正则匹配不兼容:当前正则仅匹配
Dec开头的时间格式,但Tomcat日志使用DD-MMM-YYYY HH:mm:ss.SSS格式,完全不匹配目标日志结构。 - 未处理多行日志:Tomcat异常日志包含多行堆栈信息,默认FluentBit会将每一行视为独立日志,导致解析后日志碎片化、字段提取错误。
解决方案
1. 替换为匹配Tomcat格式的正则表达式
使用以下正则提取日志中的关键字段:
/(?<time>\d{2}-[A-Za-z]{3}-\d{4} \d{2}:\d{2}:\d{2}\.\d{3}) (?<level>[A-Z]+) \[(?<thread>[^\]]+)\] (?<class>[^\s]+) (?<message>.*)/
该正则会提取:
time:完整日志时间(如05-Aug-2022 09:01:04.533)level:日志级别(如SEVERE)thread:线程名称(如http-nio-8080-exec-17)class:触发日志的类/方法(如com.sun.faces.application.view.FaceletViewHandlingStrategy.handleRenderException)message:日志核心内容(如Error Rendering View[/pages/inicio.xhtml])
2. 配置FluentBit多行合并处理
在FluentBit输入配置中启用多行模式,将堆栈信息合并为单条日志:
[INPUT] Name tail Path /path/to/your/catalina.out Parser tomcat_catalina Multiline on Multiline_Firstline_Regexp /^\d{2}-[A-Za-z]{3}-\d{4} \d{2}:\d{2}:\d{2}\.\d{3}/ Tag tomcat.catalina
Multiline_Firstline_Regexp:指定以时间格式开头的行是新日志的起始行,后续缩进的堆栈行将自动合并到上一条日志中。
3. 在parsers.conf中定义解析器
添加对应解析器配置,确保FluentBit正确识别时间戳和字段:
[PARSER] Name tomcat_catalina Format regex Regex /(?<time>\d{2}-[A-Za-z]{3}-\d{4} \d{2}:\d{2}:\d{2}\.\d{3}) (?<level>[A-Z]+) \[(?<thread>[^\]]+)\] (?<class>[^\s]+) (?<message>.*)/ Time_Key time Time_Format %d-%b-%Y %H:%M:%S.%L Time_Zone Asia/Shanghai # 根据服务器实际时区调整
4. 验证配置效果
重启FluentBit后,检查发送到New Relic的日志:
- 每条异常日志包含完整的堆栈信息
- 时间、级别、线程等字段均正确提取
内容的提问来源于stack exchange,提问作者dssof
相关产品推荐
相关产品推荐

