【问题标题】:How to parse Apache Catalina.log如何解析 Apache Catalina.log
【发布时间】:2017-11-10 01:23:17
【问题描述】:

我正在尝试寻找一种方法来解析 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)....

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

【问题讨论】:

    标签: regex apache tomcat


    【解决方案1】:

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

    ((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
    

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

    • 以帖子中指定格式的日期开始
    • 日期之后,第一行是类名
    • 第二行由错误级别和错误消息组成
    • 第 3 行是您的错误消息正文
    • 后跟 n 行的 java strack 跟踪,从 \s at 开始并以 java:\d+) 结束

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

    ((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 位数字的年份 然后是空格,然后是时间(列字符,然后是空格,然后是 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 堆栈跟踪的条件。

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

    干杯!!!

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 1970-01-01
      • 2015-08-28
      • 2021-01-13
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多