文章目录
欢迎讨论!
业务需求
在生产环境中,控制台窗口不便展示出来。
为了在生产环境中,完整记录控制台应用的输出,选择将其输出到文件中。
但是,存储所有输出的话会占用很多空间,故而在时间上,只存储近期一段时间里的。
本项目实现:
将控制台输出重定向到文件。
按天存储,且仅存储最近2天的输出。
代码
这里在测试时,使用时分格式"HHmm"
代替日期格式"yyyyMMdd"
来测试。在实际应用时,应该使用后者。
csharp
public class Log2Days : TextWriter
{
private string pathFormat = null; // 可以根据文件计数打开的日志文件路径,待填充后缀
private string path = null; // 当日日志文件路径
private string perviousPath = null; // 前一日日志文件路径
private string today = null; // 今日,如20230402
private 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"); // 今日日期要改为yyyyMMdd
if (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点多时