大家好,我正在尝试从文件中排序我的日志消息。我的日志文件如下所示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
。