C#实现只保存2天的日志文件

欢迎讨论!

业务需求

在生产环境中,控制台窗口不便展示出来。
为了在生产环境中,完整记录控制台应用的输出,选择将其输出到文件中。
但是,存储所有输出的话会占用很多空间,故而在时间上,只存储近期一段时间里的。
本项目实现:

将控制台输出重定向到文件。
按天存储,且仅存储最近2天的输出。

代码

这里在测试时,使用时分格式"HHmm"代替日期格式"yyyyMMdd"来测试。在实际应用时,应该使用后者。

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点多时
在这里插入图片描述

相关推荐

  1. 在Linux删除几日志文件

    2024-04-07 14:40:01       12 阅读
  2. 【Golang】自定义logrus日志保存日志文件

    2024-04-07 14:40:01       29 阅读
  3. c# 让文件

    2024-04-07 14:40:01       33 阅读
  4. django怎么设置把logger.info日志保存到本地文件

    2024-04-07 14:40:01       16 阅读
  5. C/C++】工业级别日志文件轮转策略原理

    2024-04-07 14:40:01       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 14:40:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 14:40:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 14:40:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 14:40:01       20 阅读

热门阅读

  1. Vscode已经安装imutils但是依旧报错

    2024-04-07 14:40:01       23 阅读
  2. 设计模式:生活中的观察者模式

    2024-04-07 14:40:01       18 阅读
  3. Spring相关实战

    2024-04-07 14:40:01       13 阅读
  4. Flutter Engine引擎概念

    2024-04-07 14:40:01       21 阅读
  5. HOW - 前端国际化之多语言通用方案

    2024-04-07 14:40:01       16 阅读
  6. 「 网络安全常用术语解读 」同源策略SOP详解

    2024-04-07 14:40:01       16 阅读
  7. Openstack(T)部署ceph集群 ceph-14.2.22-nautilus

    2024-04-07 14:40:01       10 阅读
  8. WPF中嵌入3D模型通用结构

    2024-04-07 14:40:01       10 阅读
  9. 【2023年软考架构师】案例真题回忆版

    2024-04-07 14:40:01       15 阅读
  10. vite配置postcss

    2024-04-07 14:40:01       14 阅读
  11. AI创业蓝海:十大领域解锁未来商机

    2024-04-07 14:40:01       12 阅读
  12. docker用来解决什么问题

    2024-04-07 14:40:01       16 阅读