.Net将控制台的输出信息存入到日志文件按分钟生成日志文件
.Net将控制台的输出信息存入到日志文件
- .Net将控制台的输出信息存入到日志文件,按分钟生成日志文件
- 创建MultiTextWriter类
- 在Program里直接引用
- 查看bin目录下的日志文件
.Net将控制台的输出信息存入到日志文件,按分钟生成日志文件
因为控制台的输出比较大,在本地调试抓取日志比较困难时,不想用中间件记录日志的时候,可以将控制台的输出存入到指定目录,采用按分钟存储,一个文件存太大了,打不开。
创建MultiTextWriter类
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里直接引用
partial class Program{static void Main(string[] args){#region Redirect Console Output to File and Consolevar logDirectory = "Logs";var multiWriter = new MultiTextWriter(Console.Out, logDirectory);Console.SetOut(multiWriter);Console.SetError(multiWriter);#endregionConsole.WriteLine("Hello, World!");}}