参考文章
将C#的Console.Write同步到控制台和log文件输出
业务需求
在生产环境中,控制台窗口不便展示出来。
为了在生产环境中,完整记录控制台应用的输出,选择将其输出到文件中。
但是,一次性存储所有输出的话,文件会很大,阅读体验不佳。
故而本项目实现:
将控制台输出到文件。
限定输出文件的最大长度。
代码
using System;
using System.IO;
using System.Text;
class Program
{static void Main(){Console.SetOut(new WrtToFile(@"D:\LearnOutput.txt", 15));Console.WriteLine("testing 1-2-301");Console.WriteLine("t");Console.WriteLine("testing 4-5-6712");//Console.ReadLine();}public class WrtToFile : TextWriter{private int maxLen = 0; // 设定的文件最大保存长度private int fileCount = 1; // 当前操作第几个文件,文件计数private int wordCount = 0; // 当前文件的字数private string pathFormat = null; // 可以根据文件计数打开的文件路径,待填充private string path = null; // 文件路径,已填充private StreamWriter fileWriter = null; // 文件写入对象/// <summary>/// </summary>/// <param name="defaultPath">文件路径</param>/// <param name="maxLen">默认最多65535个字符,约131M大小</param>public WrtToFile(string defaultPath, int maxLen = UInt16.MaxValue){pathFormat = Path.Combine(Path.GetDirectoryName(defaultPath), Path.GetFileNameWithoutExtension(defaultPath) + "{0}" + Path.GetExtension(defaultPath));this.maxLen = maxLen;}/// <summary>/// 选择输出目标文件/// </summary>/// <param name="length">待输出字符串的长度</param>public void SelectTarget(int length){if (length + wordCount > maxLen || 0 == wordCount) // 满了新建,或者第一次建{try{if (!(fileWriter is null)){ // 如果有文件正在使用,则关闭之fileWriter.Close();fileWriter.Dispose();}while (File.Exists(path = string.Format(pathFormat, fileCount)))fileCount++; // 新建文件名后缀wordCount = 0; // 清空字长// 创建文件流fileWriter = new StreamWriter(path, true, Encoding.UTF8) { AutoFlush = true };}catch { }}wordCount += length; // 追加}/// <summary>/// 覆盖写的方法/// </summary>/// <param name="content"></param>public override void WriteLine(string content){SelectTarget(content.Length);fileWriter.WriteLine(content);}/// <summary>/// 需实现抽象类的此方法/// </summary>public override Encoding Encoding{get { return fileWriter.Encoding; }}}
}
第一次运行结果
三个文件各一行
第二次运行结果
六个文件各一行