【AWS初心者向け】スクリプトを使ったlog世代管理の設定

どうも、クラ本部の黒田です。
前回は、Amazon EC2 インスタンス上でのログ管理する際の logrotate ツールを使用したログのローテーション設定手順をご紹介しました。

今回は、log管理するためのスクリプトを使って、log世代管理を実行してみたいと考えております。

■  はじめに

ログ管理スクリプトを実行することによるメリットは次のとおりです。

  1. 自動化されたログ管理: スクリプトを使用することで、ログの生成、出力、世代管理などのタスクが自動化されます。手動でこれらのタスクを行う手間を削減し、ログの継続的な管理が確保されます。

  2. 一貫性と正確性: スクリプトによる自動化は一貫性と正確性を保証します。人為的なミスを排除し、ログの生成や管理に関するヒューマンエラーを低減します。

  3. 容易な監視: スクリプトによってログ管理が定期的に実行されるため、ログファイルの生成や世代管理の状況を容易に監視できます。適切なログが適切な時に作成および管理されていることが保証されます。

  4. 容量とストレージの最適化: ログの過去の世代を管理することにより、ディスクスペースの効率的な使用が促進されます。過去のログは不要なまま残らず、必要な情報が保持されます。

  5. セキュリティ向上: 古いログファイルが適切に管理されることで、セキュリティ上のリスクが軽減されます。古いログが無制限に残らないため、セキュリティ情報や個人情報の漏洩のリスクを最小限に抑えることができます。

■  前提条件

  • Amazon EC2 インスタンスが起動され、SSMやSSHに接続できる状態であること。

■  設定手順

  1. /opt/ScriptUT ディレクトリを作成します。-p オプションは、必要に応じて親ディレクトリも作成します。

    mkdir -p /opt/ScriptUT
  2. script コマンドを使って、新しいターミナルセッションを記録します。ログのファイル名には現在の日付と時間が含まれます。

    script /opt/ScriptUT/date +%Y%m%d_%H%M%S.log

    ※ 手順の1,2は操作ログを記録するための準備となりますので、必要のない方は飛ばしてください。

  3. /opt/eap ディレクトリ内に server.logaudit.log サブディレクトリを作成します。

    mkdir -p /opt/eap/{server.log,audit.log}
  4. /infra/script/ ディレクトリを作成し、その中に logrotate.sh スクリプトを作成します。vi エディタでスクリプトを開きます。

    mkdir -p /infra/script/ ; vi /infra/script/logrotate.sh
    #!/bin/bash
    # create : 2023/08/26
    # desc : logrotate.sh
    #############################################
    # Local
    HOSTNAME=$(uname -n | awk -F"." '{print $1}')
    LOGS=(
    "/opt/eap/server.log/server-log"
    "/opt/eap/audit.log/audit-log"
    )
    #############################################
    # Main
    # ログ出力する
    for LOG in "${LOGS[@]}"; do
    echo "$(LANG=C; date) : [INFO]:${HOSTNAME}:logrotate." | sudo tee -a "$LOG"
    # 出力したlogファイルを指定された日付フォーマットに従ったファイル作成
    CURRENT_DATE=$(date +%Y-%m-%d-%H%M%S)
    BACKUP_LOG_FILE=${LOG}${CURRENT_DATE}
    cp ${LOG} ${BACKUP_LOG_FILE}
    done
    exit 0
  5. logrotate.sh スクリプトに実行権限を付与します。

    chmod +x /infra/script/logrotate.sh
  6. /infra/script/logrotate.sh スクリプトを手動で実行します。このスクリプトはログファイルにログを出力し、バックアップファイルを作成します。

    /infra/script/logrotate.sh
  7. /opt/eap/server.log/opt/eap/audit.log ファイルのパーミッションと所有者情報を表示します。

    [root@kuroda ~]# mkdir -p /opt/eap/{server.log,audit.log}
    [root@kuroda ~]# mkdir -p /infra/script/ ; vi /infra/script/logrotate.sh
    [root@kuroda ~]# chmod +x /infra/script/logrotate.sh
    [root@kuroda ~]# /infra/script/logrotate.sh
    Sat Aug 26 06:53:21 UTC 2023 : [INFO]:kuroda:logrotate.
    Sat Aug 26 06:53:21 UTC 2023 : [INFO]:kuroda:logrotate.
    [root@kuroda ~]# ll -al /opt/eap/server.log /opt/eap/audit.log
    /opt/eap/audit.log:
    total 8
    drwxr-xr-x. 2 root root 57 Aug 26 06:53 .
    drwxr-xr-x. 4 root root 41 Aug 26 06:52 ..
    -rw-r--r--. 1 root root 63 Aug 26 06:53 audit-log
    -rw-r--r--. 1 root root 63 Aug 26 06:53 audit-log2023-08-26-065321
    /opt/eap/server.log:
    total 8
    drwxr-xr-x. 2 root root 59 Aug 26 06:53 .
    drwxr-xr-x. 4 root root 41 Aug 26 06:52 ..
    -rw-r--r--. 1 root root 63 Aug 26 06:53 server-log
    -rw-r--r--. 1 root root 63 Aug 26 06:53 server-log2023-08-26-065321
    [root@kuroda ~]#
  8. crontab を編集し、ログローテーションスクリプトを5分ごとに実行するCronジョブを設定します。

    crontab -e
    */5 * * * * /infra/script/logrotate.sh
  9. /infra/script/log_mgmt.sh log管理スクリプトを作成し、実行権限を付与します。

    vi /infra/script/log_mgmt.sh
    chmod +x /infra/script/log_mgmt.sh

    log_mgmt.shスクリプトに以下の内容を貼り付けてください。

    #!/bin/sh
    #############################################
    # create:          2023/08/26
    # filename:    log_mgmt.sh
    # description: server&auditログ管理
    #############################################
    # ログディレクトリと対象ファイル名パターンを配列で定義
    declare -a LOG_DIRS=("/opt/eap/server.log" "/opt/eap/audit.log")
    declare -a LOG_FILE_PATTERNS=("server-log*-*" "audit-log*-*")
    # 最新のログファイル数
    NUM_GENERATIONS=7
    # 処理開始ログ
    start_message="ログ管理スクリプトが開始されました。"
    echo "$start_message"
    logger -p user.info "$start_message"
    # ログ管理処理
    manage_logs()
    {
    local log_dir="$1"
    local log_file_pattern="$2"
    latest_logs=$(find "$log_dir" -maxdepth 1 -name "$log_file_pattern" -type f -printf '%T@ %p\n' | sort -rn | head -n $NUM_GENERATIONS | cut -d' ' -f2-)
    for log_file in "$log_dir"/$log_file_pattern; do
       if ! echo "$latest_logs" | grep -q "$log_file"; then
           rm -f "$log_file" || { error_message="エラーが発生しました。スクリプトを終了します。"; echo "$error_message"; logger -p user.err "$error_message"; exit 1; }
       fi
    done
    }
    #############################################
    # メイン処理
    #############################################
    for ((i = 0; i < ${#LOG_DIRS[@]}; i++)); do
    log_dir="${LOG_DIRS[$i]}"
    log_file_pattern="${LOG_FILE_PATTERNS[$i]}"
    manage_logs "$log_dir" "$log_file_pattern"
    done
    # 正常終了ログ
    success_message="ログの管理が完了しました."
    echo "$success_message"
    logger -p user.info "$success_message"
    exit 0
  10. /etc/crontab ファイルを編集し、ログ管理スクリプトを毎時30分に実行するCronジョブを設定します。

    vi /etc/crontab
    34 * * * * root /infra/script/log_mgmt.sh
  11. /opt/eap/server.log/opt/eap/audit.log ファイルのパーミッションと所有者情報を表示し、logファイルが作成されていることを確認します。

    [root@kuroda script]# ll -al /opt/eap/server.log /opt/eap/audit.log
    /opt/eap/audit.log:
    total 184
    drwxr-xr-x. 2 root root 16384 Aug 26 07:18 .
    drwxr-xr-x. 4 root root    41 Aug 26 05:49 ..
    -rw-r--r--. 1 root root   616 Aug 26 07:18 audit-log
    -rw-r--r--. 1 root root   112 Aug 26 06:01 audit-log2023-08-26-060103
    -rw-r--r--. 1 root root   168 Aug 26 06:04 audit-log2023-08-26-060402
    -rw-r--r--. 1 root root   224 Aug 26 06:06 audit-log2023-08-26-060626
    -rw-r--r--. 1 root root   280 Aug 26 06:08 audit-log2023-08-26-060854
    -rw-r--r--. 1 root root   336 Aug 26 06:09 audit-log2023-08-26-060911
    -rw-r--r--. 1 root root   392 Aug 26 06:11 audit-log2023-08-26-061106
    -rw-r--r--. 1 root root   448 Aug 26 06:18 audit-log2023-08-26-061816
    -rw-r--r--. 1 root root   504 Aug 26 07:16 audit-log2023-08-26-071633
    -rw-r--r--. 1 root root   560 Aug 26 07:17 audit-log2023-08-26-071740
    -rw-r--r--. 1 root root   616 Aug 26 07:18 audit-log2023-08-26-071822
    /opt/eap/server.log:
    total 184
    drwxr-xr-x. 2 root root 16384 Aug 26 07:18 .
    drwxr-xr-x. 4 root root    41 Aug 26 05:49 ..
    -rw-r--r--. 1 root root   616 Aug 26 07:18 server-log
    -rw-r--r--. 1 root root   112 Aug 26 06:01 server-log2023-08-26-060103
    -rw-r--r--. 1 root root   168 Aug 26 06:04 server-log2023-08-26-060402
    -rw-r--r--. 1 root root   224 Aug 26 06:06 server-log2023-08-26-060626
    -rw-r--r--. 1 root root   280 Aug 26 06:08 server-log2023-08-26-060854
    -rw-r--r--. 1 root root   336 Aug 26 06:09 server-log2023-08-26-060911
    -rw-r--r--. 1 root root   392 Aug 26 06:11 server-log2023-08-26-061106
    -rw-r--r--. 1 root root   448 Aug 26 06:18 server-log2023-08-26-061816
    -rw-r--r--. 1 root root   504 Aug 26 07:16 server-log2023-08-26-071633
    -rw-r--r--. 1 root root   560 Aug 26 07:17 server-log2023-08-26-071740
    -rw-r--r--. 1 root root   616 Aug 26 07:18 server-log2023-08-26-071822
  12. /infra/script/log_mgmt.sh スクリプトを手動で実行します。これにより、古いログファイルが管理されます。

    [root@kuroda script]# /infra/script/log_mgmt.sh
    ログ管理スクリプトが開始されました。
    ログの管理が完了しました.
    [root@kuroda script]# ll -al /opt/eap/server.log /opt/eap/audit.log
    /opt/eap/audit.log:
    total 48
    drwxr-xr-x. 2 root root 16384 Aug 26 07:22 .
    drwxr-xr-x. 4 root root    41 Aug 26 05:49 ..
    -rw-r--r--. 1 root root   616 Aug 26 07:18 audit-log
    -rw-r--r--. 1 root root   280 Aug 26 06:08 audit-log2023-08-26-060854
    -rw-r--r--. 1 root root   336 Aug 26 06:09 audit-log2023-08-26-060911
    -rw-r--r--. 1 root root   392 Aug 26 06:11 audit-log2023-08-26-061106
    -rw-r--r--. 1 root root   448 Aug 26 06:18 audit-log2023-08-26-061816
    -rw-r--r--. 1 root root   504 Aug 26 07:16 audit-log2023-08-26-071633
    -rw-r--r--. 1 root root   560 Aug 26 07:17 audit-log2023-08-26-071740
    -rw-r--r--. 1 root root   616 Aug 26 07:18 audit-log2023-08-26-071822
    /opt/eap/server.log:
    total 172
    drwxr-xr-x. 2 root root 16384 Aug 26 07:22 .
    drwxr-xr-x. 4 root root    41 Aug 26 05:49 ..
    -rw-r--r--. 1 root root   616 Aug 26 07:18 server-log
    -rw-r--r--. 1 root root   280 Aug 26 06:08 server-log2023-08-26-060854
    -rw-r--r--. 1 root root   336 Aug 26 06:09 server-log2023-08-26-060911
    -rw-r--r--. 1 root root   392 Aug 26 06:11 server-log2023-08-26-061106
    -rw-r--r--. 1 root root   448 Aug 26 06:18 server-log2023-08-26-061816
    -rw-r--r--. 1 root root   504 Aug 26 07:16 server-log2023-08-26-071633
    -rw-r--r--. 1 root root   560 Aug 26 07:17 server-log2023-08-26-071740
    -rw-r--r--. 1 root root   616 Aug 26 07:18 server-log2023-08-26-071822

■  動作確認

手順8. crontab で5分ごとlogファイルの生成ジョブ

   crontab -e
   */5 * * * * /infra/script/logrotate.sh

手順10. /etc/crontabジョブ実行状態確認

   [root@kuroda ~]# sudo systemctl status crond
● crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
     Active: active (running) since Sat 2023-08-26 08:17:38 UTC; 3min 2s ago
   Main PID: 26615 (crond)
      Tasks: 2 (limit: 1114)
     Memory: 1.8M
        CPU: 119ms
     CGroup: /system.slice/crond.service
             ├─25776 /usr/sbin/anacron -s
             └─26615 /usr/sbin/crond -n

Aug 26 08:17:38 kuroda.ap-northeast-1.compute.internal crond[26615]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 59% if used.)
Aug 26 08:17:38 kuroda.ap-northeast-1.compute.internal crond[26615]: (CRON) INFO (running with inotify support)
Aug 26 08:17:38 kuroda.ap-northeast-1.compute.internal crond[26615]: (CRON) INFO (@reboot jobs will be run at computer's startup.)
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal crond[26615]: (*system*) RELOAD (/etc/crontab)
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal CROND[26684]: (root) CMD (/infra/script/log_mgmt.sh)
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal CROND[26683]: (root) CMDOUT (ログ管理スクリプトが開始されました。)
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal root[26685]: ログ管理スクリプトが開始されました。
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal CROND[26683]: (root) CMDOUT (ログの管理が完了しました.)
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal root[26742]: ログの管理が完了しました.
Aug 26 08:34:01 kuroda.ap-northeast-1.compute.internal CROND[26683]: (root) CMDEND (/infra/script/log_mgmt.sh)

手順10. /etc/crontab で毎時の34分にlogファイルの世代管理ジョブ

    [root@kuroda script]# ll -al /opt/eap/server.log /opt/eap/audit.log
/opt/eap/audit.log:
total 172
drwxr-xr-x. 2 root root 16384 Aug 26 08:33 .
drwxr-xr-x. 4 root root    41 Aug 26 05:49 ..
-rw-r--r--. 1 root root  1232 Aug 26 08:30 audit-log
-rw-r--r--. 1 root root   896 Aug 26 08:00 audit-log2023-08-26-080001
-rw-r--r--. 1 root root   952 Aug 26 08:05 audit-log2023-08-26-080501
-rw-r--r--. 1 root root  1008 Aug 26 08:10 audit-log2023-08-26-081002
-rw-r--r--. 1 root root  1064 Aug 26 08:15 audit-log2023-08-26-081501
-rw-r--r--. 1 root root  1120 Aug 26 08:20 audit-log2023-08-26-082001
-rw-r--r--. 1 root root  1176 Aug 26 08:25 audit-log2023-08-26-082502
-rw-r--r--. 1 root root  1232 Aug 26 08:30 audit-log2023-08-26-083001
/opt/eap/server.log:
total 172
drwxr-xr-x. 2 root root 16384 Aug 26 08:33 .
drwxr-xr-x. 4 root root    41 Aug 26 05:49 ..
-rw-r--r--. 1 root root  1232 Aug 26 08:30 server-log
-rw-r--r--. 1 root root   896 Aug 26 08:00 server-log2023-08-26-080001
-rw-r--r--. 1 root root   952 Aug 26 08:05 server-log2023-08-26-080501
-rw-r--r--. 1 root root  1008 Aug 26 08:10 server-log2023-08-26-081002
-rw-r--r--. 1 root root  1064 Aug 26 08:15 server-log2023-08-26-081501
-rw-r--r--. 1 root root  1120 Aug 26 08:20 server-log2023-08-26-082001
-rw-r--r--. 1 root root  1176 Aug 26 08:25 server-log2023-08-26-082501
-rw-r--r--. 1 root root  1232 Aug 26 08:30 server-log2023-08-26-083001
[root@kuroda script]#

■  まとめ

以上の手順によって、ログファイルのローテーションと管理が設定されております。

では、皆さん、また!

linuxでのプロセスの監視について
【初学者向け】PCにPythonを学習するための環境を整える part2【Windows編】
【AWS】APP Syncとは?

↑↑↑クラ本部メンバーが書いた記事のご紹介 ↑↑↑、合わせてやってみるのもいいかと

Last modified: 2023-08-26

Author