首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写通用日志分析器

如何编写通用日志分析器
EN

Stack Overflow用户
提问于 2011-11-28 17:02:19
回答 7查看 12.9K关注 0票数 2

我们需要解析几个日志文件,并对找到的日志条目运行一些统计信息(例如某些消息的出现次数、事件的峰值等)。问题在于编写一个日志解析器,它将处理几种日志格式,并允许我在很少工作的情况下添加一种新的日志格式。

为了使事情变得更简单,我现在只看一些基本类似于以下内容的日志:

代码语言:javascript
运行
复制
[11/17/11 14:07:14:030 EST] MyXmlParser     E   Premature end of file

因此,每个日志条目将包含一个timestamporiginator (日志消息)、level和日志message。一个重要的细节是消息可能有多个行(例如堆栈跟踪)。日志条目的另一个实例可以是:

代码语言:javascript
运行
复制
17-11-2011 14:07:14 ERROR    MyXmlParser   - Premature end of file

我正在寻找一种很好的方法来指定日志格式,以及实现解析器的最适当的技术。我想到了正则表达式,但我认为处理诸如多行消息(例如堆栈跟踪)之类的情况会很棘手。

实际上,当我考虑多行消息的可能性时,为特定日志格式编写解析器的任务听起来并不容易。如何解析这些文件?

理想情况下,我可以将类似的内容指定为日志格式:

代码语言:javascript
运行
复制
[%TIMESTAMP] %ORIGIN %LEVEL %MESSAGE

代码语言:javascript
运行
复制
%TIMESTAMP %LEVEL %ORIGIN - %MESSAGE

显然,我必须为每个字段分配正确的转换器,以便正确地处理它(例如时间戳)。

有人能给我一些好的想法,说明如何以健壮和模块化的方式实现这一点(我正在使用)吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-10-11 13:47:36

最后,我没有编写自己的代码,也没有使用原木存放物

票数 1
EN

Stack Overflow用户

发布于 2011-11-28 17:06:57

AWStats是一个很好的日志解析器,开源,您可以随意使用它生成的数据库。

票数 3
EN

Stack Overflow用户

发布于 2011-12-09 16:38:37

例如,您可以使用扫描仪和一些regexes。下面是我为解析一些复杂日志所做的工作的一个片段:

代码语言:javascript
运行
复制
private static final Pattern LINE_PATTERN = Pattern.compile(
  "(\\S+:)?(\\S+? \\S+?) \\S+? DEBUG \\S+? - DEMANDE_ID=(\\d+?) - listener (\\S+?) : (\\S+?)");

public static EventLog parse(String line) throws ParseException {
    String demandId;
    String listenerClass;
    long startTime;
    long endTime;

    SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
    Matcher matcher = LINE_PATTERN.matcher(line);
    if (matcher.matches()) {
        int offset = matcher.groupCount()-4; // 4 interesting groups, the first is optional
        demandeId = matcher.group(2+offset);
        listenerClass = matcher.group(3+offset);
        long time = sdf.parse(matcher.group(1+offset)).getTime();
        if ("starting".equals(matcher.group(4+offset))) {
            startTime = time;
            endTime = -1;
        } else {
            startTime = -1;
            endTime = time;
        }
        return new EventLog(demandeId, listenerClass, startTime, endTime);
    }
    return null;
}

因此,对于regexes和group,它运行得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8299440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档