Utility-Logger

Utility-Loggerクラス。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;

namespace MyApp.Utility
{
    /// <summary>
    /// ログクラス
    /// </summary>
    public class Logger
    {
        #region 変数

		//TODO 設定ファイルから読み込む
		/// <summary>
        /// ログ出力パス
        /// </summary>
        private string logFolder = "log";

        /// <summary>
        /// ログ出力フルパス
        /// </summary>
        private string logFullPath = string.Empty;

        /// <summary>
        /// 出力ファイル
        /// </summary>
        private string outputFile = string.Empty;

        //TODO 設定ファイルから読み込む
		/// <summary>
        /// ログ出力レベル
        /// </summary>
		//private string logLevelString = Level.DEBUG.ToString();

        /// <summary>
        /// ログ出力レベル
        /// </summary>
        private Level logLevel = Level.DEBUG;

        /// <summary>
        /// ロックオブジェクト
        /// </summary>
        private object locker = new object();

        #endregion

        #region 静的変数

        /// <summary>
        /// シングルトンオブジェクト
        /// </summary>
        private static Logger instance = new Logger();

        #endregion

		#region 定数

		/// <summary>
		/// オペレーションログファイル名の先頭文字列
		/// </summary>
		private const string FILE_HEAD = "app";

		/// <summary>
		/// ログファイルの拡張子
		/// </summary>
		private const string EXTENTION = ".log";
		
		#endregion

        #region 列挙体
        /// <summary>
        /// ログレベル
        /// </summary>
        public enum Level
        {
            /// <summary>
            /// デバッグ:0
            /// </summary>
            DEBUG = 0,

            /// <summary>
            /// 情報:1
            /// </summary>
            INFO = 1,

            /// <summary>
            /// 警告:2
            /// </summary>
            WARN = 2,

            /// <summary>
            /// エラー:3
            /// </summary>
            ERROR = 3,

            /// <summary>
            /// 致命的なエラー:4
            /// </summary>
            FATAL = 4,
        };
        #endregion

        #region メソッド

        #region コンストラクタ
        /// <summary>
        /// コンストラクタ
        /// </summary>
        private Logger()
        {
            //設定取得
            
			//TODO 設定ファイルから読み込む
            //ログパス
            //this.logFolder = dt.Rows[0][AppConstant.TAG_APP_LOG_FOLDER].ToString();

			//TODO 設定ファイルから読み込む
            //ログレベル
			//string logLevelString = dt.Rows[0][AppConstant.TAG_APP_LOG_LEVEL].ToString();
			//if (Enum.IsDefined(typeof(Level), logLevelString))
			//{
			//    this.logLevel = this.GetLogLevel(logLevelString);
			//}
           
            //出力フルパス
			this.logFullPath = Path.Combine(Environment.CurrentDirectory, this.logFolder);

        }
        #endregion

        #region ログレベル取得
        /// <summary>
        /// ログレベル取得
        /// </summary>
        /// <param name="argLogLevel">ログレベル文字列</param>
        /// <returns>ログレベル</returns>
        private Level GetLogLevel(string argLogLevel)
        {
            Level retLevel = Level.INFO;

            foreach (Level lv in Enum.GetValues(typeof(Level)))
            {
                if (lv.ToString() == argLogLevel)
	            {
                    retLevel = lv;
                    break;
	            }
            }

            return retLevel;
        }
        #endregion

        #region インスタンス取得
        /// <summary>
        /// インスタンス取得
        /// </summary>
        /// <returns>オペレーションログクラスオブジェクト</returns>
        public static Logger GetInstance()
        {
            return instance;
        }
        #endregion

        #region ログ出力
        /// <summary>
        /// ログ出力
        /// </summary>
        /// <param name="argApp">アプリケーション名</param>
        /// <param name="argLogLevel">ログレベル</param>
        /// <param name="argMessage">ログメッセージ</param>
        /// <returns>処理結果</returns>
        public bool Write(string argAppName, Level argLogLevel, string argMessage)
        {
            bool result = true;

            if (!this.MakeLog(argAppName, argLogLevel, argMessage))
            {
                result = false;
            }

            return result;
        }
        #endregion

        #region ログ作成
        /// <summary>
        /// ログ作成
        /// </summary>
        /// <param name="argAppName">アプリケーション名</param>
        /// <param name="argLevel">ログレベル</param>
        /// <param name="argMessage">メッセージ</param>
        /// <returns>処理結果</returns>
        private bool MakeLog(string argAppName, Level argLevel, string argMessage)
        {
            if (argLevel < this.logLevel)
            {
                return true;
            }
            
            DateTime dateNow = DateTime.Now;
            string strDate = dateNow.ToString("yyyy/MM/dd HH:mm:ss");

            //出力ファイル
            this.outputFile = FILE_HEAD + dateNow.ToString("yyyyMMdd") + EXTENTION;

            //ログ出力パスの確認
            if (!Directory.Exists(this.logFullPath))
            {
                Directory.CreateDirectory(this.logFullPath);
            }

            //ログファイル出力文字作成
            StringBuilder sb = new StringBuilder();
            sb.Append(strDate);
            sb.Append(" ");
            sb.Append(argAppName);
            sb.Append(",");
            sb.Append(argLevel);
            sb.Append(",");
            sb.Append(argMessage);

            try
            {
                this.WriteLog(sb.ToString());
            }
            catch
            {
                //異常発生
                throw new Exception("ログファイルの出力異常発生");
            }

            return true;
        }
        #endregion

        #region ログファイル出力
        /// <summary>
        /// ログファイル出力
        /// </summary>
        /// <param name="argMessage">書込みデータ</param>
        private void WriteLog(string argMessage)
        {
            lock (locker)
            {
                using (FileStream fs = new FileStream(Path.Combine(this.logFullPath, this.outputFile), FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
                {
                    using (StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("Shift_JIS")))
                    {
                        fs.Seek(0, SeekOrigin.End);
                        sw.WriteLine(argMessage);
                        sw.Flush();
                        fs.Flush();
                    }
                }
            }
        }
        #endregion

        #endregion
    }
}