.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 小时前
全面的 C#/.NET 图表构建解决方案,助力快速实现图表开发需求!
后端·.net
唐青枫11 小时前
C#.NET ArrayPool 深入解析:高性能内存池的实现与应用
c#·.net
一个专注写bug的小白猿1 天前
.net实现ftp传输文件保姆教程
后端·c#·.net
初级代码游戏1 天前
winform迁移:从.net framework 到 .net9
.net·迁移·.net framework
TeamDev1 天前
使用 Shadcn UI 构建 C# 桌面应用
前端·后端·.net
CodeCraft Studio1 天前
CADSoftTools发布两款重要更新:CAD VCL Multiplatform 16.2 与 CAD .NET 16全新发布
.net·cad vcl·cad .net·cad文件格式解析·cad文件编辑·cad文件查看器
唐青枫2 天前
C#.NET FluentSqlKata 全面解析:基于链式语法的动态 SQL 构建
c#·.net
用户298698530142 天前
Spire.Doc 实践指南:将Word 文档转换为 XML
后端·.net
忧郁的蛋~2 天前
.NET实现多任务异步与并行处理的详细步骤
后端·c#·asp.net·.net·.netcore
许泽宇的技术分享3 天前
Windows MCP.Net:解锁AI助手的Windows桌面自动化潜能
人工智能·windows·.net·mcp