facebook twitter hatena line email

Php/ログ圧縮バッチ

提供: 初心者エンジニアの簡易メモ
2015年5月20日 (水) 03:08時点における127.0.0.1 (トーク)による版 (ページの作成:「crontab -e 5 0 * * * /usr/local/bin/php /home/linux/mnglog.php /home/linux/mnglog_conf.php mnglog_conf.php <?php $log_path_fmt_list = array(); $log_path_fmt_list[] =...」)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

crontab -e

5 0 * * * /usr/local/bin/php /home/linux/mnglog.php /home/linux/mnglog_conf.php

mnglog_conf.php

<?php
$log_path_fmt_list = array();
$log_path_fmt_list[] = '/home/linux/test%s.log';

mnglog.php

<?php
// ログ管理スクリプト
// 圧縮日指定(本日より何日前
$comp_before_day = 1;
// 削除日指定(本日より何日前
$del_before_day = 1 * 365;
// 圧縮日offset指定(デフォルト0)(障害で処理されなかったことを考慮して指定日から3日前まで、
$comp_offset_day = 3;
// 削除日offset指定(デフォルト0)(障害で処理されなかったことを考慮して指定日から3日前まで、
$del_offset_day = 3;
// --------------------------------------------------------------------------------------------------
echo '=============================== START '.date('Y/m/d H:i:s')." ===============================\n";
// 設定ファイルの読み込み
if ($argc > 1) {
    $conf_path = $argv[1];
} else {
    echo "config file does not specified\n";
    echo '=============================== END '.date('Y/m/d H:i:s')."   ===============================\n";
    exit;
}
echo "config file is {$conf_path}\n";
if (!file_exists($conf_path)) {
    echo "config file does not exists\n";
    echo '=============================== END '.date('Y/m/d H:i:s')."   ===============================\n";
    exit;
}
require_once($conf_path);
// ログ管理クラスロード
$m = new MnglogModel();
// 対象ログパスリストをセット
$m->setLogPathFmtList($log_path_fmt_list);
// 圧縮処理
$m->compExecByBeforeDay($comp_before_day, $comp_offset_day);
// 削除処理
$m->delExecByBeforeDay($del_before_day, $del_offset_day);
echo '=============================== END '.date('Y/m/d H:i:s')."   ===============================\n";
exit;
/**
 * ログ管理モデルクラス
 */
class MnglogModel
{
    // 対象ログパスリスト
    private $_log_path_fmt_list = array();
    // 年月日フォーマットリスト
    private $_ymd_formats = array(
        'Ymd',
        'Y-m-d'
    );
    const COMP_CMD_FMT = 'gzip %s';
    const DEL_CMD_FMT =  'rm -fr %s';
    const LS_CMD_FMT =  'ls %s 2>&1';
    // 対象ログパスリスト
    public function setLogPathFmtList($log_path_fmt_list)
    {
        // 対象ログパスリスト
        $this->_log_path_fmt_list = $log_path_fmt_list;
    }
    /**
     * 圧縮処理
     *
     * @param  int  $before_day 今日から何日前
     * @param  int  $offset          前項目指定より何日前までを全て処理
     * @return void
     */
    public function compExecByBeforeDay($before_day, $offset = 0)
    {
        // 処理対象日付を計算
        $now_ts = time();
        // 圧縮日付取得
        $target_ts = $now_ts - 3600 * 24 * ($before_day + $offset);
echo "compress target date is " . date('Ymd', $target_ts) . "\n";
        
        // 対象ログパスリストを取得
        $log_path_list = $this->_getTargetLoglist($target_ts);
        foreach ($log_path_list as $log_path) {
            // 圧縮
            $this->_compCommandExec($log_path);
        }
        if ($offset > 0) {
            // offsetを1減らして再帰処理
            $f = __FUNCTION__;
            $this->$f($before_day, $offset - 1);
        }
    }
    /**
     * 削除処理
     *
     * @param  int  $before_day 今日から何日前
     * @return void
     */
    public function delExecByBeforeDay($before_day, $offset = 0)
    {
        // 処理対象日付を計算
        $now_ts = time();
        // 削除日付取得
        $target_ts = $now_ts - 3600 * 24 * ($before_day + $offset);
        $target_date = date('Ymd', $target_ts);
echo "delete target date is " . date('Ymd', $target_ts) . "\n";
        
        // 対象ログパスリストを取得
        $log_path_list = $this->_getTargetLoglist($target_ts);
        foreach ($log_path_list as $log_path) {
            // 削除(.gz
            $this->_delCommandExec($log_path . '.gz');
            // 削除(圧縮し忘れログ
            $this->_delCommandExec($log_path);
        }
        if ($offset > 0) {
            // offsetを1減らして再帰処理
            $f = __FUNCTION__;
            $this->$f($before_day, $offset - 1);
        }
    }
    /**
     * 対象ログパスリストを取得
     */
    private function _getTargetLoglist($target_ts)
    {
        $log_paths = array();
        // 処理を行う
        foreach ($this->_log_path_fmt_list as $log_path_fmt) {
            // 年月日フォーマット分だけループ
            foreach ($this->_ymd_formats as $ymd_format) {
                $target_date = date($ymd_format, $target_ts);
                $log_paths[] = sprintf($log_path_fmt, $target_date);
            }
        }
        return $log_paths;
    }
    /**
     * 圧縮コマンド処理
     *
     * @param  string  $log_path   圧縮ファイルパス
     * @return void
     */
    private function _compCommandExec($log_path)
    {
        // 対象ファイルが存在しない時
        if ($this->_checkFileExists($log_path) === FALSE) return FALSE;
        
        $cmd = sprintf(self::COMP_CMD_FMT, $log_path);
        shell_exec($cmd);
echo $cmd."\n";
        return TRUE;
    }
    /**
     * 削除コマンド処理
     *
     * @param  string  $log_path   削除ファイルパス
     * @return void
     */
    private function _delCommandExec($log_path)
    {
        // 対象ファイルが存在しない時
        if ($this->_checkFileExists($log_path) === FALSE) return FALSE;
        
        $cmd = sprintf(self::DEL_CMD_FMT, $log_path);
        shell_exec($cmd);
echo $cmd."\n";
        return TRUE;
    }
    /**
     * ファイル存在チェック
     */
    private function _checkFileExists($path)
    {
        // 省略パターンを含む時
        if (strpos($path, "*") !== FALSE) {
            // lsでチェック
            $cmd = sprintf(self::LS_CMD_FMT, $path);
            exec($cmd, $arr, $res);
            // ファイルが存在しない時
            if ($res == 2) {
                return FALSE;
            }
        // 省略パターンを含まない時
        } else {
            if (!file_exists($path)) {
                return FALSE;
            }
        }
        // ファイルが存在する時
        return TRUE;
    }
}