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