首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中将控制台输出到控制台和文件?

问如何在C#中将控制台输出到控制台和文件?
EN

Stack Overflow用户
提问于 2017-12-21 11:16:51
回答 4查看 5.5K关注 0票数 7

我有一个简单的控制台应用程序,我在许多地方使用Console.WriteLine向用户显示正在执行的活动。但是,最后,我还想将所有控制台输出保存到日志文件中。目前,我有这样的事情:

代码语言:javascript
复制
if (!Directory.Exists(LOG_DIRECTORY)) {
    Directory.CreateDirectory(LOG_DIRECTORY);
}

long ticks = DateTime.Now.Ticks;
string logFilename = ticks.ToString() + ".txt";
string filePath = Directory.GetCurrentDirectory() + "\\" + LOG_DIRECTORY + "\\" + logFilename;
FileStream ostream = null;
StreamWriter writer = null;
TextWriter oldOut = Console.Out;

try
{
    ostream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
    writer = new StreamWriter(ostream);
}
catch (Exception ex)
{
    Console.WriteLine("Cannot open {0} for writing.", logFilename);
    Console.WriteLine(ex.Message);
    return;
}

Console.SetOut(writer);

Console.WriteLine("{0}", Directory.GetCurrentDirectory());

Console.SetOut(oldOut);
writer.Close();
ostream.Close();

Console.WriteLine("\n\nDone!");

关键是这将直接打印到文件中,控制台中没有打印任何内容。有办法解决这个问题吗?请注意,我需要直接实时地将Console.WriteLine输出写入控制台,而对于写入日志文件,则可以在程序结束时完成,其中几乎所有其他内容都完成了。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-21 11:29:03

您可以创建自己的组件来写入多个输出,也可以使用日志工具(如NLog )。这可以配置为在<targets>部分中有类似的内容;

代码语言:javascript
复制
<target name="debugger" xsi:type="Debugger" layout="${level}>${message} (${exception:format=ToString})"/>
<target name="console" xsi:type="ColoredConsole" layout="${date:format=dd-MM-yyyy HH\:mm\:ss} - ${message}" />
<target name="FullCSVFile" xsi:type="File"  fileName="${specialfolder:folder=LocalApplicationData}\YourApp\YourApp-${date:format=yyyy-MM-dd}.csv">
  <layout xsi:type="CsvLayout">
    <column name="Index" layout="${counter}" />
    <column name="ThreadID" layout="${threadid}" />
    <column name="Time" layout="${longdate}" />
    <column name="Severity" layout="${level:uppercase=true}" />
    <column name="Location" layout="${callsite:className=False:fileName=True:includeSourcePath=False:methodName=False}" />
    <column name="Detail" layout="${message}" />
    <column name="Exception" layout="${exception:format=ToString}" />
  </layout>
</target>

然后在rules部分,你会有;

代码语言:javascript
复制
<logger name="*" minlevel="Debug" writeTo="console" />
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Debug" writeTo="FullCSVFile" />

要实际执行写操作,您的C#代码中应该有如下内容;

代码语言:javascript
复制
// at a class level;
private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();

// later in code that writes to both targets...
_logger.Info("Something happened!");
票数 11
EN

Stack Overflow用户

发布于 2017-12-21 11:27:05

如何将控制台输出保存在像string array或List<string>这样的变量中呢?然后做File.WriteAllText(filepath, consoleOutputArray);

我的意思是这样:

代码语言:javascript
复制
 class Program
    {
        static void Main(string[] args)
        {
            List<string> textStorage = new List<string>();

            string exampleData = "Ford Mustang";

            Console.WriteLine(exampleData);

            SaveOutput(ref textStorage, exampleData);

            System.IO.File.WriteAllLines(@"C://Desktop//MyFolder", textStorage);

        }
        public static void SaveOutput(ref List<string> textStorage, string output)
        {
            textStorage.Add(output);
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2017-12-21 12:05:00

在每个控制台输出之后,将输出存储在列表中,并在程序结束时使用详细信息更新日志。

代码语言:javascript
复制
var list = new List<string>;
string xyz = "message";
Console.WriteLine(xyz);
list.add(xyz);
foreach (object o in list)
{
     StreamWriter sw = null;
            String Logfile = "C:\ExceptionLog.txt";
            if (!System.IO.File.Exists(LogFile))
            {
                sw = File.CreateText(LogFile);


            }
            else
            {
                sw = File.AppendText(@"C:\ExceptionLog.txt");
            }

            sw.WriteLine(o);
            sw.Close();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47923780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档