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

相关推荐
缺点内向15 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
2501_9307077816 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
向上的车轮21 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
波波0071 天前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
波波0072 天前
每日一题:中间件是如何工作的?
中间件·.net·面试题
无风听海2 天前
.NET 10之可空引用类型
数据结构·.net
码云数智-园园2 天前
基于 JSON 配置的 .NET 桌面应用自动更新实现指南
.net
无风听海2 天前
.NET 10 之dotnet run的功能
.net
岩屿2 天前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
码云数智-大飞2 天前
.NET 中高效实现 List 集合去重的多种方法详解
.net