Shellスクリプト

【Shell-Tips】シスログへメッセージを出力する。

2020年5月1日

システム運用を行う上で、システムが正常に稼働していることを確認するための監視運用は必須の項目となります。

大規模な設備を備えたデータセンター等は、監視サービスを提供しているところが多いですが、監視対象の項目数制限や追加料金等で桁違いの額を要求されることが一般的です。

例えば、ログを監視するサービスを活用するにしても、httpd(webアラートログ),oracle(DBアラートログ)等のように、監視対象となるログファイルが複数に分散している場合、当然別々の料金がかかってしまいます。

出来れば、可能な限り監視対象となるファイルは一元化しておくことが、金額面以外にもメンテナンス性からみても都合が良いのは明白です。

実際には、障害発生時のログ(アラート情報)は、すべてシステムログへ出力することで監視対象ファイルの一元化を測ることが一般的です。

そこで、シェルスクリプトからシステムログへアラートログを書き込む関数を作成します。

シスログ出力機能を実装する

前提

Beエンジニアでシェルスクリプトを実行する環境は下記の通り

ディレクトリ構成

  • BASE_DIR(任意のディレクトリ)
    • scripts
      • bin(実行スクリプト格納領域)
        • func.sh 👈 シェルスクリプトからログ出力関数を呼び出します。
      • com(共通スクリプト格納領域)
        • com_func.shrc(共通関数定義ファイル)👈 このファイルへシステムログ出力ロジックを作成します。
      • etc(設定ファイル等の格納領域)
        • message.conf(メッセージ定義ファイル)
      • log(スクリプト実行ログの格納領域)
        • スクリプト名.log
      • tmp(テンポラリ領域)
      • rep(レポート出力領域)

外部ファイルは「 <BASE_DIR>/scripts/etc/message.conf 」配下へ作成されるものとして作成します。

メッセージ定義ファイルの作成

今回は、指定された引数の数が正しくなかった場合(引数の値が2つ未満の場合にエラー)、システム(/var/log/messages)ログへエラーメッセージを出力します。
引数が最低3つ以上無いとエラーとします。

message.conf

E-00001 user.err "The number of arguments is incorrect. args_count: ["$#"]"

前回使用したメッセージ定義ファイルをそのまま流用します。

シスログ出力関数の作成

この記事で作成するログ出力ロジックの対象は下記を想定しています。

標準出力ログを${LOG_PATH}/<スクリプト名>.logへ出力します。

1-6行目:コメント

7行目:関数「logSys ()」の宣言

8行目:第一引数(メッセージID)を${msgId}へ格納

9行目:引数をシフト(メッセージIDを除いた引数を取得したメッセージへ使用する)

10行目:ファシリティー取得

11行目:メッセージ定義ファイルから、引数に指定された番号のメッセージを取得して変数へ格納

12行目:システムログに「日時 ホスト名 ユーザー名: sysMsg」を記録する場合の出力

13行目:ログの各行に指定したタグを出力する場合の出力

12行目と13行目は、監視対象となる文字列に合わせて選択してください。

共通関数定義ファイルへの実装

関数が増えていくたびに共通関数定義ファイルが長くなってしまうので、前回までの作成関数などは、省略しています。

呼び出し側のシェルスクリプト作成

52行目:シスログ出力関数の呼び出し 

書式:logSys "メッセージID" "全引数"

システムログ出力関数の実行

あえてエラーを発生させるために引数を「No1 No2」の2つで実行させます。

# 実行シェルスクリプトからエラーログの出力テスト
$ <BASE_DIR>/scripts/bin/func.sh No1 No2

ちょっと分かりずらいですが、10行目と11行目が出力結果です。

例として、ログ監視サービスへ、10行目と11行目の[ARGS_NUM_ERR] を監視対象文字として設定しておくことで、ログ監視サービスは、障害発生時にこの文字列がログに出現次第、エスカレーション動作(アラートメールを担当者に送る等)を実行すると言った感じです。監視対象ファイルがシスログに一元化できることがメリットです。

本スクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。

よく読まれている記事

1

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shellスクリプト

Copyright© Beエンジニア , 2020 All Rights Reserved.