шаблон для разбора лог-файла - PullRequest
0 голосов
/ 05 марта 2012

У меня есть проект PHP 5.3.4, в котором мне нужно проанализировать файл журнала и отобразить сводку для пользователя.Формат файла журнала (который находится вне моего контроля) выглядит примерно так:

BEGIN GROUP: my group
<TESTCASE ID=1>
*** Test Name: Some Test
</TESTCASE RESULT="PASSED">
END GROUP: my group
BEGIN GROUP: another group
<TESTCASE ID=1>
*** Test Name: Some other Test
</TESTCASE RESULT="PASSED">
BEGIN GROUP: sub group
<TESTCASE ID=2>
*** Test Name: Foo
</TESTCASE RESULT="FAILED">
END GROUP: sub group
<TESTCASE ID=3>
*** Test Name: Bar
</TESTCASE RESULT="PASSED">
END GROUP: another group

Я думаю, что я хотел бы сначала проанализировать файл журнала для набора объектов, подобного этому:

abstract class ResultBase
{
    // name of this result element
    private $name_ = null;
    // line number in the result log corresponding ot this element
    private $line_ = null;

    // ...
}

// defines a Group element from the logfile
class Group extends ResultBase
{
    // array of ResultBase-derived child elements belonging to this group.
    private $children_ = null;

    // ...
}

// defines a TestCase element from the logfile
class TestCase extends ResultBase
{
    // test case id
    private $id_ = null;
    // "passed" or "failed" result
    private $result_ = null;

    // ...
}

class LogFile
{
    // array of ResultBase-derived elements that constitute the log
    private $elements_ = null;
}

А затем распечатайте объекты:

function Print( $log_file )
{
    // some recursive print algorithm...
}

Я новичок в PHP, поэтому, если приведенное выше неверное направление, пожалуйста, дайте мне знать.

Я ищу какой-то шаблон, который можно применить, и несколько предложений псевдокода о том, как его реализовать.

function Parse( $log_file_name )
{
    $logfile = new LogFile();
    // what goes here???
    return $logfile;
}

Print(Parse('C:\mylogfile.log'));

1 Ответ

0 голосов
/ 05 марта 2012

Вы можете сделать что-то подобное:

$log = new LogFile('C:\mylogfile.log');
$log->parse();
printf("Log has %d groups.\n", $log->getGroups()); # Log has 3 groups.

LogFile только расширяется от SplFileObject:

class LogFile extends SplFileObject {
    private $groups;
    public function rewind() {
        $this->groups = 0;
        parent::rewind();
    }
    public function current() {
        $line = parent::current();
        if (substr($line, 0, 13) === 'BEGIN GROUP: ') $this->groups++;
        return $line;
    }
    public function parse() {
        foreach($this as $line);
    }
    public function getGroups() {
        return $this->groups;
    }
}

Может быть, это дает вам некоторые советы Лучшим вариантом будет декоратор, который принимает любой итератор, чтобы сделать его еще более гибким:

$log = new SplFileObject($logFileName);
$parser = new LogFileParser($log);
$parser->parse();
printf("Log has %d groups.\n", $parser->getGroups());

class LogFileParser extends IteratorIterator
{
    private $groups;
    public function rewind() {
        $this->groups = 0;
        parent::rewind();
    }
    public function current() {
        $line = parent::current();
        if (substr($line, 0, 13) === 'BEGIN GROUP: ') $this->groups++;
        return $line;
    }
    public function parse() {
        foreach($this as $line);
    }
    public function getGroups() {
        return $this->groups;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...