質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

94244閲覧

C#でlogを出力する方法(log4net無しで)

hurikake_dx

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

3クリップ

投稿2015/02/06 03:05

デバッグとして変数をlogに出力したいのですが検索するとlog4netを使用する例が多く出てきます。
チーム制作中なのでdllを追加する等はあまりやりたくないです、、、
.txt形式ですぐに確認できる形で出力できる方法(関数)を教えてください。
よろしくお願いします。

kaoru6strings👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

こんにちは

.NETの標準機能のTraceクラスなどを使う方法もありますが、
変数の中身がただの文字や数値なのなら、単純にテキストファイルに書いていくだけでは駄目なのでしょうか?

lang

1string appendText = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " value " + Environment.NewLine; 2System.IO.File.AppendAllText("C:\log.txt", appendText); 3コード

意図と違っていたらすみません。

投稿2015/02/06 06:38

uml

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hurikake_dx

2015/02/13 01:08

こんな簡単に出力できるんですね…! テキストファイルに書き出すだけでいいのでこのコードで大丈夫です。 ありがとうございました!
guest

0

思うところがあるのと、知識の共有をいつの日かしたいと思っていたので、コメントしておきます。
まずは、お目汚しの回答を行ってしまい、申し訳ございません。

意見(このコメントにおける結論)

log4netを利用する利点が少ないまたは必須ではない場合は、
.NET Frameworkが提供するログ機構を使用されることを推奨します。

.NET Frameworkが提供するログ出力機構について

私が認識している主な機能としては以下の通りです。

  • 2種類あり、DebugとTraceがあります。

リリース(Release)ビルドとデバッグ(Debug)ビルドでログ出力を無効にすることができます。
リリース時はTraceのみログ出力され、Debugのログ出力は行われません。
DebugとTraceによってログの出力先を変更することができます。
使い分けとしては出力頻度と重要度で切り替えます。(出力頻度が高いものはデバッグ時のみ必要であることが多い)

  • Staticクラスのため、事前に各クラスに仕込む必要がない
  • イベントログ・コンソール・ファイルへ出力することができる
  • TraceについてはInformation/Warning/Errorを切り替えることができ、設定で出力レベルを変更することができる
  • ファイル出力については、日付ごと、ファイルサイズでのローテート(ファイルの切り替え)が可能

★気が向いたらapp.configの設定を挿入する、気が向いたらファイルやRollingFile~を記載する★

注意点としては、リリースビルド時に実行されるものと、実行されないものが出てしまうことを覚えておいてください。

cs

1//例1 2var log = string.Format("i={0}", i); //リリース時実行される 3Debug.WriteLine(log); //リリース時実行されない 4//例2 5Debug.WriteLine("increment i={0}", i++); //リリース時実行されない

log4netが提供するログ出力機構について

log4netを使う利点は以下の通りだと認識しています。

  • クラスごとに出力を制御できる
  • DBへログ出力できる
  • nuGetで簡単にDLLを内包できる
  • ログあふれの制御が可能

ただし、以下の点で利便性が低いことも認識しています。

  • 各クラスにlog4netの呼び出しが必要(定型文)

※XMLの設定やAssemblyInfoへの組み込みについては一度やってしまえば何もしなくてよいので、利便性が低いとは考えていません

投稿2018/03/12 16:34

testset

総合スコア221

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

どうしてもファイルで出力したいなら、こういう次元でいいのでは?
どうせ細かい動作なんて、決め打ちでいいわけですし。

エントリポイント

lang

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Threading.Tasks; 5using System.Windows.Forms; 6 7namespace WindowsFormsApplication3 8{ 9 static class Program 10 { 11 /// <summary> 12 /// アプリケーションのメイン エントリ ポイントです。 13 /// </summary> 14 [STAThread] 15 static void Main() 16 { 17#if DEBUG 18 AppLog.Start(); 19#endif 20 Application.EnableVisualStyles(); 21 Application.SetCompatibleTextRenderingDefault(false); 22 Application.Run(new Form1()); 23 24#if DEBUG 25 AppLog.Close(); 26#endif 27 } 28 } 29}

アプリケーション側

lang

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Diagnostics; 11 12namespace WindowsFormsApplication3 13{ 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 private void Form1_Load(object sender, EventArgs e) 22 { 23#if DEBUG 24 AppLog.WriteLine("hoge"); 25#endif 26 27 } 28 } 29}

ログクラス側

lang

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace WindowsFormsApplication3 8{ 9 /// <summary> 10 /// アプリケーション独自デバッグ用ログクラス 11 /// </summary> 12 class AppLog 13 { 14 private static System.IO.StreamWriter _sw = null; 15 16 /// <summary> 17 /// ファイル書き出しを開始 18 /// </summary> 19 public static void Start() 20 { 21 AppLog._sw = new System.IO.StreamWriter( 22 System.IO.Path.GetDirectoryName( 23 System.Reflection.Assembly.GetExecutingAssembly().Location)+ 24 System.IO.Path.DirectorySeparatorChar + "App.log", true); 25 } 26 27 /// <summary> 28 /// ファイル書き出しを終了 29 /// </summary> 30 public static void Close() 31 { 32 AppLog._sw.Close(); 33 } 34 35 /// <summary> 36 /// 書き込み 37 /// </summary> 38 /// <param name="value">書き込む値</param> 39 public static void WriteLine(object value) 40 { 41 // TODO もしだったら、型を調べて配列やリストの展開を行ったり 42 _sw.WriteLine(value); 43 } 44 } 45}

投稿2015/02/09 08:35

takiru

総合スコア130

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hurikake_dx

2015/02/13 01:02

長いソースまでつけていただきありがとうございます! 助かりました!
guest

0

変数の型によってはシリアル化もありかな?
型指定が面倒だけど型のほうにSaveメソッド的なものを乗っけておけばちょっとは楽?

下は2個1です。

/// <summary> /// ファイルにシリアル化したテキストを書き込みます /// </summary> /// <typeparam name="T">オブジェクトの型</typeparam> /// <param name="obj">シリアル化するオブジェクト</param> /// <param name="writer">シリアル化したテキストを書き込むファイルパス</param> public static void SerializeToFile<T>(T obj, string path) { var setting = new XmlWriterSettings(); setting.Encoding = new UTF8Encoding(false); setting.Indent = true; setting.NewLineHandling = NewLineHandling.Entitize; using (var xw = XmlTextWriter.Create(path, setting)) { Serialize<T>(obj, xw); } } /// <summary> /// シリアル化します /// </summary> /// <typeparam name="T">オブジェクトの型</typeparam> /// <param name="obj">シリアル化するオブジェクト</param> /// <param name="writer">シリアル化したテキストを書き込むストリーム</param> public static void Serialize<T>(T obj, XmlWriter writer) { var serializer = new XmlSerializer(typeof(T)); serializer.Serialize(writer, obj); }

投稿2015/02/06 11:31

Ryzna

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryzna

2015/02/06 11:33

自分用に使ってるやつを貼り付けましたので、XmlWriterの設定はご自由に変更ください。
Ryzna

2015/02/06 11:39

回答つけてからなんですが、そもそもリリースビルドでやりたいのか(Debug.Printじゃだめのか)って問題がありましたね;
hurikake_dx

2015/02/13 01:07

質問が分かりにくかったですね…すみません 入力されている物の平均を取りたかったので(例えるならサイコロの出た目を記録しておく感じで)中身が取り出せれば何でもよかったのです。 C#は最近始めたのでどんな機能があるかもさっぱりわからず(Debug.Printとか)この様な質問になってしまいました。 回答ありがとうございました!
guest

0

普通にStreamWriterを使ったのではダメでしょうか?

lang

1public static void Log(string message,string EncodingName) { 2 Encoding enc = Encoding.GetEncoding(EncodingName); 3 string time = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ms"); 4 string str = string.Format("{0},{1}", time, message); 5 StreamWriter writer = new StreamWriter(Path, true, enc); 6 writer.WriteLine(str); 7 writer.Flush(); 8 writer.Close(); 9}

例外処理など端折ってますが。

投稿2015/02/06 06:30

shinosan

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hurikake_dx

2015/02/13 01:11

回答ありがとうございます! 自分は検索してLog4Netを使う記事しか見つけられなかったので、StreamWriterというものがあることを知りませんでした…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問