PHPとAjaxによる簡易ログ解析を作ってみた

一般には公開しないような管理者専用の画面で、ログファイルをブラウザから表示、絞り込みができればいいなぁと思ったので作ってみた。
 

仕上がりイメージ

先に仕上がりイメージを見せるとこんな感じ。
CSSはほとんどいじっていないのでもっと見やすくはできると思う。


 

実装する機能

  1. ログを日付ごとにローテーションしている場合、プルダウンメニュー(select)を作り、ファイルを選択してその日の分だけ表示させる
  2. Fatal errorとParse errorだけ、Warningまで、等の絞り込みがチェックボックスで画面切り替えなしに可能(Ajax)
  3. Fatal error等のエラーレベルを色分け

色分けに関して、ひとまず目がチカチカしそうだったので、エラーレベルの文字列だけにstyleを適用するようにしているが、行全体に色をつけるのでもよい。
 

実装内容

冗長な感じがしないでもないが、ログの種類が変わっても書き換えやすいかと。
 

<br />
&lt;form method=&quot;POST&quot; id=&quot;logext&quot; name=&quot;logext&quot;<br />
      class=&quot;logselect&quot;<br />
      action=&quot;&lt;?php echo $_SERVER['SCRIPT_NAME']; ?&gt;&quot;&gt;<br />
    &lt;select id=&quot;logfile&quot; name=&quot;logfile&quot;&gt;<br />
        &lt;option value=&quot;&quot;&gt;- Select -&lt;/option&gt;<br />
&lt;?php<br />
        // &quot;php.log.20171120&quot; のような形式でログが保存されていることとする<br />
        foreach(glob('./php.log.*') as $file) {<br />
            $splFileObject = new SplFileObject($file);<br />
            $logPathname = $splFileObject-&gt;getPathname();<br />
            $logFilename = $splFileObject-&gt;getFilename();<br />
            preg_match('|\d{4}\\d{2}\\d{2}|', $logFilename, $logdate);<br />
?&gt;<br />
            &lt;option value=&quot;&lt;?php echo $logPathname; ?&gt;&quot;&gt;<br />
                &lt;?php echo $logdate[0]; ?&gt;<br />
            &lt;/option&gt;<br />
&lt;?php<br />
         }<br />
?&gt;<br />
    &lt;/select&gt;</p>
<p>    &lt;input type=&quot;checkbox&quot; id=&quot;fatalcheck&quot; checked&gt;Fatal error<br />
    &lt;input type=&quot;checkbox&quot; id=&quot;parsecheck&quot; checked&gt;Parse error<br />
    &lt;input type=&quot;checkbox&quot; id=&quot;warningcheck&quot; checked&gt;Warning<br />
    &lt;input type=&quot;checkbox&quot; id=&quot;deprecatedcheck&quot; checked&gt;Deprecated<br />
    &lt;input type=&quot;checkbox&quot; id=&quot;noticecheck&quot; checked&gt;Notice<br />
&lt;/form&gt;</p>
<p>&lt;!--ここにログを表示--&gt;<br />
&lt;div id=&quot;dspLogfile&quot;&gt;&lt;/div&gt;<br />

 
<br />
$(function() {<br />
    $('select[name=logfile], #fatalcheck, #parsecheck, #warningcheck, #deprecatedcheck, #noticecheck').on('change', function(){<br />
        var url = {request : $('#logfile').val()};<br />
        var fatalcheck = $('#fatalcheck').prop('checked');<br />
        if (fatalcheck) {<br />
            var fatal = '1';<br />
        } else {<br />
            var fatal = '0';<br />
        }<br />
        var parsecheck = $('#parsecheck').prop('checked');<br />
        if (parsecheck) {<br />
            var parse = '1';<br />
        } else {<br />
            var parse = '0';<br />
        }<br />
        var warningcheck = $('#warningcheck').prop('checked');<br />
        if (warningcheck) {<br />
            var warning = '1';<br />
        } else {<br />
            var warning = '0';<br />
        }<br />
        var deprecatedcheck = $('#deprecatedcheck').prop('checked');<br />
        if (deprecatedcheck) {<br />
            var deprecated = '1';<br />
        } else {<br />
            var deprecated = '0';<br />
        }<br />
        var noticecheck = $('#noticecheck').prop('checked');<br />
        if (noticecheck) {<br />
            var notice = '1';<br />
        } else {<br />
            var notice = '0';<br />
        }<br />
        $.ajax({<br />
            type: &quot;POST&quot;,<br />
            url: &quot;dspLogfile.php&quot;,<br />
            data: {<br />
                url : url,<br />
                fatal : fatal,<br />
                parse : parse,<br />
                warning : warning,<br />
                deprecated : deprecated,<br />
                notice : notice<br />
            }<br />
        }).done(function(data){<br />
            $('#dspLogfile').html(data);<br />
        });<br />
    });<br />
});</p>
<p>

 
<br />
&lt;?php<br />
if (session_status() == PHP_SESSION_NONE) {<br />
    header('Expires:-1');<br />
    header('Cache-Control:');<br />
    header('Pragma:');<br />
    session_start();<br />
}</p>
<p>$url = $_POST['url']['request'];<br />
$fatal = $_POST['fatal'];<br />
$parse = $_POST['parse'];<br />
$warning = $_POST['warning'];<br />
$deprecated = $_POST['deprecated'];<br />
$notice = $_POST['notice'];</p>
<p>// 各エラーレベルごとにCSSで定義した色をつけるspanタグに置き換える<br />
foreach(glob($url) as $file) {<br />
    $splFileObject = new SplFileObject($file);<br />
    foreach ( $splFileObject as $line ) {<br />
        if (strpos($line, 'Fatal error') !== false &amp;&amp; $fatal == '1') {<br />
            $loglevel_col = &quot;&lt;span class='fatal_color'&gt;Fatal error&lt;/span&gt;&quot;;<br />
            $line = str_replace('Fatal error', $loglevel_col, $line);<br />
            echo $line . &quot;&lt;br&gt;&quot;;<br />
        } else if (strpos($line, 'Parse error') !== false &amp;&amp; $parse == '1') {<br />
            $loglevel_col = &quot;&lt;span class='parse_color'&gt;Parse error&lt;/span&gt;&quot;;<br />
            $line = str_replace('Parse error', $loglevel_col, $line);<br />
            echo $line . &quot;&lt;br&gt;&quot;;<br />
        } else if (strpos($line, 'Warning') !== false &amp;&amp; $warning == '1') {<br />
            $loglevel_col = &quot;&lt;span class='warning_color'&gt;Warning&lt;/span&gt;&quot;;<br />
            $line = str_replace('Warning', $loglevel_col, $line);<br />
            echo $line . &quot;&lt;br&gt;&quot;;<br />
        } else if (strpos($line, 'Deprecated') !== false &amp;&amp; $deprecated == '1') {<br />
            $loglevel_col = &quot;&lt;span class='deprecated_color'&gt;Deprecated&lt;/span&gt;&quot;;<br />
            $line = str_replace('Deprecated', $loglevel_col, $line);<br />
            echo $line . &quot;&lt;br&gt;&quot;;<br />
        } else if (strpos($line, 'Notice') !== false &amp;&amp; $notice == '1') {<br />
            $loglevel_col = &quot;&lt;span class='notice_color'&gt;Notice&lt;/span&gt;&quot;;<br />
            $line = str_replace('Notice', $loglevel_col, $line);<br />
            echo $line . &quot;&lt;br&gt;&quot;;<br />
        }<br />
    }<br />
}<br />

 
<br />
/* log level color */<br />
.fatal_color {<br />
    color: #F44336;<br />
}<br />
.parse_color {<br />
    color: #D84315;<br />
}<br />
.warning_color {<br />
    color: #FFA000;<br />
}<br />
.deprecated_color {<br />
    color: #673AB7;<br />
}<br />
.notice_color {<br />
    color: #3F51B5;<br />
}<br />

 
 
緊急度の高いエラー順に対処する際、役立ちそう。