zoukankan      html  css  js  c++  java
  • 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;
                }
            }
    
        }
    }
    
  • 相关阅读:
    js保留两位小数
    js字符串转成数字的三种方法
    『MySQL』索引类型 normal, unique, full text
    checkstyle配置文件说明
    如何更好地利用Pmd、Findbugs和CheckStyle分析结果
    Hibernate SQL优化技巧dynamic-insert="true" dynamic-update="true"
    Struts2 action的单例与多例
    Eclipse插件checkstyle安装使用
    html 动态显示元素文本
    脱离 Spring 实现复杂嵌套事务,之一(必要的概念)
  • 原文地址:https://www.cnblogs.com/timefiles/p/CSharp_WinForm_ConsoleWriteToLog.html
Copyright © 2011-2022 走看看