如何解析Apache Catalina.log

时间:2017-11-10 01:23:17

标签: regex apache tomcat

我正试图找到一种方法来解析Catalina.log,我真的很挣扎。

这段代码:

    May 12, 2017 2:14:38 PM org.apache.coyote.AbstractProtocol init
SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-apr-10.1.31.104-443"]
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
    at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:490)
    at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:649)
    at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:434)
    at org.apache.catalina.connector.Connector.initInternal(Connector.java:978)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:821)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:638)
    at org.apache.catalina.startup.Catalina.load(Catalina.java:663)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:253)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:427)

我想

日期 = 2017年5月12日下午2:14:38

= org.apache.coyote.AbstractProtocol init

错误级别 =严重

错误消息 =无法初始化与ProtocolHandler关联的终点[“http-apr-10.1.321.224-443”]

错误消息正文 = java.lang.Exception:使用SSL与APR时必须定义连接器属性SSLCertificateFile     在org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:490)....

我甚至不知道从哪里开始:) 任何想法都非常欢迎

1 个答案:

答案 0 :(得分:2)

我为你准备了以下正则表达式:

((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2},\s+\d{4}\s+\d{1,2}:\d{1,2}:\d{1,2}\s(AM|PM))\s(.+)(\r)?\n(FATAL|SEVERE|ERROR|WARN(ING)?|INFO|CONFIG|INFO|DEBUG):\s(.+)(\r)?\n(.+)(\r)?\n(?=\s+at.+java:\d+\))

您可以使用以下后面的参考来捕捉您的群组

DATE -> $1
CLASS ->  $4
ERROR_LEVEL ->  $6
ERROR_MSG ->  $8
ERROR_BODY ->  $10

正则表达式只会获取符合以下条件的字符串:

  • 以您在帖子中指定的格式开始的日期
  • 日期之后,第一行由班级名称
  • 组成
  • 第二行由错误级别和错误msg
  • 组成
  • 第3行是您的错误消息身体
  • 后跟一条以

正则表达式的工作方式如下:

((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2},\s+\d{4}\s+\d{1,2}:\d{1,2}:\d{1,2}\s(AM|PM))

此部分将以帖子的格式获取日期

3个月,然后是空格,然后是1或2位数,','然后是4位数的年份 然后是空格,然后是时间(列char,然后是空格,然后是AM或PM

\s(.+)(\r)?\n

正则表达式的这一部分将允许您获得与

对应的第一行的其余部分
(FATAL|SEVERE|ERROR|WARN(ING)?|INFO|CONFIG|INFO|DEBUG):\s(.+)(\r)?\n(.+)(\r)?\n

这部分将允许您获得错误级别(在此详尽列表中)后跟列和以下2行对应到您的错误消息/身体

(?=\s+at.+java:\d+\))

最后一部分是强制您的错误后跟java堆栈跟踪的条件。

您可能需要调整正则表达式的某些部分(如错误正文的行数,错误消息)或堆栈跟踪条件,但我认为这是您案例的一个很好的起点。

CHEERS !!!