C# winform窗体应用监听Console日志并写入本地日志
2023-09-27 14:20:54 时间
一、前言
最近在搞C#的winform窗体应用,需要监听Console日志写入本地日志,类似Unity的Application.logMessageReceviedThreaded。
二、具体实现
1、原理
Console提供了一个SetOut接口,传入一个TextWriter,即可通过TextWriter重写Write和WriteLine接口,将日志写入我们的日志文件了。
public static void SetOut(TextWriter newOut);
2、具体实现
自己创建一个类,比如LoggerTextWriter,它继承TextWriter,重写Write和WriteLine接口,写入日志到本地。
LoggerTextWriter logSW = new LoggerTextWriter("./");
logSW.Init();
Console.SetOut(logSW);
Console.WriteLine("Hello Wrold");
其中LoggerTextWriter代码如下
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class LoggerTextWriter : TextWriter
{
private string m_outputLogPath;
public LoggerTextWriter (string launcherDir) : base()
{
m_outputLogPath = Path.Combine(launcherDir, "output.log");
}
public override Encoding Encoding { get { return Encoding.UTF8; } }
public override void Write(string value)
{
WriteLog(value);
}
public override void WriteLine(string value)
{
WriteLog(value);
}
public override void Close()
{
base.Close();
}
public void Init()
{
if (File.Exists(m_outputLogPath))
{
File.Delete(m_outputLogPath);
}
}
public void WriteLog(string msg)
{
try
{
FileStream fs;
StreamWriter sw;
StringBuilder sbr = new StringBuilder(16);
if (!File.Exists(m_outputLogPath))
{
fs = new FileStream(m_outputLogPath, FileMode.CreateNew, FileAccess.Write, FileShare.ReadWrite);
sw = new StreamWriter(fs, Encoding.UTF8);
sbr.Append("日志开始");
sbr.AppendLine();
}
else
{
fs = new FileStream(m_outputLogPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
sw = new StreamWriter(fs, Encoding.UTF8);
}
sbr.Append("[");
sbr.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"));
sbr.Append("]: ");
sbr.Append(msg);
sw.WriteLine(sbr.ToString());
sw.Flush();
sw.Close();
fs.Close();
sbr.Clear();
}
catch (Exception)
{
throw;
}
}
}
相关文章
- c# winform不规则窗口实现(透明窗口)
- C#(winform)的label自动换行
- C#_图片存取数据库Winform
- C#_获取当前程序运行的环境变量
- C#_Winform_聊天机器人
- OpenCvSharp (C# OpenCV) OCR实现中英文识别 文字识别(附WinForm完整源码)
- 【C#】GridControl控件和数据集双向绑定
- 【C#基础】C# 正则表达式
- 【C#基础】C# 数据类型总结
- C# Nuget版本号排序
- 读C#开发实战1200例子记录-2017年8月14日10:03:55
- c#如何实现在两个窗体(Form)间传输数据或变量
- c# 结构体的两种赋值方法
- Unity3d C# 实现两点的画线和测距效果功能(含源码)
- C# winform 控件背景颜色自定义RGB 值
- C#程序通过ORM框架连接Oracle数据库--NHibernate篇
- C# 从零开始写 SharpDx 应用 绘制基础图形
- c# WinForm 中英文智能提示
- C#winform批量给图片加水印代码