• C#之winform捕获Console.WriteLine内容到日志文件


    问题描述

    之前接手同事的项目,是一个类似于服务端后台的Winform程序,主界面隐藏起来,只再任务栏显示程序图标。
    整个项目里面没有日志记录功能,全靠Console.WriteLine打印信息。自己调试时可以用VS查看输出的内容,但给测试人员使用时很不方便,于是我使用了下面的方法显示输出的内容:

    [转]C#之winform控制台打印输出、打印调试

    但这只能实时显示,不利于后期根据输出内容查找问题。
    最终,我选择将Console.WriteLine的输出内容记录到日志文件。

    解决方法

    代码很简单,就不过多解释了,重点注意 Console.SetOut方法ConsoleLogTextWriter 类即可, 日志类Log 根据需求自己实现。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace LogDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConsoleLogTextWriter logSW = new ConsoleLogTextWriter();
                Console.SetOut(logSW);
                Console.WriteLine("程序启动");
            }
        }
        /// <summary>
        /// 捕获控制台输出并写入日志文件(推荐通过日志接口写日志)
        /// </summary>
        class ConsoleLogTextWriter : TextWriter
        {
            public ConsoleLogTextWriter() : base() { }
    
            public override Encoding Encoding { get { return Encoding.UTF8; } }
    
            public override void Write(string value)
            {
                Log.WriteLog(value);
            }
            public override void WriteLine(string value)
            {
                Log.WriteLog(value);
            }
            public override void Close()
            {
                base.Close();
            }
        }
        /// <summary>
        /// 日志类(只作演示使用,可自己定义实现)
        /// </summary>
        class Log 
        {
            public static void WriteLog(string msg) 
            {
                string path = "测试用日志文件.log";
                try
                {
                    FileStream fs;
                    StreamWriter sw;
                    StringBuilder sbr = new StringBuilder(16);
                    if (!System.IO.File.Exists(path))
                    {
                        fs = new FileStream(path, FileMode.CreateNew, FileAccess.Write, FileShare.ReadWrite);
                        sw = new StreamWriter(fs, Encoding.UTF8);
                        sbr.Append("日志开始-");
                        sbr.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
                        sbr.AppendLine();
                    }
                    else
                    {
                        fs = new FileStream(path, 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;
                }
            }
    
        }
    }
    
  • 相关阅读:
    使用Apache Commons-email邮件客户端发邮件
    Jfinal开发代码碎片_导出报表_配置druid数据源_使用guava_获取当前操作系统_JDK版本_jfinal-utils_jfinal验证码
    Memcached缓存集群_创建多实例
    HttpClient取得自定义的状态码302,并获取Header中的参数Location
    对象序列化和反序列化
    【校园电子书城】测试及部署
    mysql导入txt文件
    【校园电子书城】部分代码及数据库设计
    【校园电子书城】需求分析
    Domain logic approaches
  • 原文地址:https://www.cnblogs.com/timefiles/p/CSharp_WinForm_ConsoleWriteToLog.html
Copyright © 2020-2023  润新知