デバッグとして変数をlogに出力したいのですが検索するとlog4netを使用する例が多く出てきます。
チーム制作中なのでdllを追加する等はあまりやりたくないです、、、
.txt形式ですぐに確認できる形で出力できる方法(関数)を教えてください。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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
総合スコア27
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
総合スコア223
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア130
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

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
総合スコア85
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

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
総合スコア209
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/13 01:08