Shell の基礎知識

【Shell-Tips】簡単なログ出力ロジックを作ってみました。

商用プロジェクトは1から100に至るまで、すべてエビデンスの世界です。

システムに障害は付きものですので、障害報告を行う際には、必ず「1次報告」「中間報告」「最終報告」をエビデンス付きで提出しなければなりません。

シェルスクリプトを作成する場合、予め障害が発生することを念頭に入れて設計を進めていきます。

基盤として挙げるなら「CPU」や「メモリ」、「ディスク」など、リソース周りの障害は約束されていることです。

では、そのエビデンスとして必要になるものは何でしょう?

エビデンスとして必ず必要になるものとは、ずばり「ログ」です。

実行から障害に至るまでの経緯を時系列にログとして記録していなければ、対象方法が見つかりません。

ログ出力なくしてシステム開発にあらず!

システムの成功は、すべて「ログの出力の有無」にかかっているといっても過言ではありません!

そこで、ちょっとしたログ出力のロジックを作成してみることにしました。

ログ出力機能を実装する

前提

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

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • func.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • comFunc.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • message.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

ログは、すべて「scripts/log/」配下へ出力されるようにロジックを作成します。

ログ出力関数の作成

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

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

ログの開始関数

実行シェルスクリプトが起動する際に呼び出され「SCRIPT:[ func.sh ] PID:[ 11223 ] STARTED LOG.」メッセージを出力し、実行シェルが起動したことを通知します。

1-5行目:コメント

6行目:関数「startLog ()」の宣言

8行目:ログファイルの作成、及び追記標準エラーと標準出力を追記

9行目:開始メッセージを出力

ログの終了関数

実行シェルスクリプトが終了する間際に呼び出され「SCRIPT:[ func.sh ] PID:[ ●●●● ] ENDED LOG with NOMAL.」メッセージを出力し、実行シェルが終了したことを通知します。

1-6行目:コメント

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

8行目:終了ステータスを引数で受け取る( 未設定の場合は2を挿入)

9-14行目:「終了ステータス」の選択
終了ステータス毎に出力メッセージを変更(Case文)

15行目:終了ログのメッセージ出力(logOut)

16行目:シェルスクリプトを終了する(exit文)

ログ出力関数

実行シェル起動後に、任意のタイミングでメッセージを出力します。

1-6行目:コメント

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

8行目:ログファイルへ出力要素を整形しながら出力する
「printf」コマンドは、データを整形して表示するコマンドです。ここでは、実行領域「var」「func」「pre」「main」「post」をログ出量時に”[ ]”で括っています。

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

実際に「comFunc.sh(共通関数定義ファイル)」へ実装すると下記のようになります。

[ <BASE_DIR>/scripts/com/comFunc.shrc ]

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

「func.sh(実行シェルスクリプト)」へ実装すると下記の様になります。
「func.sh」は「template.sh」を基に作成しています。

[ template.sh ]は、【Shellの基礎知識】で解説しています。下記のリンクページを参照してください。

[ <BASE_DIR>/scripts/bin/func.sh ]

ログ出力関数の実行

では、実際に「func.sh」を実行してみましょう。

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

「<BASE_DIR>/scripts/log/」配下へ「func.log」が作成され、その中に標準出力がログとして記載されているのが分かります。

この記事では、簡単なログの出力ロジックの作成までを行いました。ただし、ここで作成したシェル出力ロジックには、あくまでも最低限必要なログの出力機能しか盛り込んでいません!

実際に現場で使用するには、さらに「ログレベルの設定(FATAL | ERROR | WARN | INFO | DEBUG | TRACE)」や「出力文字コードの設定(UTF-8 | SJIS)」などの改良が必要となることに注意してください。

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

よく読まれている記事

1

Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロンプト画面を開いているとき、常にShellは起動している状態です。 「Shell」とは ...

2

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

3

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

4

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

-Shell の基礎知識