Ubuntu、Debian、CentOSでLinuxのログを表示および設定する方法
はじめに
Linux システムの管理者は、トラブルシューティングの目的でログファイルを確認することがよくあります。これは、システム管理者が最初に行うことの一つです。
Linuxとそれが上で動作するアプリケーションは、さまざまなログファイルに記録されるさまざまなタイプのメッセージを生成することができます。 Linuxは一連の設定ファイル、ディレクトリ、プログラム、コマンド、およびデーモンを使用して、これらのログメッセージを作成、保存、再利用します。システムがログファイルを保存している場所と関連するコマンドを使用する方法を知っていることは、トラブルシューティング中に貴重な時間を節約するのに役立ちます。
このチュートリアルでは、Linuxのログ記録メカニズムのさまざまな部分を見ていきます。
免責事項
このチュートリアルのコマンドは、CentOS 9、Ubuntu 22.10、およびDebian 11のプレーンバニラインストールでテストされました。
ステップ1 – デフォルトのログファイルの場所を確認します。
Linuxにおけるログファイルのデフォルトの保存場所は「/var/log」です。以下のコマンドを使用して、このディレクトリ内のログファイルの一覧を表示することができます。
- ls -l /var/log
あなたのCentOSシステムでは、これに類似したものが表示されます。
[root@centos-9-trim ~]# ls -l /var/log total 49316 drwxr-xr-x. 2 root root 6 Sep 27 19:17 anaconda drwx——. 2 root root 99 Jan 3 08:23 audit -rw-rw—-. 1 root utmp 1234560 Jan 3 16:16 btmp -rw-rw—-. 1 root utmp 17305344 Jan 1 00:00 btmp-20230101 drwxr-x—. 2 chrony chrony 6 Aug 10 2021 chrony -rw-r–r–. 1 root root 130466 Dec 8 22:12 cloud-init.log -rw-r—–. 1 root adm 10306 Dec 8 22:12 cloud-init-output.log -rw——-. 1 root root 36979 Jan 3 16:03 cron -rw——-. 1 root root 27360 Dec 10 23:15 cron-20221211 -rw——-. 1 root root 94140 Dec 17 23:07 cron-20221218 -rw——-. 1 root root 95126 Dec 24 23:14 cron-20221225 -rw——-. 1 root root 95309 Dec 31 23:04 cron-20230101 …
ステップ2 – ログファイルの内容を表示する
以下は、/var/logディレクトリ内で見つけることができる一般的なログファイルです。
- wtmp
- utmp
- dmesg
- messages
- maillog or mail.log
- spooler
- auth.log or secure
wtm および utmp ファイルは、ユーザーのシステムへのログインおよびログアウトを追跡します。これらのファイルの内容を端末上で直接 cat コマンドを使用して読むことはできません。そのため、その他の特定のコマンドを使用する必要があり、これらのコマンドのいくつかを使用します。
Linuxサーバーに現在ログインしているユーザーを確認するには、whoコマンドを使用します。このコマンドは、/var/run/utmpファイル(CentOSとDebianの場合)または/run/utmp(Ubuntuの場合)から値を取得します。
以下はUbuntuからの例です。
root@ubuntu-22:~# who root pts/0 2023-01-03 16:23 (198.211.111.194)
この特定の場合において、私たちはシステムの唯一の利用者です。
最後のコマンドはユーザーのログイン履歴を表示してくれます。
root@ubuntu-22:~# last root pts/0 198.211.111.194 Tue Jan 3 16:23 still logged in reboot system boot 5.19.0-23-generi Thu Dec 8 21:48 still running wtmp begins Thu Dec 8 21:48:51 2022
特定のユーザーを検索するために、最後のコマンドにパイプ(|)を使用することもできます。
システムが最後に再起動された日時を知るためには、以下のコマンドを実行することができます。
- last reboot
デビアンでの結果は、以下のようになる場合があります。 (Debianでの結果は、以下のようになる可能性があります。)
root@debian-11-trim:~# last reboot reboot system boot 5.10.0-11-amd64 Thu Dec 8 21:49 still running wtmp begins Thu Dec 8 21:49:39 2022
最後に誰がシステムにログインしたかを確認するには、lastlogを使用します。
- lastlog
Debianサーバー上では、次のような出力が表示される可能性があります。
root@debian-11-trim:~# lastlog Username Port From Latest root pts/0 162.243.188.66 Tue Jan 3 16:23:03 +0000 2023 daemon **Never logged in** bin **Never logged in** sys **Never logged in** sync **Never logged in** games **Never logged in** man **Never logged in** lp **Never logged in** mail **Never logged in** news **Never logged in** uucp **Never logged in** proxy **Never logged in** www-data **Never logged in** backup **Never logged in** list **Never logged in** irc **Never logged in** gnats **Never logged in** nobody **Never logged in** _apt **Never logged in** messagebus **Never logged in** uuidd **Never logged in** …
他のテキストベースのログファイルでは、cat、head、またはtailコマンドを使用して内容を読むことができます。
以下の例では、Debianサーバーの/var/log/messagesファイルの最後の10行を見ようとしています。
- sudo tail /var/log/messages
あなたはこのような出力を受け取るでしょう。
root@debian-11-trim:~# tail /var/log/messages Jan 1 00:10:14 debian-11-trim rsyslogd: [origin software=”rsyslogd” swVersion=”8.2102.0″ x-pid=”30025″ x-info=”https://www.rsyslog.com”] rsyslogd was HUPed Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 ssh_watcher.go:65: [SSH Watcher] Port knocking detected. Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:43: [DO-Managed Keys Actioner] Metadata contains 1 ssh keys and 1 dotty keys Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:49: [DO-Managed Keys Actioner] Attempting to update 1 dotty keys Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:70: [DO-Managed Keys Actioner] Updating 2 keys Jan 3 16:23:01 debian-11-trim vServerAgent[808]: INFO:2023/01/03 16:23:01 do_managed_keys_actioner.go:75: [DO-Managed Keys Actioner] Keys updated
ステップ3 – rsyslogデーモンの使用
ログメカニズムの中心にあるのは、rsyslogデーモンです。このサービスは、Linuxシステムのさまざまな部分からのログメッセージを受信し、メッセージを適切なログファイル(/var/logディレクトリ内)にルーティングする役割を担っています。また、ログメッセージを別のLinuxサーバーに転送することもできます。
rsyslogの設定ファイル
rsyslogデーモンは、rsyslog.confファイルから設定情報を取得します。ファイルは/etcディレクトリの中にあります。
rsyslog.confファイルは、rsyslogデーモンにログメッセージを保存する場所を指示します。この指示は、ファイル内の2つのパートからなる一連の行から来ます。
このファイルは「Ubuntu」の「rsyslog.d/50-default.conf」にあります。
二つの部分からなる指示は、セレクタとアクションで構成されています。この二つの部分は、空白で区切られています。
セレクタパートは、ログメッセージのソースと重要性を指定し、アクションパートはメッセージの処理方法を示します。
セレクター自体は、ドット(.)によって分かれている2つの部分に分けられます。ドットの前の最初の部分は「施設(メッセージの発信元)」と呼ばれ、ドットの後の2番目の部分は「優先度(メッセージの深刻さ)」と呼ばれます。
施設/優先度とアクションの組合わせは、条件に合致するログメッセージが生成された場合に、rsyslogに何をするかを伝えます。
このコマンドを使用すると、CentOSの/etc/rsyslog.confファイルの抜粋を見ることができます。
- cat /etc/rsyslog.conf
出力結果はこのようになるはずです。
# rsyslog configuration file # For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html # or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html # If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html #### GLOBAL DIRECTIVES #### # Where to place auxiliary files global(workDirectory=”/var/lib/rsyslog”) # Use default timestamp format module(load=”builtin:omfile” Template=”RSYSLOG_TraditionalFileFormat”) # Include all config files in /etc/rsyslog.d/ include(file=”/etc/rsyslog.d/*.conf” mode=”optional”) #### MODULES #### module(load=”imuxsock” # provides support for local system logging (e.g. via logger command) SysSock.Use=”off”) # Turn off message reception via local log socket; # local messages are retrieved through imjournal now. module(load=”imjournal” # provides access to the systemd journal StateFile=”imjournal.state”) # File to store the position in the journal #module(load=”imklog”) # reads kernel messages (the same are read from journald) #module(load=”immark”) # provides –MARK– message capability # Provides UDP syslog reception # for parameters see http://www.rsyslog.com/doc/imudp.html #module(load=”imudp”) # needs to be done just once #input(type=”imudp” port=”514″) …
これがすべてどういう意味を持つのかを理解するために、Linuxで認識されているさまざまな種類の施設について考えてみましょう。以下にリストを示します。
- auth or authpriv: Messages coming from authorization and security related events
- kern: Any message coming from the Linux kernel
- mail: Messages generated by the mail subsystem
- cron: Cron daemon related messages
- daemon: Messages coming from daemons
- news: Messages coming from network news subsystem
- lpr: Printing related log messages
- user: Log messages coming from user programs
- local0 to local7: Reserved for local use
そして、以下は優先順位の昇順に表示されたリストです。
- debug: Debug information from programs
- info: Simple informational message – no intervention is required
- notice: Condition that may require attention
- warn: Warning
- err: Error
- crit: Critical condition
- alert: Condition that needs immediate intervention
- emerg: Emergency condition
では、今考えてみましょう。次のファイルから次の行を考えてみましょう。
… # Log cron stuff cron.* /var/log/cron …
以下は、日本語での表現例です:
この設定は、rsyslogデーモンに対してクーロンデーモンから送られてくるすべてのメッセージを、/var/log/cronというファイルに保存するよう指示します。ドットの後ろのアスタリスク(*)は、すべての重要度のメッセージがログに記録されることを意味します。同様に、施設がアスタリスクで指定されている場合、すべてのソースを意味します。
設備と優先順位は、さまざまな方法で関連付けることができます。
デフォルトの形式では、ドットの後に優先度が1つだけ指定されている場合、その優先度以上のすべてのイベントがトラップされることを意味します。したがって、次のディレクティブにより、警告以上の優先度を持つメールサブシステムからのメッセージは、/var/logの特定のファイルにログが記録されます。
mail.warn /var/log/mail.warn
これにより、warn以上のすべてのメッセージが記録されますが、それ以下のすべてのメッセージは残します。従って、err、crit、alert、またはemergのメッセージもこのファイルに記録されます。
ドットの後ろに等号(=)を使うと、指定した優先度のみが記録されます。したがって、メールサブシステムからの情報メッセージのみをトラップしたい場合、以下のような仕様になります。
mail.=info /var/log/mail.info
もし私たちが、情報メッセージ以外のすべてのメールサブシステムをトラップしたい場合、仕様は以下のようになります。
mail.!info /var/log/mail.info
または
mail.!=info /var/log/mail.info
最初の場合、mail.infoファイルにはinfoよりも低い優先度のすべてが含まれます。2番目の場合、ファイルにはinfo以上の優先度を持つすべてのメッセージが含まれます。
同じ行にある複数の設備は、カンマで区切ることができます。
同一行内の複数のソース(facility.priority)はセミコロンで区切られます。
アクションにアスタリスクが付与されている場合、すべてのユーザーを指します。CentOSのrsyslog.confファイルのこのエントリはまさにそれを示しています。
# Everybody gets emergency messages *.emerg :omusrmsg:*
Linuxシステムにおけるrsyslog.confファイルの内容を確認してみてください。以下はDebianサーバーの一部の例です。
# /etc/rsyslog.conf configuration file for rsyslog # # For more information install rsyslog-doc and see # /usr/share/doc/rsyslog-doc/html/configuration/index.html ################# #### MODULES #### ################# module(load=”imuxsock”) # provides support for local system logging module(load=”imklog”) # provides kernel logging support #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″) ########################### #### GLOBAL DIRECTIVES #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # # Set the default permissions for all log files. # $FileOwner root $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 …
ご覧の通り、Debianはセキュリティ/認証レベルのメッセージを全て/var/log/auth.logに保存していますが、CentOSはそれを/var/log/secure以下に保存しています。
rsyslogの設定は他のカスタムファイルからも取得できます。これらのカスタム設定ファイルは通常、/etc/rsyslog.dの異なるディレクトリに配置されています。rsyslog.confファイルは$IncludeConfigディレクティブを使ってこれらのディレクトリを含みます。
Ubuntuでは、これがどのように見えます。
… # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf …
「/etc/rsyslog.d」ディレクトリ内の内容を確認してください。
- ls -l /etc/rsyslog.d
ターミナルには、これに似たものが表示されます。
-rw-r–r– 1 root root 314 Sep 19 2021 20-ufw.conf -rw-r–r– 1 root root 255 Sep 30 22:07 21-cloudinit.conf -rw-r–r– 1 root root 1124 Nov 16 2021 50-default.conf
ログメッセージの送信先は必ずしもログファイルである必要はありません。メッセージはユーザーのコンソールに送られることもあります。この場合、アクションフィールドにはユーザー名が含まれています。複数のユーザーにメッセージを送る必要がある場合、ユーザー名はカンマで区切られます。メッセージをすべてのユーザーにブロードキャストする必要がある場合、アクションフィールドにはアスタリスク( * )が指定されます。
ネットワークオペレーティングシステムの一部であるrsyslogデーモンは、ログメッセージをローカルに保存するだけでなく、ネットワーク内の別のLinuxサーバーに転送したり、他のシステムのレポジトリとして機能することもできます。デーモンはUDPポート514でログメッセージを受信します。以下の例では、カーネルの重要なメッセージを「texas」というサーバーに転送します。
kern.crit @texas
ステップ4 – 自分自身のログメッセージの作成とテスト
では、今あなた自身でログファイルを作成する時です。これをテストするために、以下の手順を行います。
- Add a log file specification in /etc/rsyslog.conf file
- Restart the rsyslog daemon
- Test the configuration using the logger utility
次の例では、CentOS Linuxシステムのrsyslog.confファイルに2つの新しい行を追加します。次のコマンドでわかるように、それぞれの行はlocal4という施設から来ており、異なる優先度を持っています。
- vi /etc/rsyslog.conf
こちらが出力結果です。
… # New lines added for testing log message generation local4.crit /var/log/local4crit.log local4.=info /var/log/local4info.log
次に、設定ファイルのデータを再読み込みするためにサービスを再起動してください。
- /etc/init.d/rsyslog restart
現在、ログメッセージを生成するために、ロガーアプリケーションが呼び出されています。
- logger -p local4.info ” This is a info message from local 4″
「/var/log」ディレクトリを見ると、2つの新しいファイルが表示されます。
… -rw——- 1 root root 0 Jan 3 11:21 local4crit.log -rw——- 1 root root 72 Jan 3 11:22 local4info.log …
ローカル4情報ログのサイズは非ゼロです。したがって、開くと、メッセージが記録されていることがわかります。
- cat /var/log/local4info.log
Jan 3 11:22:32 TestLinux root: This is a info message from local 4
ステップ5 – ローテーションログファイル
ログファイルへの情報の書き込みがますます増えると、ファイルのサイズもどんどん大きくなっていきます。これは明らかにパフォーマンスの潜在的な問題を引き起こします。また、ファイルの管理も手間がかかってきます。
Linuxは、ログファイルを削除する代わりに、回転させるというコンセプトを使用しています。ログが回転されると、新しいログファイルが作成され、古いログファイルは名前が変更され、オプションで圧縮されます。そのため、ログファイルには複数の古いバージョンがオンラインで残ります。これらのファイルは一定期間さかのぼり、過去の履歴を表します。一定数のバックログが生成されると、新しいログの回転により最も古いログファイルが削除されます。
ログローテートユーティリティを介して回転が開始されます。
logrotateの設定ファイル
rsyslogと同様に、logrotateも設定ファイルに依存しており、このファイルの名前はlogrotate.confです。それは/etcの下にあります。
あなたのDebianサーバーのlogrotate.confファイルには、次のような内容が表示されます。
- cat /etc/logrotate.conf
# see “man logrotate” for details # global options do not affect preceding include directives # rotate log files weekly weekly # 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.
デフォルトでは、ログファイルは週ごとにローテーションされ、最大で4つのログファイルがオンライン上に保持されます。プログラムが実行されると、新しい空のログファイルが生成され、オプションで前のログファイルが圧縮されることがあります。
唯一の例外は、wtmpとbtmpのファイルです。wtmpはシステムのログインを記録し、btmpは不正なログイン試行を記録します。これらのログファイルは、毎月回転させることが求められ、前のwtmpまたはbtmpファイルが見つかった場合でもエラーは返されません。
カスタムのログローテーション設定は、/etc/logrotate.dディレクトリ内に保存されます。これらはincludeディレクティブを使用してlogrotate.confにも含まれています。デビアンのインストールでは、このディレクトリの内容が表示されます。
- ls -l /etc/logrotate.d
total 32 -rw-r–r– 1 root root 120 Jan 30 2021 alternatives -rw-r–r– 1 root root 173 Jun 10 2021 apt -rw-r–r– 1 root root 130 Oct 14 2019 btmp -rw-r–r– 1 root root 160 Oct 19 2021 chrony -rw-r–r– 1 root root 112 Jan 30 2021 dpkg -rw-r–r– 1 root root 374 Feb 17 2021 rsyslog -rw-r–r– 1 root root 235 Feb 19 2021 unattended-upgrades -rw-r–r– 1 root root 145 Oct 14 2019 wtmp
rsyslogの内容では、複数のログファイルをリサイクルする方法が示されています。
- cat /etc/logrotate.d/rsyslog
/var/log/syslog /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages { rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript }
毎日、メッセージファイルは再初期化され、4日分のログがオンラインで保持されます。他のログファイルは週ごとにローテーションされます。
また、注意すべきポイントとしてpostrotateディレクティブがあります。これは、ログの全体的なローテーションが完了した後に行われるアクションを指定します。
ステップ6 – 回転のテスト
logrotateは、1つ以上のファイルをリサイクルするために手動で実行することができます。それを行うには、コマンドの引数として関連する設定ファイルを指定します。
これがどのように機能するかを確認するために、テスト用CentOSサーバーの/var/logディレクトリ内のログファイルの一部のリストをご覧ください。
- ls -l /var/log
total 49324 … -rw——-. 1 root root 84103 Jan 3 17:20 messages -rw——-. 1 root root 165534 Dec 10 23:12 messages-20221211 -rw——-. 1 root root 254743 Dec 18 00:00 messages-20221218 -rw——-. 1 root root 217810 Dec 25 00:00 messages-20221225 -rw——-. 1 root root 237726 Dec 31 23:45 messages-20230101 drwx——. 2 root root 6 Mar 2 2022 private drwxr-xr-x. 2 root root 6 Feb 24 2022 qemu-ga lrwxrwxrwx. 1 root root 39 Mar 2 2022 README -> ../../usr/share/doc/systemd/README.logs -rw——-. 1 root root 2514753 Jan 3 17:25 secure -rw——-. 1 root root 2281107 Dec 10 23:59 secure-20221211 -rw——-. 1 root root 9402839 Dec 17 23:59 secure-20221218 -rw——-. 1 root root 8208657 Dec 25 00:00 secure-20221225 -rw——-. 1 root root 7081010 Dec 31 23:59 secure-20230101 drwxr-x—. 2 sssd sssd 6 Jan 17 2022 sssd -rw——-. 1 root root 0 Dec 8 22:11 tallylog -rw-rw-r–. 1 root utmp 2688 Jan 3 16:22 wtmp
logrotate.confファイルの一部の内容は次のようになっています:
- cat /etc/logrotate.conf
# see “man logrotate” for details # global options do not affect preceding include directives # rotate log files weekly weekly # 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 be also be configured here.
次に、ログローテーションコマンドを実行します。
- logrotate -fv /etc/logrotate.conf
新しいファイルが生成されたり、エラーが発生したりすると、メッセージがスクロールして表示されます。状況が落ち着いた後、新規メール、セキュリティ、またはメッセージのファイルを確認します。
- ls -l /var/log/mail*
-rw——- 1 root root 0 Dec 17 18:34 /var/log/maillog -rw——-. 1 root root 1830 Dec 16 16:35 /var/log/maillog-20131216 -rw——- 1 root root 359 Dec 17 18:25 /var/log/maillog-20131217
- ls -l /var/log/messages*
-rw——- 1 root root 148 Dec 17 18:34 /var/log/messages -rw——-. 1 root root 180429 Dec 16 16:35 /var/log/messages-20131216 -rw——- 1 root root 30554 Dec 17 18:25 /var/log/messages-20131217
ls -l /var/log/secure*
-rw------- 1 root root 0 Jan 3 12:34 /var/log/secure
-rw-------. 1 root root 4187 Jan 3 16:41 /var/log/secure-20230103
-rw------- 1 root root 591 Jan 3 18:28 /var/log/secure-20230103 ```
私たちは分かるように、新たに作成された3つのログファイルを確認できます。メールログとセキュアファイルはまだ空ですが、新しいメッセージファイルには既にいくつかのデータがあります。
結論
このチュートリアルでLinuxのロギングについてのアイデアを得ることができればと思います。ご自身の開発やテストシステムを調べて、より良い理解を得ることができます。ログファイルの場所や設定に慣れたら、その知識を生産システムのサポートに活用してください。また、これらのファイルを指すエイリアスを作成することで、入力時間を節約することもできます。