参考文章
将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; }
}
}
}
第一次运行结果
三个文件各一行
第二次运行结果
六个文件各一行