文章目录
- 业务需求
- 代码
- 运行效果
欢迎讨论!
业务需求
在生产环境中,控制台窗口不便展示出来。
为了在生产环境中,完整记录控制台应用的输出,选择将其输出到文件中。
但是,存储所有输出的话会占用很多空间,故而在时间上,只存储近期一段时间里的。
本项目实现:
将控制台输出重定向到文件。
按天存储,且仅存储最近2天的输出。
代码
这里在测试时,使用时分格式"HHmm"
代替日期格式"yyyyMMdd"
来测试。在实际应用时,应该使用后者。
public class Log2Days : TextWriter
{private string pathFormat = null; // 可以根据文件计数打开的日志文件路径,待填充后缀private string path = null; // 当日日志文件路径private string perviousPath = null; // 前一日日志文件路径private string today = null; // 今日,如20230402private StreamWriter fileWriter = null; // 文件写入对象public Log2Days(string defaultPath){Directory.CreateDirectory(Path.GetDirectoryName(defaultPath));// 解析原有路径,以为文件名添加后缀pathFormat = Path.Combine(Path.GetDirectoryName(defaultPath), Path.GetFileNameWithoutExtension(defaultPath) + "{0}" + Path.GetExtension(defaultPath));}/// <summary>/// 选择要输出的文件目标/// </summary>public void SelectTarget(){try{string theDay = DateTime.Now.ToString("HHmm"); // 今日日期要改为yyyyMMddif (fileWriter is null || !today.Equals(theDay)) // 未初始化,或未成功创建文件,或隔天{if (!(fileWriter is null)) // 隔天{ // 如果有文件正在使用,则关闭之fileWriter.Close();fileWriter.Dispose();fileWriter = null;if (File.Exists(perviousPath)) // 当前是第三天才会满足此条件File.Delete(perviousPath); // 删除前天的文件(昨天成了前天)perviousPath = path; // 更新昨日的路径}// 未初始化,或未成功创建文件today = theDay; // 今日日期path = string.Format(pathFormat, today); // 今日路径fileWriter = new StreamWriter(path, true, Encoding.UTF8) { AutoFlush = true }; // 追加,如果今日已写则继续写}}catch { }}/// <summary>/// [可选]覆盖写的方法WriteLine(int)/// </summary>public override void WriteLine(int content){SelectTarget();fileWriter.WriteLine(content);}/// <summary>/// [可选]覆盖写的方法Write(int)/// </summary>public override void Write(int content){SelectTarget();fileWriter.Write(content);}/// <summary>/// 需实现抽象类的此方法/// </summary>public override Encoding Encoding{get { return fileWriter.Encoding; }}
}
运行效果
当17:05分时
当17:06分时
当17:08分时
当第二日8点多时