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 (2017d)