skimemo


skimemo - 日記/2015-08-29/Kmdのlogviewerに「全てのログを削除する」機能を追加してみた

_ Kmdのlogviewerに「全てのログを削除する」機能を追加してみた

screen.png


Laravelのlog viewerとして愛用しているkmd/logviewer
インストール方法は上記リンク先を見て頂ければ簡単です。入れるだけです。

画面デザインも画像検索して頂ければ解るとおり、綺麗です。
そして何と言っても速い!
大量のログが溜まっても、ストレス無く開けます。

このviewer、ログの削除機能が付いているのは良いのですが、現在見ているログしか消せないので、ログが溜まってくると1つ1つ開いて消さなくてはならず、面倒です。
まあ、古いログなんてlogrotateが勝手に消してくれるから関係ない、って方は良いのですが、気になっちゃう人は気になっちゃいますよね。

そんなわけで、「全てのログを削除する」機能、付けてみました。
でも日本語でkmd/logviewer検索しても何も出ないんだよなぁ。誰も使ってないのかな。

変更するファイルはたったの5つです(主要なファイルは殆どとも言う)。

_ /src/filters.php

filterの中でログファイルリストを作成しているので、削除処理からも使えるようにLogviewer.phpに追い出します。

  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
use Kmd\Logviewer\Logviewer; Route::filter('logviewer.logs', function () {    if (!Lang::has('logviewer::logviewer.sapi')) {        App::setLocale('en');    }     $app = key(Config::get('logviewer::log_dirs'));    View::share('logs', (new Logviewer($app, null, null))->makeLogs(Lang::get('logviewer::logviewer.sapi')));}); 

_ src/Kmd/Logviewer/Logviewer.php

追い出されたひと。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
/** * Make the all log file list. * * @access public * @param $sapis * @return array */public function makeLogs($sapis) {    $logs = array();    foreach($sapis as $sapi => $human) {        $logs[$sapi]['sapi'] = $human;        $dirs = Config::get('logviewer::log_dirs');         $files = $orgs = array();         foreach($dirs as $app => $dir) {            $files[$app] = glob($dir.'/log-'.$sapi.'*', GLOB_BRACE);            $orgs[$app] = $files[$app];            if(is_array($files[$app])) {                $files[$app] = array_reverse($files[$app]);                foreach($files[$app] as &$file) {                    $file = preg_replace('/.*(\d{4}-\d{2}-\d{2}).*/', '$1', basename($file));                }            } else {                $files[$app] = array();            }        }         $logs[$sapi]['logs'] = $files;        $logs[$sapi]['orgs'] = $orgs;    }    return $logs;} 

それと、全削除の関数も追加。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
/** * Delete the all logs. * * @param $sapis * @return bool */public function delete_all($sapis) {    $result = true;    foreach($this->makeLogs($sapis) as $type => $files) {        if(!empty($files['orgs'])) {            foreach($files['orgs'] as $app => $file) {                if ( !empty($file) ){                    foreach ($file as $f){                        if( !File::delete($f) ){                            $result = false;                        }                    }                }            }        }    }    return $result;} 

_ src/lang/en/logviewer.php , src/lang/jp/logviewer.php

文言も追加します。英語と日本語。 日本語って「ja」になってるんですが、「jp」ですよね? ディレクトリrenameしました。

  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 'delete' => array(    'one' => array(        'modal' => array(            'header' => 'Are you sure?',            'body' => 'Are you sure you want to delete this log?',            'btn' => array(                'no' => 'No',                'yes' => 'Yes',            )        ),        'error' => 'There was an error while deleting the log.',        'success' => 'Log deleted successfully!',        'btn' => 'Delete Current Log',    ),    'all' => array(        'modal' => array(            'header' => 'Are you sure?',            'body' => 'Are you sure you want to delete ALL logs?',            'btn' => array(                'no' => 'No',                'yes' => 'Yes',            )        ),        'error' => 'There was an error while deleting the all logs.',        'success' => 'Logs deleted successfully!',        'btn' => 'Delete ALL Logs',    ), ), 
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
'delete' => array(    'one'=>array(        'modal' => array(            'header' => 'よろしいですか?',            'body' => 'このログを削除してもよろしいですか?',            'btn' => array(                'no' => 'いいえ',                'yes' => 'はい',            )        ),        'error' => '削除中にエラーが発生しました。',        'success' => 'ログの削除は成功しました!',        'btn' => '現行のログを削除する',    ),    'all'=>array(        'modal' => array(            'header' => 'よろしいですか?',            'body' => '全てのログを削除してもよろしいですか?',            'btn' => array(                'no' => 'いいえ',                'yes' => 'はい',            )        ),        'error' => '削除中にエラーが発生しました。',        'success' => 'ログの削除は成功しました!',        'btn' => '全てのログを削除する',    ),), 

_ src/routes.php

削除処理そのものはroutes.phpで行われています。
ここに全削除の処理を追加すると共に、文言指定を修正。

 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
    Route::group(array('before' => $filters['before'], 'after' => $filters['after']), function () {        Route::get(Config::get('logviewer::base_url').'/{path}/{sapi}/{date}/delete', function ($path, $sapi, $date) {            $logviewer = new Logviewer($path, $sapi, $date);             if ($logviewer->delete()) {                $today = Carbon::today()->format('Y-m-d');                return Redirect::to(Config::get('logviewer::base_url').'/'.$path.'/'.$sapi.'/'.$today.'/all')                    ->with('success', Lang::get('logviewer::logviewer.delete.one.success'));            } else {                return Redirect::to(Config::get('logviewer::base_url').'/'.$path.'/'.$sapi.'/'.$date.'/all')                    ->with('error', Lang::get('logviewer::logviewer.delete.one.error'));            }        });        Route::get(Config::get('logviewer::base_url').'/{path}/{sapi}/{date}/delete_all', function ($path, $sapi, $date) {            $logviewer = new Logviewer($path, $sapi, $date);             if ($logviewer->delete_all(Lang::get('logviewer::logviewer.sapi'))) {                $today = Carbon::today()->format('Y-m-d');                return Redirect::to(Config::get('logviewer::base_url').'/'.$path.'/'.$sapi.'/'.$today.'/all')                    ->with('success', Lang::get('logviewer::logviewer.delete.all.success'));            } else {                return Redirect::to(Config::get('logviewer::base_url').'/'.$path.'/'.$sapi.'/'.$date.'/all')                    ->with('error', Lang::get('logviewer::logviewer.delete.all.error'));            }        });    }); 

_ src/views/viewer.blade.php

最後に、全て削除ボタンを追加します。
ここでも文言の指定を修正します。

 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
                                @if ( !$empty )                                    <div class="pull-right">                                        {{ HTML::link('#delete_modal', Lang::get('logviewer::logviewer.delete.one.btn'), array('class' => 'btn btn-danger', 'data-toggle' => 'modal', 'data-target' => '#delete_modal')) }}                                    </div>                                    <div class="pull-right">                                        &nbsp;&nbsp;&nbsp;                                    </div>                                    <div class="pull-right">                                        {{ HTML::link('#delete_modal_all', Lang::get('logviewer::logviewer.delete.all.btn'), array('class' => 'btn btn-danger', 'data-toggle' => 'modal', 'data-target' => '#delete_modal_all')) }}                                    </div>                                @endif 
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
        <div id="delete_modal" class="modal hide fade">            <div class="modal-header">                <button type="button" class="close" data-dismiss="modal">×</button>                <h3>{{ Lang::get('logviewer::logviewer.delete.one.modal.header') }}</h3>            </div>            <div class="modal-body">                <p>{{ Lang::get('logviewer::logviewer.delete.one.modal.body') }}</p>            </div>            <div class="modal-footer">                {{ HTML::link($url.'/'.$path.'/'.$sapi_plain.'/'.$date.'/delete', Lang::get('logviewer::logviewer.delete.one.modal.btn.yes'), array('class' => 'btn btn-success')) }}                <button class="btn btn-danger" data-dismiss="modal">{{ Lang::get('logviewer::logviewer.delete.one.modal.btn.no') }}</button>            </div>        </div>        <div id="delete_modal_all" class="modal hide fade">            <div class="modal-header">                <button type="button" class="close" data-dismiss="modal">×</button>                <h3>{{ Lang::get('logviewer::logviewer.delete.all.modal.header') }}</h3>            </div>            <div class="modal-body">                <p>{{ Lang::get('logviewer::logviewer.delete.all.modal.body') }}</p>            </div>            <div class="modal-footer">                {{ HTML::link($url.'/'.$path.'/'.$sapi_plain.'/'.$date.'/delete_all', Lang::get('logviewer::logviewer.delete.all.modal.btn.yes'), array('class' => 'btn btn-success')) }}                <button class="btn btn-danger" data-dismiss="modal">{{ Lang::get('logviewer::logviewer.delete.all.modal.btn.no') }}</button>            </div>        </div> 

これで快適にlogviewライフを楽しめます;-)

Category: [Linux] - 16:13:36



 
Last-modified: 2015-08-29 (土) 18:45:52