gpt4 book ai didi

java - 如何解析多线程写入的日志?

转载 作者:行者123 更新时间:2023-12-02 00:56:01 26 4
gpt4 key购买 nike

我有一个有趣的问题,非常感谢您对最佳解决方案的想法。我需要解析一组日志。日志由多线程程序生成,单个进程周期会生成多行日志。

在解析这些日志时,我需要从每个进程中提取特定的信息 - 当然,这些信息跨多行(我想将这些数据压缩到单行中)。由于应用程序是多线程的,当其他进程同时写入同一日志文件时,属于一个进程的行 block 可能会被分成碎片。

幸运的是,每一行都给出了一个进程 ID,因此我能够区分哪些日志属于哪个进程。

现在,已经有几个解析器都扩展了同一个类,但被设计为从单线程应用程序读取日志(没有碎片 - 来自原始系统)并在父类(super class)中使用 readLine() 方法。这些解析器将继续读取行,直到所有正则表达式都与行 block 匹配(即在单个进程周期中写入的行)。

那么,我可以对父类(super class)做什么,以便它可以管理碎片日志,并确保对现有实现的解析器的更改最小?

最佳答案

听起来您希望利用一些已在使用的现有解析器类。在这种情况下,我会写一个 decorator对于解析器来说,它会删除与您正在监视的进程无关的行。

听起来您的类(class)可能如下所示:

abstract class Parser {
public abstract void parse( ... );
protected String readLine() { ... }
}

class SpecialPurposeParser extends Parser {
public void parse( ... ) {
// ... special stuff
readLine();
// ... more stuff
}
}

我会写这样的内容:

class SingleProcessReadingDecorator extends Parser {
private Parser parser;
private String processId;
public SingleProcessReadingDecorator( Parser parser, String processId ) {
this.parser = parser;
this.processId = processId;
}

public void parse( ... ) { parser.parse( ... ); }

public String readLine() {
String text = super.readLine();
if( /*text is for processId */ ) {
return text;
}
else {
//keep readLine'ing until you find the next line and then return it
return this.readLine();
}
}

然后您想要修改的任何事件都将像这样使用:

//old way
Parser parser = new SpecialPurposeParser();
//changes to
Parser parser = new SingleProcessReadingDecorator( new SpecialPurposeParser(), "process1234" );

此代码片段简单且不完整,但让您了解装饰器模式如何在这里工作。

关于java - 如何解析多线程写入的日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/272803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com