Linuxのログについて設定と管理の基本

# ログ管理ソフトウェアについて
・syslog(RHEL/CentOS 6以前)
Syslogは、UNIXやLinuxを中心としたオペレーティングシステムで使用される標準的なログ記録プロトコルおよびソフトウェアです。

・rsyslog
「syslog」の機能強化版。基本的な使用方法は「syslog」とほぼ同じですが、複数のマシンのログを1台のマシンに集約することができる。
rsyslogの設定ファイルは、「/etc/rsyslog.conf」および「/etc/rsyslog.d」配下にある、.confで終わっているファイルすべてを合わせたものになります。
rsyslogはモジュール式で構築されており、機能追加やカスタマイズが容易。

・systemdのjournal
systemdは、Linuxシステムを起動、運用するためのツールです。サービスやプロセスを管理しています。
systemdはログシステムのjournalを搭載していて、journalctlコマンドを使用してログを出力することができます。

## rsyslogの主要ログディレクトリ
デフォルトでは以下のディレクトリにログが吐き出されます。

・/var/log/messages:
システム全体の一般的なログメッセージが保存されます。システムの起動や停止、サービスの開始や終了、一般的なエラーメッセージなどが含まれます。

・/var/log/cron:
Cronジョブの実行に関するログが保存されます。スケジュールされたタスクの実行結果やエラーが記録されます。

・/var/log/boot.log:
システムの起動プロセスに関するログが保存されます。起動時に発生したイベントやエラーが記録されます。

・/var/log/mail.log:
メールサーバー（例：Postfix、Sendmail）のログが保存されます。メールの送受信に関するイベントが記録されます。

## rsyslogの設定について
rsyslogの設定ファイルは/etc/rsyslog.confと/etc/rsyslog.d/*になります。

ログの出力の設定は以下の様に設定します。ファシリティとプライオリティについては後述します。
[ファシリティ].[プライオリティ]　　[出力先]
例としてcronのログは初期設定で以下の様に設定されています。
```
cron.*                                                  /var/log/cron
```

### ファシリティ（生成元）
ファシリティはメッセージの生成元を表します。具体的にはカーネルや実行中のプロセスです。
以下のようなものがあります。

| ファシリティ |  説明|
| :-- | :-: |
|auth,authpriv| 認証システム| 
|cron | cron関連|
|mail | メール関連|
|kern|カーネルによる出力 |
|daemon|各種デーモン関連|
|user|ユーザープロセス関連|

### プライオリティ（重要度）
ログの重要度を示します。プライオリティを低く設定するほど出力されるログは多くなります。noneを設定するとログが出力されなくなります。

| プライオリティ | 説明 |
| :-- | :-: |
| emerg | 緊急: システムが使用できないレベルの重大な問題 |
| alert | アラート: 即座に対処が必要な問題 |
| crit | 重大: クリティカルな状態 |
| err | エラー: エラー状態 |
| warning | 警告: 警告状態 |
| notice | 通知: 正常だが重要な状態 |
| info | 情報: 情報メッセージ |
| debug | デバッグ: デバッグメッセージ |
|none|ログを記録しない|

### 出力先
ログをどこに出力するのかを設定します。
rsyslogでは、TCPもしくはUDPを用いて、ネットワーク越しにログを送信することで、１台のログサーバに集約するといったこともできます。

| 出力先 | 説明 |
| :-- | :-: |
| /var/log/messages | ログファイル |
| /dev/tty1 | コンソール |
| @ホスト名 | 指定したホストにUDPで出力 |
| @@ホスト名 | 指定したホストにTCPで出力 |
| * | ログイン中の全てのユーザー |

### 非同期モードについて

```
mail.*                                                  -/var/log/maillog
```
設定ファイルの出力先の先頭に「‐」がついているものがあります。意味は「非同期モードでログを記録する」ということです。ログをファイルに書き出す前に、ある程度メモリに書き出す内容を保存してからファイルに書き出すようになります。
パフォーマンスの向上が期待できますが、システムクラッシュなどの予期せぬ事態が発生した場合には、バッファに残っていたログが失われる可能性があります。

## logrotate
ログファイルのローテーションを管理するためのツールです。ログファイルのサイズが大きくなりすぎないように定期的にアーカイブし、必要に応じて圧縮・削除します。

logrotateは、定期的に実行されるように設定されています。logrotate自体はデーモン（常駐プログラム）ではなくcrondによって実行されます。デフォルトでは、毎日実行されることが多いです。設定によって「毎週や毎月にローテーションする」「ファイルサイズが指定した値を超えたらローテーションする」といったことができます。

### ログローテーションの設定
以下のすべてのファイルが読み込まれます。個別の設定が優先されメイン設定ファイルはデフォルト値として利用されます。

・**メイン設定ファイル:** /etc/logrotate.conf
・**個別設定ファイル:** /etc/logrotate.d/ディレクトリ内に配置される各サービスごとの設定ファイル

### /etc/logrotate.confの例

```
# ローテーションの頻度（weekly, daily, monthlyなど）
weekly

# ログファイルの保持世代数
rotate 4

# ローテーションさせたら新しく空のファイルを作成
create

# ローテーション後にログファイルを圧縮する
#compress

# ローテーションの後に日付を付ける
dateext

# 各パッケージのログローテーション設定ファイルを含める
include /etc/logrotate.d

# 特定のログファイルに対する設定
/var/log/wtmp {
    monthly
    create 0664 root utmp
    minsize 1M
    rotate 1
}
```

#### ローテーション頻度
* daily: ログファイルを毎日ローテーションします。
* weekly: ログファイルを毎週ローテーションします。
* monthly: ログファイルを毎月ローテーションします。

#### ログの保持世代数
*　rotate <数値>: ログファイルの保持世代数を指定します。

#### ローテーション後のファイル名
dateext: ローテーション後のファイル名に日付を付けます。
dateformatオプションを使用すると、日付の形式をカスタマイズできます。このオプションは、dateextと組み合わせて使用されます。

その他多くの設定があります。しっかりと設定を行うことで効率よくログの管理ができます。

## その他ログ管理のポイントについて

・ログの閲覧と分析
ログファイルはテキストファイルなので、cat、less、grepなどのコマンドを使用して直接閲覧・検索することができます。特に、grepコマンドを使用して特定のキーワードを含むログ行を抽出することが一般的です。

・ログのモニタリングとアラート、解析と可視化
logwatch、AWS CloudWatch Logsなどのツールを使用してリアルタイムでログをモニタリングし、異常を検知します。

・tail -f と grep を組み合わせて、リアルタイムでログを監視し、特定のエラーメッセージが出力された際に迅速に対応します。

### 参考記事

https://qiita.com/Higemal/items/095e75c845bbc12bea63

https://qiita.com/sugar_salt75/items/1d1980d5b66becc9f38f

https://knowledge.sakura.ad.jp/8969/

https://envader.plus/course/12/scenario/1132

https://linuc.org/study/column/3587/

https://qiita.com/zom/items/c72c7bac63462225971b

https://linuc.org/study/column/3635/