Shellスクリプト

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

2020年4月26日

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

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

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

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

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

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

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

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

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

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

ログ出力機能を実装する

前提

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

ディレクトリ構成

  • BASE_DIR(任意のディレクトリ)
    • scripts
      • bin(実行スクリプト格納領域)
        • func.sh 👈 シェルスクリプトからログ出力関数を呼び出します。
      • com(共通スクリプト格納領域)
        • com_func.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」をログ出量時に”[ ]”で括っています。

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

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

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

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

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

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

Beエンジニア
Beエンジニア
https://www.pmi-sfbac.org/introduction-shell-01/
未経験からエンジニアになるためのおすすめのITスクールや勉強方法、エンジニア業界への志望動機や転職術、気になる年収まで、業界情報を現役エンジニアがわかりやすく解説

[ <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

独立前は、誰もが不安でいっぱい。近い将来、フリーランスとして独立を考えている方が独立初期に躓かないために「独立前にやるべきことチェックリスト」をご紹介します。 当記事は前編となる「お金まわり編」。全て ...

2

ゲームなどのエンタメ分野での導入が進んでいるVR。言葉自体は耳にしたことがあっても、その意味を詳しく知らないという人も多いのではないでしょうか。また、次世代の新たな技術をビジネスに積極的に活用していく ...

3

フリーランスの確定申告には、青色申告と白色申告の2種類があります。いったいどちらの申告方法を選ぶべきなのでしょうか。 この記事では、青色申告と白色申告、それぞれのメリット・デメリットを把握することでベ ...

4

フリーランスの仕事場は、自宅をはじめとし、カフェや図書館、コワーキングスペースなど自由に選べます。しかし全ての場所で100%集中ができるどうかは、人それぞれです。どのような環境が自身の仕事場として快適 ...

5

フリーランスのITエンジニアとして、一番難しいのは「自己管理」と言えるでしょう。 自分の体調管理はもとより、仕事のスケジュール等すべて自分で管理します。もちろんフリーランスに有給休暇等ありませんから休 ...

-Shellスクリプト

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