LPIC 学習記録として
はじめに
Linux には syslog というログに関するプロトコルを実装したプログラムが複数存在する。
これらのプログラムは デーモン として稼働し、アプリケーションは C 言語の glibc のログ送信関数 syslog() を使用してデーモンに対してメッセージを送信する。
また、systemd を使用する環境では、libsystemd に含まれる sd_journal_send() 関数を使用することで、ログをネイティブに systemd-journald に送ることができる。
「syslog」 という言葉は「仕様(プロトコル)名」「関数名」「デーモン」「実装名」 として使われているため、単に syslog といった場合、何を指しているのかが分かりづらいことがある。
アプリケーションから送信されるログには以下の情報が含まれている。
ファシリティ.プライオリティ で構成される設定フィールドは セレクタフィールド、出力先 設定は アクションフィールド と呼ばれる。
ファシリティ
facility
ログメッセージの生成元。
| ファシリティ | 内容 | ファシリティコード |
|---|---|---|
kern |
カーネル | 0 |
user |
ユーザーアプリケーション | 1 |
mail |
メールシステム | 2 |
daemon |
デーモン | 3 |
auth |
認証関連 | 4 |
cron |
cron |
9 |
local0 ~ local7
|
ユーザ定義 |
16 ~ 23
|
プライオリティ
ログの優先度、重要度。
| プライオリティ | 内容 |
|---|---|
emerg |
緊急事態、システム使用不能(emergency) |
alert |
即時対応が必要 |
crit |
重大な事態(critical) |
err |
一般的なエラー(error) |
warning |
警告 |
notice |
特記事項、通知 |
info |
通常の情報(information) |
debug |
デバッグ情報 |
none |
記録しない |
出力先
ログの出力先ファイル(出力先が デバイスファイル である場合もある)。
| 出力先 | 設定値 |
|---|---|
/var/log/messages |
ログファイル |
/dev/tty1 ~ /dev/tty6
|
コンソール |
@ホスト名 |
ホストに対して UDP 送信 |
@@ホスト名 |
ホストに対して TCP 送信 |
* |
ログイン中のすべてのユーザの端末 |
ユーザ名 |
指定されたユーザの端末 |
syslogd
古い syslog の実装プログラム。
現在ではほとんどの Linux ディストリビューションで使用されていない。構成が非常にシンプル。
/etc/syslog.conf
syslogd の設定ファイル。
rsyslog
rocket-fast System for log processing
syslogd の後継版。
TCP でログを別のサーバに転送することができる。
/etc/rsyslog.conf
rsyslog に関する設定ファイル。
以下に関する設定を行うことができる。
ファシリティ.プライオリティ 出力先
; を使用することで、同じ 出力先 に対して複数の組み合わせを列挙することができる。
ファシリティ1.プライオリティ1;ファシリティ2.プライオリティ2 出力先
* を使用することで「全て」を対象にすることもできる。
ファシリティ.* 出力先
*.プライオリティ 出力先
none を使用することで特定の組み合わせを除外することもできる。
*.*;ファシリティ.プライオリティ.none 出力先
/etc/rsyslog.conf
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
###########################
#### GLOBAL DIRECTIVES ####
###########################
# Filter duplicated messages
$RepeatedMsgReduction on
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
設定ファイルを編集した場合、$ systemctl によって rsyslog.service を再起動させる必要がある。
$ systemctl restart rsyslog
編集後はサービスの再起動が必要
$ logger
rsyslog にログを送信することができるコマンド。
/etc/rsyslog.conf の設定確認をすることもできる。
$ logger メッセージ
$ logger -p ファシリティ.プライオリティ メッセージ
syslog-ng
Syslog Next Generation
rsyslog 同様に、syslogd の後継版として開発されたデーモン。
rsyslog よりも柔軟な設定が可能で 大規模なシステムに向いている。高度なフィルタ機能を持ち、メッセージの内容、送信元IP、ログレベル、ファシリティなど複雑な条件でログを分けられる。
多彩な出力先を設定することができる(ファイル、データベース、TCP/UDP ソケット、リモートサーバ)。また、出力形式として JSON や CSV が使用できる。
/etc/syslog-ng/syslog-ng.conf
syslog-ng の設定ファイル。
systemd-journald
systemd が提供する機能の一つ。
デーモンとして稼働し、収集されたログは バイナリデータ として保存される。
保村されるログは ジャーナル と表現される。
/etc/systemd/journald.conf
systemd-journald の設定ファイル。
項目=値
設定を編集した場合、$ systemctl によって systemd-journald を再起動させる必要がある。
$ systemctl restart systemd-journald
/etc/systemd/journald.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 2.1 of the License, or (at your option)
# any later version.
#
# Entries in this file show the compile time defaults. Local configuration
# should be created by either modifying this file (or a copy of it placed in
# /etc/ if the original file is shipped in /usr/), or by creating "drop-ins" in
# the /etc/systemd/journald.conf.d/ directory. The latter is generally
# recommended. Defaults can be restored by simply deleting the main
# configuration file and all drop-ins located in /etc/.
#
# Use 'systemd-analyze cat-config systemd/journald.conf' to display the full config.
#
# See journald.conf(5) for details.
[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=no
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes
#Audit=yes
/var/log/journal/
systemd が保存するジャーナルの保存先。
/etc/systemd/journald.conf の設定が Storage=persistent の場合に使用され、persistent が指定されたログは 永続的に保存 される(シャットダウン後も残る)。
Storage=persistent
Storage が auto で設定されている場合、/run/log/journal/ が使用される。その場合、ログはメモリに保存され 一時的な保存 になる。
/run/log/journal/
systemd が保存するジャーナルの保存先。
/etc/systemd/journald.conf の設定項目 Storage が auto で設定されている場合に使用される。
Storage=auto
ストレージ(ハードディスク)上ではなく メモリ上へ保存される ため、/run/log/journal/ に保存されたジャーナルはシャットダウンにより失われる。
$ systemd-cat
systemd-journald にジャーナルを送信することができるコマンド。
$ systemd-cat コマンド
$ コマンド | systemd-cat
$ systemd-cat -p プライオリティ
$ systemd-cat --priority=プライオリティ
※ プライオリティ
$ journalctl
systemd-jounald デーモンが収集したバイナリ形式のジャーナルを表示するコマンド。
rsyslog や syslog-ng が保存したテキスト形式のログは表示できない。
$ journalctl
$ journalctl -f
$ journalctl -xe # -e で less によって最後のジャーナルに移動するので、最新行から見れる
$ journalctl SYSLOG_FACILITY=ファシリティコード
$ journalctl -p プライオリティ
$ journalctl --priority=プライオリティ
※ プライオリティ
$ journalctl -u ユニット
※ ユニット
$ journalctl --since "YYYY-MM-dd HH:mm:ss" --until="YYYY-MM-dd HH:mm:ss"
ログローテート
ログファイルを定期的に整理したり管理したりするための一連の処理。
$ logrotate によって手動実行することもできるが、通常は cron や systemd などによって自動化されている。具体的には cron.daily や systemd timer により 1日1回自動で実行されることが多い。
/etc/logrotate.conf
ログローテーションの設定ファイル。
ログファイルが肥大化しないようにし、一定期間で保存・圧縮・削除するルールを記述する。
ディレクティブ
weekly # ログを毎週ローテート
rotate 4 # ローテートファイルは4世代まで保持
create # ローテート後に新しいログファイルを作成
compress # ローテートされたログを圧縮(gzip)
include /etc/logrotate.d # 個別設定をこのディレクトリから読み込む
対象ログファイルパス {
ディレクティブ
}
/var/log/sample.log {
dayly
create 0600 root root
}
| ディレクティブ | 説明 |
|---|---|
daily / weekly / monthly
|
ローテートの頻度 |
rotate 数値 |
保持するログの世代数(削除は古い順に実行される) |
compress |
ローテートされたログを gzip 圧縮する |
nocompress |
圧縮しない |
create 権限 所有者 所有グループ |
ローテート後に新規ファイルを作成(ファイル権限も指定可) |
missingok |
書き込み先ログファイルが存在しなくてもエラーにしない |
notifempty |
空ファイルならローテートしない |
ifempty |
空でもローテートする(デフォルト) |
delaycompress |
前回のローテート分だけ圧縮を遅らせる |
dateext |
ローテートファイル名に日付をつける |
postrotate / endscript |
ローテート後に実行するスクリプト(例: サービス再起動) |
/etc/logrotate.conf
# see "man logrotate" for details
# global options do not affect preceding include directives
# rotate log files weekly
weekly
# use the adm group by default, since this is the owning group
# of /var/log/.
su root adm
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
#dateext
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may also be configured here.
/etc/logrotate.d/
個別の サービス の設定ファイルを置くディレクトリ。
$ logrotate
$ logrotate 設定ファイル
$ logrotate -d 設定ファイル
$ logrotate コマンドは通常 /etc/cron.daily/logratate によって 1 日 1 回実行される。
テキスト操作
ログ閲覧時に利用することがある。