2017-12-21 70 views
2

私は単純なコンソールアプリケーションを持っています。私は多くの場所でConsole.WriteLineを使って、実行されているアクティビティをユーザに表示しています。しかし、最後に、すべてのConsole出力をログファイルに保存したいと思っています。C#でコンソールとファイルの両方にコンソールouputを書き込む方法は?

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出力はコンソールに書き込むためにリアルタイムで直接入力する必要がありますが、ログファイルに書き込むには、プログラムの最後に実行する必要があります。

+1

独自のコンポーネントを作成することも、複数の出力に同時に書き込むことができるNLogなどのログツールを使用することもできます。デバッガ、コンソール、CSV、バッファされた電子メール(自動エラー報告用)に書き込むためにNLogを使用します – DiskJunky

答えて

2

あなたが複数の出力への書き込みや、あなたがそのようなNLogとしてのロギングツールを使用することができ、独自のコンポーネントを作成することができます。そして、私はこの方法を意味File.WriteAllText(filepath, consoleOutputArray);

を行います。これは、<targets>セクションに次のような設定ができるように構成できます。

<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セクションには、

<logger name="*" minlevel="Debug" writeTo="console" /> 
<logger name="*" minlevel="Debug" writeTo="debugger" /> 
<logger name="*" minlevel="Debug" writeTo="FullCSVFile" /> 

実際に書き込み操作を行うには、C#コードで次のようなものがあります。

// at a class level; 
private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); 

// later in code that writes to both targets... 
_logger.Info("Something happened!"); 
+0

ありがとうございますが、これはデバッガとコンソールに書き込まれ、ファイルやコンソールには書き込まれません。 – typos

+0

@typos、apologies、私はCSVにも書き込むために私の答えを更新しました。これは、テストシステムと本番システムで使用する設定から来ており、一度起動してもうまく動作します。 NLogは、SQL Server、電子メールなどの多くのエンドポイントに書き込むように設定できます。 – DiskJunky

+0

よろしくお願いいたします。 – typos

1

コンソール出力をstring arrayList<string>のように変数に保存するとどうなりますか?

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); 
     } 
    } 
+0

コンソール出力を変数に保存するにはどうすればよいですか? – typos

+0

文字列を割り当てます。 –

0

各コンソール出力後に出力をリストに格納し、プログラムの最後にログを詳細情報で更新します。

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(); 
} 
関連する問題