.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目录下的日志文件

相关推荐
我是唐青枫1 小时前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
开发语言·c#·.net
步步为营DotNet3 小时前
深入.NET 11:.NET Aspire 在云原生资源编排与管理的卓越实践
云原生·.net
一个帅气昵称啊4 小时前
基于.NET的NetCoreKevin框架中AgentFramework实现AI智能体Skill和工具动态管理和加载
.net
魏杨杨14 小时前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
AI行业学习1 天前
.NET Framework 3.5 官方离线包下载+完整安装教程【2026.5.19】
.net
切糕师学AI1 天前
.NET 中 CallerMemberName 与 StackTrace 的深度对比
.net·调用栈·stacktrace·callermember
步步为营DotNet1 天前
解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践
微服务·asp.net·.net
唐青枫1 天前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
c#·.net
rockey6272 天前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
叫我少年2 天前
ASP.NET Core 最小 API 快速参考
.net·api