ログの基本 〜syslogとWebサーバのログ〜
概要
ログとは何か、システムでのログの収集と管理の方法やその設定について、代表的なsyslogについてまとめました。またWebサーバーの主なものの一つであるApacheでのログの取り扱いについての基本をまとめました。
この記事でのサンプルの実行環境
OS Amazon Linux2
ログの基本
ログとは
プログラムが実行された時に、あらかじめ設定された出力先へプログラムの情報を出力したもの。
syslogはログの基本
Unix系OSではログといえばsyslogと言われています。
Mail(SMTP:Simple Mail Transfer Protocol)サーバの代表的なアプリケーションであるsendmailのログアプリケーションとして開発されたのが始まりで、これが便利とわかってFTPなど他のサーバでも使われるようになって広がりました。
syslogの基本機能① ログの書き込み
1つ目の機能がログの書き込みです。
例えば上図のように、MailサーバーやFTPサーバーからのログ情報をsyslogがどのサーバからのログか確認し、各サーバ用のログファイルへ書き込みます
syslogの基本機能② ログの収集
二つ目の機能はログの収集機能管理機能で、複数のサーバのログ情報を一台のログ専用サーバーで集中的に収集し管理する機能です。
例えば上図のように、MailサーバとFTPサーバのそれぞれのログ情報をsyslogの二つ目の機能でログサーバへ転送し、その後ログサーバ内のsyslogでそのログ情報をサーバー毎に判別して各サーバ用のログファイルに出力します(1つ目の機能)
現在のsyslog
現在はsyslogの改定版アプリケーションとして二つのアプリケーションがあります
1. syslog-ng
syslogプロトコルのサポートに加え以下のような機能が実装されています
- ログの分類機能
- TCPによるログの送受信(ログ情報紛失の回避)
- SSL/TLSを使用したセキュアログ
- データベースへのログ出力
2. rsyslog
rsyslog: rocket-fast system for logの略。syslogプロトコルのサポートはもちろん、以下の機能が実装されています
- ログの分類機能
- TCPによるログの送受信
- SSL/TLSを使用したセキュアログ
- データベースへのログ出力
CentOS6やDebianでrsyslogが採用されています
syslogへコマンドを使って出力してみる
psコマンドでsyslogのプロセスを確認
ps ax | grep syslog
602 pts/0 S+ 0:00 grep --color=auto syslog
3199 ? Ssl 0:00 /usr/sbin/rsyslogd -n
loggerコマンドにより、syslogにログ情報を渡します。
-pオプションでそのログのファシリティとプライオリティを指定します。
logger -p authpriv.info secure-log
tailコマンドでログを確認
sudo tail -f /var/log/secure
Nov 4 08:01:41 ip-172-31-44-123 ec2-user: secure-log
Nov 4 08:01:44 ip-172-31-44-123 ec2-user: secure-log
Nov 4 08:01:50 ip-172-31-44-123 ec2-user: secure-log
syslogの設定については /etc/rsyslog.conf
ファイルで確認できます
syslogのfacilityやpriolityなどに関して、syslogはプロトコルとしてRFCに定義されています。詳細はこちらを参考にしてください。
https://tools.ietf.org/html/rfc5424
Webサーバのログを確認(Apache)
httpd(Apache)のインストールと起動設定
sudo yum install httpd
sudo systemctl start httpd
httpdの起動を確認
systemctl status httpd.service
実行結果でターミナルに Active: active(running)
と表示されれば起動しています
Apacheの設定ファイルを確認
Apacheの基本設定は /etc/httpd/conf/httpd.conf
で行います。
このうちログに関する設定は447行目付近から行なっています。
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog "logs/error_log"
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
#CustomLog "logs/access_log" common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
CustomLog "logs/access_log" combined
エラーログの設定
ディレクティブ:ErrorLogを使います。
ErrorLog "logs/error_log"
実際のログファイルのパスはServerRootの設定+ここの設定パス
になります。
つまり /etc/httpd/logs/error_log
となります。
また、関連したディレクトティブにLogLevelがあります。
LogLevel warn
ここで、エラーログを出力するログレベルを指定します。この場合の設定だとログレベルが warn以上だとエラーログへ出力されるようになっています。
アクセスログの設定
ディレクトティブ:CustomLogを使用します。
CustomLog "logs/access_log" combined
実際のログファイルのパスは先ほどのErrorLogと同様にServerRootの設定+ここの設定パス
になります。つまり、/etc/httpd/logs/access_logになります。
フォーマットは combined
を使用します。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
参考:https://httpd.apache.org/docs/2.4/ja/logs.html
Webサイトへアクセスしてログを出力
サーバーのIPアドレスまたはドメイン名をブラウザの検索バーに入力してアクセスする上のようなApacheのTest Pageを表示できます。
tailコマンドを使ってログを確認
エラーログを確認
上のように、Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
とあります。
DirectoryIndex()にマッチするものがなく、Options directiveによって/var/www/html/の提供ができませというようなことがわかります。
エラーを修正
まずデフォルトサイトの設定(/etc/httpd/conf.d/welcome.conf
)を確認します。
# This configuration file enables the default "Welcome" page if there
# is no default index page present for the root URL. To disable the
# Welcome page, comment out all the lines below.
#
# NOTE: if this file is removed, it will be restored on upgrades.
#
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
Optionsディレクトティブで -Indexes
と指定されています。この設定はURLにファイル名が省略されてアクセスされた場合に「もし表示するものがなかったとしてもディレクトリ一覧を表示しない」という意味です。エラーログのNo matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
という内容と一致します。
さらに、上のErrorDocumentディレクトティブで「403が発生したら /.noindex.html
を出力する」と設定されています。このnoindex.html
が先ほどのTest Pageになります。
IPアドレスだけでアクセスした時、Apacheではあらかじめ設定された省略時のデフォルトファイルを探します。そのデフォルトファイルはDirectoryIndexで設定されます。上のデフォルトサイトの設定にはそのDirectoryIndexディレクティブの設定がなかったので基本設定ファイル(/etc/httpd/conf/httpd.conf)
の設定を引き継ぎます。
$ cat /etc/httpd/conf/httpd.conf | grep DirectoryIndex
# DirectoryIndex: sets the file that Apache will serve if a directory
DirectoryIndex index.html
上の結果のように、Apacheではファイル名を指定せずにアクセスした場合は index.htmlを探しにいくように設定されています。
どこのディレクトリのindex.htmlをみにいくのかというと、このケースのサーバーIPを指定した場合はデフォルトサイトのドキュメントルートディレクトリはどこかというのと同義で、上のデフォルトサイトの設定にはなかったのでこれも基本設定ファイルの設定内容を引き継ぐことになります。
$ cat /etc/httpd/conf/httpd.conf | grep DocumentRoot
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/var/www/html"
# access content that does not live under the DocumentRoot.
上の結果よりDocumentRootディレクティブには/var/www/html
と指定されているのでこれがドキュメントルートディレクトリということになります。
まとめると
/var/www/htmlに表示すべきファイル(index.html)が存在しなかったのでディレクトリ一覧を出力しようとしたが禁止されていたので
エラー403を出力した。403の飛び先が /.noindex.htmlと指定されていてそのファイルが返された
上の結果を受けて /var/www/html/配下にindex.htmlファイルを作成することでエラーを解決してみます。
echo 'Hello Apache!!!' > /var/www/html/index.html
再度ブラウザでアクセス
Hello Apache!!!の文字を確認できました。
アクセスログも確認すると
ステータスコード200が返ってくるようになりました。
エラーログについて、
アクセスログと同じ時刻にエラーが表示されてないことを確認できました。
まとめ
代表的なログ管理用のアプリケーションであるsyslogと、代表的なWebサーバの一つであるApacheでのログの扱いについてみていきました。
システムに障害が起きた際に原因を追求できるようにしたり分析できるように今回の基礎的な知識を応用していきたいと思います。
参考
Author And Source
この問題について(ログの基本 〜syslogとWebサーバのログ〜), 我々は、より多くの情報をここで見つけました https://qiita.com/sasakiki/items/7975bad6fb12fbd6158e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .