日志总是免不了出异常 ,或者开发人员打出的日志 是json格式 多行的就需要对 日志多行进行合并 ,这个很常用 ,之后我会再开一个flume合并多行的情况
诸如此类的日志:
[ERROR] [] 2017-10-23 09:34:37,855 操作超时,请重新登录
com.*****.*******.exception.MobileException: 操作超时,请重新登录
at com.*****.*****.base.session.MobileIntercepter.preHandle(MobileIntercepter.java:102)
at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:130)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:839)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:89)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:57)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
又或者是 这样的:
[INFO ] [] 2017-10-23 09:26:08,713 当前的参数为:{
"data" : {
"*******" : "#####################6ypPsznW########ccYmnCSw6HTog=jCD\/t1flm4bU2GL9Xf+hFQ=="
},
"header" : {
"*******" : "#####",
"********" : "####",
"********" : "#####",
"*********" : "#####################IP36ypPsznW6ure7DxYSS350xPw9ccYmnCSw6HTog=jCD\/t1flm4bU2GL9Xf+hFQ==",
"******" : "1.0",
"******" : "2"
}
}
[INFO ] [##############] 2017-10-23 09:26:09,479 接收参数完毕
涉及到公司隐秘 部分日志在这里手动脱敏了
下面说 详细解决方案:
在logStash低版本中 使用 filter中的 multiline插件 在高版本中 filter中没有 multiline插件 此插件转移到了 input codec插件中
低版本:
filter {
multiline {
}
高版本:
input {
file {
type => "e_mall-bank"
path => "/var/logs/*.log"
start_position => "beginning"
codec=>multiline{
pattern => "\s*\["
negate => true
what => "previous"
}
}
}
重点内容在 codec插件中 的 multiline插件
pattern 是 匹配日志的正则 negate是 是否匹配(正选,反选)
what 是 匹配到的那些加入到 上一个事件还是下一个事件
默认一行一个事件 我当然加入上一个事件啦
这样 抛出的异常 什么 一大堆 at 都在一行了。