Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【ログ出力設定】rsyslogとloggerコマンド。

実施環境:RHEL7.3

ログ出力は重要です。RHEL7におけるrsyslogとloggerコマンドによるログ出力の一例を記載します。
サーバー名がclash royalなのは私の好きなゲームです。気にしないでください。(笑)

まずは、理解のため、ユーザーアプリケーション等のためのログ出力を行います。
出力したいログファイル名:/root/test/test_tool.log

①ログファイルの準備

[root@clash_royale ~]# mkdir -p /root/test
[root@clash_royale ~]# cd /root/test
[root@clash_royale test]# touch test_tool.log
[root@clash_royale test]# ls -l /root/test/*
-rw-r--r-- 1 root root 0 6月 26 21:23 /root/test/test_tool.log

空のログファイルができました。

②rsyslog設定

【まずは起動確認】
[root@clash_royale ~]# systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since 金 2020-06-26 18:28:01 JST; 2h 44min ago
Main PID: 2661 (rsyslogd)
CGroup: /system.slice/rsyslog.service
mq2661 /usr/sbin/rsyslogd -n

6月 26 18:28:01 clash_royale systemd[1]: Starting System Logging Service...
6月 26 18:28:01 clash_royale systemd[1]: Started System Logging Service.

【設定ファイル修整!/etc/rsyslog.conf】
[root@clash_royale ~]# ls -l /etc/rsyslog.conf
-rw-r--r-- 1 root root 3429 6月 26 18:27 /etc/rsyslog.conf

気にすべきはこの辺でス。↓↓↓
別のサーバー(管理サーバーなど)へログ出力を飛ばすことなどができますが、今回は記載しません。
必要ないところは省略してます。

[root@clash_royale ~]# cat /etc/rsyslog.conf
#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
#mail.none;authpriv.none;cron.none;                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

1行の見方としては
ファシリティ.プライオリティ アクション
となります。

ファシリティとは出力対象ログ、プライオリティとはサービスのメッセージ種別、アクションとは出力先ログファイルとなります。

ファシリティ一覧↓↓↓

facility 対象のログ
authpriv 認証サービス
cron cronのメッセージ
kern カーネルのメッセージ
lpr プリンタサービスのメッセージ
mail メールサービスのメッセージ
user ユーザープロセスのメッセージ
uucp uucp転送を行うプログラムのメッセージ
local0~7 独自に利用できるファシリティ

プライオリティ一覧↓↓↓

priority 内容
emerg システムが停止するようなエラーを示すメッセージ
alert 緊急に対処すべきエラーを示すメッセージ
crit ハードウェアの傷害など致命的なエラーを示すメッセージ
err 一般的なエラーメッセージ
warning 警告メッセージ
notice 通知メッセージ
info 一般的な情報メッセージ
debug デバッグメッセージ
none ログメッセージ出力しない設定
* すべてのプライオリティを示す

プライオリティには=も使えます。.だけだと例えばinfo「以上」の情報を出力となるのですが、.=infoだとinfo情報「のみ」となります。

今回やりたいことはユーザーアプリケーションなのでlocal0にtest_tool.logへの出力設定しましょう。
(なぜかlocal7はデフォルトで使用されていることに注意してください。
# Save boot messages also to boot.logの箇所ですね。)

では、/etc/rsyslog.confに以下を追記します。

\#tool.log
local0.info                                             /root/test/test_tool.log

追記したらrsyslogを再起動します。

[root@clash_royale test]# systemctl restart rsyslog
[root@clash_royale test]# systemctl status rsyslog
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since 金 2020-06-26 21:49:38 JST; 2min 40s ago
 Main PID: 2787 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           mq2787 /usr/sbin/rsyslogd -n

 6月 26 21:49:38 clash_royale systemd[1]: Starting System Logging Service...
 6月 26 21:49:38 clash_royale systemd[1]: Started System Logging Service.

これでログ出力設定は完了になります。実際にログが出力されることを確認しましょう!

出力テスト

コマンド実行コンソールと出力確認コンソールを立ち上げ、監視します。
【出力確認コンソール】

[root@clash_royale ~]# tail -f /root/test/test_tool.log



では実際に出力させます。ここでは、info情報として、info_test_dazeと出力させることにします。
【コマンド実行コンソール】

[root@clash_royale test]# logger -p local0.info "info_test_daze"

【すると出力確認コンソールに。。。】

[root@clash_royale ~]# tail -f /root/test/test_tool.log
Jun 26 21:54:11 clash_royale root: info_test_daze

無事出力できましたー。

エラーログも実施してみる。
【コマンド実行コンソール】

[root@clash_royale test]# logger -p local0.err "err_test_daze"

【出力確認コンソール】

[root@clash_royale ~]# tail -f /root/test/test_tool.log
Jun 26 21:54:11 clash_royale root: info_test_daze
Jun 26 22:00:06 clash_royale root: err_test_daze

これでログ出力の感覚がつかめたかと思います。

では簡単な(雑な)shellを作ってみましょう。

#!/bin/sh

a=1; b=3;

if [ -e kekka.txt ]; then
  echo $((a+b)) >> kekka.txt;
  logger -p local0.info "kekka.txtに実行結果を出力したよ"
else
  logger -p local0.err "kekka.txtがないよ"
  exit 10
fi

exit 0

kekka.txtファイルがある場合、4と追記し、なかった場合異常終了し、/root/test/test_tool.logに
kekka.txtがないよとログ出力するだけのshellです。こんな雑なshellで説明してすいません。

小話

とあるサーバーでrsyslog.confの、SYSLOG(/var/log/messages)への設定を行に*.infoが先頭に入っていました。
これにより、local0を作成すると、自動でSYSLOGへinfo情報以上すべて記録されてしまいます。

しかし、要件ではlocal0のERROR以上をSYSLOG出力へ出力したいんだよなー。って時がありました。
さあどうする。素直にlocal0.errをSYSLOGの行に追記してもinfo情報は記録されます。
(*.infoによりlocal0.infoも記録されているのです。)

以下で解決しました。

*.info;mail.none;authpriv.none;cron.none;local0.none;local0.err                /var/log/messages

そうです。一度noneで打ち消し、errを上書き!(笑)
個人的にはイケてない気がするので、*.infoとかっていう書き方好きじゃないなー。と思った次第です。

NAKASHOU
ORACLEDB屋。27歳。沖縄出身。都内の小さな会社のサラリーマン。 Oracle Master 11g gold pythonは素人。 投稿は勉強用。とても雑なので仕事に使わないでください!orz 連絡先:jmp.dada@gmail.com
https://nakashoublog.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away