小規模の案件では自作のログクラスを作成することもあるかと思います。
そこで、勉強も兼ねてログ出力クラスを作成してみました!
設定ファイルで厳密にログ出力を制御する場合は、Log4Net を使用した方が良いと思います。
そこまで制御しないよって時は、自作で十分ですね。
それでは行きしょう!!
ログクラスの仕様
ログクラスの仕様を検討します。
出力内容は以下にしました。
- 日時
- ログレベル
- ログ内容
特筆すべきことはありません。一般的にはこれで事足りるかなと。
ログ出力内容の取得
仕様を決めたので、出力内容の取得方法を検討します!
日時
現在日時は、DateTime 構造体の Now プロパティ で取得できます。
1 |
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:fff") |
ログレベル、ログ内容
ログレベル、ログ内容は、呼び出し元から受け渡した値を出力します。
1 2 3 4 5 6 7 8 9 |
/// <summary> /// ログファイル書き込み /// </summary> /// <param name="logMsg">ログ内容</param> /// <param name="writeLogLevel">書込ログレベル</param> public bool WriteLog(string logMsg, LogLevel writeLogLevel) { ・・・ } |
ログレベルは以下の通りに定義しました。
- Debug : 開発用のデバッグメッセージ
- Info : 操作ログなどの情報
- Warn : 障害ではない注意警告
- Error : システム停止はしないが、問題となる障害
- Fatal : システム停止するような致命的な障害
- None : ログ出力なし
1 2 3 4 5 6 7 8 9 10 |
/// <summary>ログ出力レベル</summary> public enum LogLevel { Debug = 1, Info = 2, Warn = 3, Error = 4, Fatal = 5, None = 9 } |
Logger クラス
出来上がった Logger クラスは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Text; namespace MyUtility { /// <summary> /// ログ出力クラス /// </summary> /// ログ出力を行う。※インスタンス化不要。公開プロパティ[Instance]経由でアクセス public class Logger { #region "メンバー変数" // シングルトンクラスアクセス用変数 private static readonly Logger instance = new Logger(); #endregion #region "公開列挙型" /// <summary>ログ出力レベル</summary> public enum LogLevel { Debug = 1, Info = 2, Warn = 3, Error = 4, Fatal = 5, None = 9 } /// <summary>ログ書込モード:Append=追記/Over=上書き</summary> public enum LogWriteModeType { Append, Over } /// <summary>ログファイル名フォーマット</summary> public enum LogFormatFileNameType { YYYYMMDD, YYYYMMDDHHMMSS, YYYYMMDDHHMMSSFFF, None } #endregion #region "公開プロパティ" /// クラスインスタンスアクセス用 public static Logger GetInstance { get { return instance; } } /// ログ出力ディレクトリ public string LogFileDir { get; set; } /// ログファイル名 public string LogFileName { get; set; } /// ログファイルの書込モード public LogWriteModeType LogWriteMode { get; set; } /// ログファイル名のフォーマット public LogFormatFileNameType LogFormatFileName { get; set; } /// ログファイルの出力レベル public LogLevel LogOutPutLevel { get; set; } /// エンコード public string Encode { get; set; } #endregion #region "コンストラクタ" private Logger() { // 各プロパティに初期値を設定 // ログ出力先ディレクトリ LogFileDir = System.AppDomain.CurrentDomain.BaseDirectory + "\\log"; // ログファイル名 LogFileName = "TraceLog"; // ログファイルの書込モード LogWriteMode = LogWriteModeType.Append; // ログファイル名のフォーマット LogFormatFileName = LogFormatFileNameType.YYYYMMDD; // ログファイルの出力レベル LogOutPutLevel = LogLevel.Info; // エンコード Encode = "shift_jis"; } #endregion #region "公開メソッド" #region "ログファイル書き込み" /// <summary> /// ログファイル書き込み /// </summary> /// <param name="logMsg">ログ内容</param> /// <param name="writeLogLevel">書込ログレベル</param> public bool WriteLog(string logMsg, LogLevel writeLogLevel) { try { // ログ出力文字列作成 string LogString = CreateLogString(logMsg, writeLogLevel); // 書込ディレクトリが無ければ、作成 if (!Directory.Exists(LogFileDir)) { Directory.CreateDirectory(LogFileDir); } // ログ書込モードによって[追記/上書]を行う using (StreamWriter Fs = new StreamWriter(Path.Combine(LogFileDir, CreateLogFilePath(LogFileName)), Convert.ToBoolean(LogWriteMode == LogWriteModeType.Append ? true : false), System.Text.Encoding.GetEncoding(Encode))) { Fs.Write(LogString); } return true; } catch { // 握りつぶす return false; } } #endregion #endregion #region "内部メソッド" #region "ログ出力文字列作成" /// <summary> /// ログ出力文字列作成 /// </summary> /// <param name="logMsg">ログ内容</param> /// <param name="writeLogLevel">書込ログレベル</param> private string CreateLogString(string logMsg, LogLevel writeLogLevel) { // ログ文字列 string logString = string.Empty; string logTemplate = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:fff") + "\t" + (" 【" + writeLogLevel.ToString() + "】").PadRight(7, ' ') + "\t" + "{0}" + "\r\n"; logString = string.Format(logTemplate, logMsg); return logString; } #endregion #region "ログファイルパス設定" /// <summary> /// ログファイルパス設定 /// </summary> /// <param name="logFileName">ログファイル名</param> private string CreateLogFilePath(string logFileName) { switch (LogFormatFileName) { case LogFormatFileNameType.YYYYMMDD: logFileName += "_" + DateTime.Now.ToString("yyyyMMdd"); break; case LogFormatFileNameType.YYYYMMDDHHMMSS: logFileName += "_" + DateTime.Now.ToString("yyyyMMddHHmmss"); break; case LogFormatFileNameType.YYYYMMDDHHMMSSFFF: logFileName += "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff"); break; case LogFormatFileNameType.None: break; } return logFileName + ".log"; } #endregion #endregion } } |
試しに実行すると・・・
ログ出力されました↓
2020/05/05 18:34:07:832 【Info】 TestFileContents
2020/05/05 18:35:22:299 【Info】 TestFileContents
まとめ
自作ログクラスを作成することができました!
必要最低限の機能は備えていると思います!
案件によっては、Log4Net を使用する場合もあるので、そちらもマスターしておきたいです!
今回は以上です。それでは!