public LogRecord(IResFile logFile, bool enabled, bool timeStampPrintable, bool enableConsole) { this.LogFile = logFile; this.Enabled = enabled; this.TimeStampPrintable = timeStampPrintable; this.EnableConsole = enableConsole; }
/// <summary> /// ログ・ファイルに記録します。失敗しても無視します。 /// </summary> /// <param name="line"></param> static void XLine(ILogRecord record, string level, string line, IResFile targetOrNull) { // ログ出力オフ if (!record.Enabled) { return; } // ログ追記 try { StringBuilder sb = new StringBuilder(); // タイムスタンプ if (record.TimeStampPrintable) { sb.Append($"[{DateTime.Now.ToString()}] "); } sb.Append($"{level} {line}"); sb.AppendLine(); string message = sb.ToString(); if (targetOrNull != null) { System.IO.File.AppendAllText(targetOrNull.Name, message); } else { System.IO.File.AppendAllText(record.LogFile.Name, message); } } catch (Exception) { //>>>>> エラーが起こりました。 // どうにもできないので 無視します。 } }
/// <summary> /// ファータル・レベル。 /// </summary> /// <param name="line"></param> public static void Fatal(string line, IResFile targetOrNull = null) { Logger.XLine(FatalRecord, "Fatal", line, targetOrNull); }
/// <summary> /// エラー・レベル。 /// </summary> /// <param name="line"></param> public static void Error(string line, IResFile targetOrNull = null) { Logger.XLine(ErrorRecord, "Error", line, targetOrNull); }
/// <summary> /// ワーン・レベル。 /// </summary> /// <param name="line"></param> public static void Warn(string line, IResFile targetOrNull = null) { Logger.XLine(WarnRecord, "Warn", line, targetOrNull); }
/// <summary> /// ノティス・レベル。 /// </summary> /// <param name="line"></param> public static void Notice(string line, IResFile targetOrNull = null) { Logger.XLine(NoticeRecord, "Notice", line, targetOrNull); }
/// <summary> /// インフォ・レベル。 /// </summary> /// <param name="line"></param> public static void Info(string line, IResFile targetOrNull = null) { Logger.XLine(InfoRecord, "Info", line, targetOrNull); }
public static void Debug(string line, IResFile targetOrNull = null) { Logger.XLine(DebugRecord, "Debug", line, targetOrNull); }
/// <summary> /// テキストをそのまま、ファイルへ出力するためのものです。 /// </summary> /// <param name="path"></param> /// <param name="contents"></param> public static void WriteFile(IResFile logFile, string contents) { File.WriteAllText(logFile.Name, contents); }
/// <summary> /// バッファーに溜まっているログを吐き出します。 /// </summary> static void XWrite(ILogRecord record, string level, string message, bool echo, IResFile targetOrNull) { if (0 < message.Length) { if (echo) { // コンソールに表示 System.Console.Out.Write(message); } // ログの書き込み // _1 ~ _10 等のファイル名末尾を付けて、ログをローテーションするぜ☆(^▽^) string bestFile; { int maxFileSize = Util_Machine.LogFileSaidaiYoryo; int maxFileCount = Util_Machine.LogFileBunkatsuSu; long newestFileSize = 0; int oldestFileIndex = -1; DateTime oldestFileTime = DateTime.MaxValue; int newestFileIndex = -1; DateTime newestFileTime = DateTime.MinValue; int noExistsFileIndex = -1; int existFileCount = 0; // まず、ログファイルがあるか、N個確認するぜ☆(^▽^) for (int i = 0; i < maxFileCount; i++) { string file = Logger.NumberedLogFilePath(i); // ファイルがあるか☆ if (File.Exists(file)) { FileInfo fi = new FileInfo(file); DateTime fileTime = fi.LastWriteTimeUtc; if (fileTime < oldestFileTime) { oldestFileIndex = i; oldestFileTime = fileTime; } if (newestFileTime < fileTime) { newestFileIndex = i; newestFileTime = fileTime; newestFileSize = fi.Length; } existFileCount++; } else if (-1 == noExistsFileIndex) { noExistsFileIndex = i; } } if (existFileCount < 1) { // ログ・ファイルが1つも無ければ、新規作成するぜ☆(^▽^) Logger.LogDirectoryToExists(); bestFile = Logger.NumberedLogFilePath(0); // 番号は 1 足される。 FileStream fs = File.Create(bestFile); fs.Close(); // File.Create したあとは、必ず Close() しないと、ロックがかかったままになる☆(^▽^) } else { // ファイルがある場合は、一番新しいファイルに書き足すぜ☆(^▽^) bestFile = Logger.NumberedLogFilePath(newestFileIndex); // 一番新しいファイルのサイズが n バイト を超えている場合は、 // 新しいファイルを新規作成するぜ☆(^▽^) if (maxFileSize < newestFileSize) // n バイト以上なら { if (maxFileCount <= existFileCount) { // ファイルが全部ある場合は、一番古いファイルを消して、一から書き込むぜ☆ bestFile = Logger.NumberedLogFilePath(oldestFileIndex); File.Delete(bestFile); FileStream fs = File.Create(bestFile); fs.Close(); // File.Create したあとは、必ず Close() しないと、ロックがかかったままになる☆(^▽^) } else { // まだ作っていないファイルを作って、書き込むぜ☆(^▽^) bestFile = Logger.NumberedLogFilePath(noExistsFileIndex); FileStream fs = File.Create(bestFile); fs.Close(); // File.Create したあとは、必ず Close() しないと、ロックがかかったままになる☆(^▽^) } } } } for (int retry = 0; retry < 2; retry++) { try { System.IO.File.AppendAllText(bestFile, message); break; } catch (Exception) { if (0 == retry) { // 書き込みに失敗することもあるぜ☆(^~^) // 10秒待機して 再挑戦しようぜ☆(^▽^) // Trace("ログ書き込み失敗、10秒待機☆"); // フラッシュは、できないぜ☆(^▽^)この関数だぜ☆(^▽^)wwww System.Threading.Thread.Sleep(10000); } else { // 無理☆(^▽^)www throw; } } } // ログ書き出し、ここまで☆(^▽^) // Buf.Clear(); } }
public static void Trace(string line, IResFile targetOrNull = null) { Logger.XWrite(TraceRecord, "Trace", line, Echo, targetOrNull); }
/// <summary> /// テキストをそのまま、ファイルへ出力するためのものです。 /// </summary> /// <param name="path"></param> /// <param name="contents"></param> public static void WriteFile(IResFile logFile, string contents) { File.WriteAllText(logFile.Name, contents); // MessageBox.Show($a"ファイルを出力しました。 //{path}"); }