.Net将控制台的输出信息存入到日志文件按分钟生成日志文件

.Net将控制台的输出信息存入到日志文件

.Net将控制台的输出信息存入到日志文件,按分钟生成日志文件

因为控制台的输出比较大,在本地调试抓取日志比较困难时,不想用中间件记录日志的时候,可以将控制台的输出存入到指定目录,采用按分钟存储,一个文件存太大了,打不开。

创建MultiTextWriter类

csharp 复制代码
public class MultiTextWriter : TextWriter
{
    private readonly TextWriter _consoleWriter;
    private StreamWriter _fileWriter;
    private string _currentLogFilePath;
    private DateTime _currentLogFileTime;

    public MultiTextWriter(TextWriter consoleWriter, string logDirectory)
    {
        _consoleWriter = consoleWriter;
        _currentLogFileTime = DateTime.Now;
        _currentLogFilePath = GetLogFilePath(logDirectory, _currentLogFileTime);
        Directory.CreateDirectory(logDirectory);
        _fileWriter = new StreamWriter(new FileStream(_currentLogFilePath, FileMode.Append, FileAccess.Write)) { AutoFlush = true };
    }

    public override Encoding Encoding => _consoleWriter.Encoding;

    public override void Write(char value)
    {
        RotateLogFileIfNeeded();
        _consoleWriter.Write(value);
        _fileWriter.Write(value);
    }

    public override void WriteLine(string value)
    {
        RotateLogFileIfNeeded();
        _consoleWriter.WriteLine(value);
        _fileWriter.WriteLine(value);
    }

    public override void Flush()
    {
        _consoleWriter.Flush();
        _fileWriter.Flush();
    }

    private void RotateLogFileIfNeeded()
    {
        var now = DateTime.Now;
        if (now.Minute != _currentLogFileTime.Minute || now.Hour != _currentLogFileTime.Hour || now.Date != _currentLogFileTime.Date)
        {
            _fileWriter.Dispose();
            _currentLogFileTime = now;
            _currentLogFilePath = GetLogFilePath(Path.GetDirectoryName(_currentLogFilePath)!, _currentLogFileTime);
            _fileWriter = new StreamWriter(new FileStream(_currentLogFilePath, FileMode.Append, FileAccess.Write)) { AutoFlush = true };
        }
    }

    private static string GetLogFilePath(string logDirectory, DateTime logTime)
    {
        return Path.Combine(logDirectory, $"console_output_{logTime:yyyyMMdd_HHmm}.log");
    }
}

在Program里直接引用

csharp 复制代码
    partial class Program
    {
        static void Main(string[] args)
        {
            #region Redirect Console Output to File and Console
            var logDirectory = "Logs";
            var multiWriter = new MultiTextWriter(Console.Out, logDirectory);
            Console.SetOut(multiWriter);
            Console.SetError(multiWriter);
            #endregion
            Console.WriteLine("Hello, World!");
        }
    }

查看bin目录下的日志文件

相关推荐
迪丽热爱3 小时前
VS要求的.NET 9 SDK需求、安装注意事项及VS版本搭配
.net
时光追逐者4 小时前
一个基于 .NET 开源、简易、轻量级的进销存管理系统
开源·c#·.net·.net core·经销存管理系统
William_cl5 小时前
【连载7】 C# MVC 跨框架异常处理对比:.NET Framework 与 .NET Core 实现差异
c#·mvc·.net
玩泥巴的6 小时前
.NET操作Word实现智能文档处理 - 内容查找替换与书签操作
word·.net·二次开发·office·com互操作
mudtools6 小时前
.NET操作Excel:高级格式设置
c#·.net·excel·wps
Aevget10 小时前
DevExpress WPF中文教程:如何使用虚拟源将WPF数据网格绑定到任何数据源?
c#·.net·wpf·界面控件·devexpress·ui开发
追逐时光者12 小时前
一款开源免费、组件丰富的 WPF UI 控件库,提供了 100 多款常用控件!
后端·.net
一点都不方女士13 小时前
.NET Framework 4.0.30319:官方下载与常见问题解决指南
c++·windows·.net·动态链接库·运行库
即兴随缘1 天前
【RabbitMQ】主题(Topics)与主题交换机(Topic Exchange)
rabbitmq·.net