对日志消息进行排序


Sort log messages

大家好,我正在尝试从文件中排序我的日志消息。我的日志文件如下所示http://kopy.io/tA8bv我想实现这样的东西

['debug'] => [
    ['logs'] => [
        ['log message'] => [
            '2016-04-10',
            '2016-04-10',
            '2016-04-10'
        ],
        ['log message'] => [
            '2016-04-10',
            '2016-04-10',
            '2016-04-10'
        ],
        ...
    ]
],
['Crit'] => [
    ['logs'] => [
        ['log message'] => [
            '2016-04-10',
            '2016-04-10',
            '2016-04-10'
        ],
        ['log message'] => [
            '2016-04-10',
            '2016-04-10',
            '2016-04-10'
        ],
        ...
    ]
]

这是我的代码,但它不能正常工作,它提交了一些行

$file = fopen(self::DIRECTORY.$filename, 'rb');
while(($line = fgets($file)) !== false) {
    if($this->lineHasDate($line)) {
        $logDate = $this->getLogDate($line);
        $logType = $this->getTypeOfLog($line);
        $content .= $line;
        // $content ='';
    }
    while(!$this->lineHasDate($line) && ($line = fgets($file)) !== false) {
        // echo $line;
        $content .= $line;
    }
    $this->logs[$logType]['logs'][] = $content;
    $content = '';
}
fclose($file);

指定的代码——在文件内循环遍历文件——有点太复杂,更容易出错。

像这样试试,它在你的例子中对我有效。它更直接,更容易阅读和调试:

$file = fopen (self::DIRECTORY.$filename, 'rb');
while (($line = fgets($file)) !== false)
{
    if ($this->lineHasDate($line))
    {
        $logDate = $this->getLogDate($line);
        $logType = $this->getTypeOfLog($line);
        $this->logs[$logType]['logs'][] = $line;
        $currentLog = &$this->logs[$logType]['logs'][count($this->logs[$logType]['logs']) - 1];
    }
    else
    {
        if (!isset($currentLog)) // In case of trash lines before logs begin
            continue;
        else
            $currentLog .= $line;
    }
}
fclose($file);

另外,测试$this->lineHasDate($line)在输入省略的行时是否返回true