有时候我们需要用程序读取错误日志显示,因为没有没有系统的权限,团队开发会遇到这种情况,也有可能需要做一个定期发送系统日志到我们邮箱的功能,或者需要分析日志,提取里面的重要信息,就直接读取日志输出,注意做好权限管理,不要直接暴露日志给访客。
<?php ini_set('display_errors', 1); header('Content-Type: text/html; charset=utf-8'); include 'app/Mage.php'; Mage::app(); class Test { public function get() { $file = Mage::getBaseDir('log') . '/system.log'; foreach($this ->getFileLines($file,intval($_GET['start'])*10000,intval($_GET['end'])*10000) as $line){ echo $line; } } //返回文件从X行到Y行的内容(支持php5、php4) public function getFileLines($filename, $startLine = 1, $endLine = 50, $method = 'rb') { $content = array(); $count = $endLine - $startLine; if (version_compare(PHP_VERSION, '5.1.0', '>=')) {// 判断php版本(因为要用到SplFileObject,PHP>=5.1.0) $fp = new SplFileObject($filename, $method); $fp->seek($startLine - 1); // 转到第N行, seek方法参数从0开始计数 for ($i = 0; $i <= $count; ++$i) { $content[] = $fp->current(); // current()获取当前行内容 $fp->next(); // 下一行 } } else {//PHP<5.1 $fp = fopen($filename, $method); if (!$fp) return 'error:can not read file'; for ($i = 1; $i < $startLine; ++$i) {// 跳过前$startLine行 fgets($fp); } for ($i; $i <= $endLine; ++$i) { $content[] = fgets($fp); // 读取文件行内容 } fclose($fp); } return array_filter($content); // array_filter过滤:false,null,'' } } $test = new Test(); $test->get();
使用方法,以下参数是读取1万到2万之间的错误信息,哈哈,都按万来计算了
test.php/?start=1&end=2