最新記事

月別アーカイブ(タブ)

dicdicのランニング

カウンタ (ホームページと合算)

リンク

最新トラックバック

検索フォーム

カテゴリ

QRコード

QR

:スポンサーサイト

--/--/-- (--) --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告

237:(ASP.NET v4.0 (C#)) XMLを出力する(新規作成)、そして、追記する(ファイル既存確認)。

2016/09/21 (Wed) 23:29
 ログファイルに実行したSQL文とかを残そうとすると、SQLセンテンスの中に
カンマ(,)やら スペース( )やらコーテーション(")やら が入っていたりして、
区切り文字をどうするかで悩んだりする
たまたま、あるお客のwebDBシステムのログファイルを見る機会があって、
見てみたらなんと、ギリシャ文字が区切り文字としてこっそり使われていた。
これならSQL文中で使われることがないだろうと考えたのか.... 
しかしこれではちょっと格好が悪い。
こんなログ吐いてるって、お客のPMは知っているのかな..。

で、いろいろ考えた末、僕はxmlでログを吐いてみようということにした。
webで散々調べまわしたが...、
xmlを新規に作って要素を出力する方法はいくらでもヒットするのに、
そこに追記する方法はなかなか出てこない。
真っ当にTextStreamで開いて追記しようとすると、ルートエレメントの
閉じタグが邪魔
でなかなか面倒くさい。

と思ったら、C#の名前空間には「Xml.Linq」という便利なものがあって、
こいつをうまく使えば、xmlをTextStreamじゃなくて要素単位で扱える
ようになり、邪魔なルートエレメントの閉じタグをヒラリとかわすことが
できる (らしい) ということがわかってきた。

まず、Xml.Linqを参照できるようにしておいて....、
20160921a
using System.Xml.Linq;


こんなの書いてみた。
sql文(string)と、取得した行数(int)と、コメント(string)を受け取って、
日時とともにログ出力するメソッド。
20160921b

public void XMLLogOut(string Str1, int Num1, string Str2)
{
string DTTM = System.DateTime.Now.ToString();

//要素ごとに出力する内容を列挙
var PreLogLine = new XElement("LogLine");
PreLogLine.Add(new XElement("ELM_TME", DTTM));
PreLogLine.Add(new XElement("ELM_Str1", Str1));
PreLogLine.Add(new XElement("ELM_Num1", Num1));
PreLogLine.Add(new XElement("ELM_Str2", Str2));

//XMLファイル出力パス
string logfn = System.AppDomain.CurrentDomain.BaseDirectory + "test.xml";

//XML文書の作成
var AuditLog = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
AuditLog.Add(new XComment("コメントだじょ~")); //XMLコメントの追加
AuditLog.Add(new XElement("Root_Element")); //Root Elementの作成

if (System.IO.File.Exists(logfn))
{
//ファイルがあれば、現在のxmlをLoadしてAddしてSave
var xmlFile = XElement.Load(logfn);
xmlFile.Add(PreLogLine);
xmlFile.Save(logfn);
}
else
{
//ファイルがなければ、ノードをAddしてSave
AuditLog.Root.Add(PreLogLine);
AuditLog.Save(logfn);
} // if-else のおわり

} // XMLLogOutのおわり


まず、ファイルがない状態で実行するとファイルが生成されて、
その中に最初のログが書き込まれる。

【初回実行後の生成されたxmlファファイル】
20160921c

【2回目実行後】
20160921d
も一回実行すると、追記される。
最後の閉じタグ () の前に追記された。
これはさりげなく素晴らしい!

実際は、ファイル名を[YYMMDD].xmlにして、恒久的にログを
日次堆積管理できるようにして実装した。
使っていて気が付いたのだが、要素の内容にNullが渡されたり
した場合は、もちゃんとしてくれる。
(FC2ブログでタグを書くと表示されないのでテキストでは表現できない)
当たり前と言えは当たり前かも知れないが。

Excelでもちゃんと見れる。
20160921e

おっと。
気が付いてみると、2回目以降にコメントが残っていない。
(てゆか1回目で入ったコメントが消えてる)
まぁ、本質的な問題ではないので気にしないことにしよう... --;)

※エラー処理とか端折ってるので、丸写しは危険です。
 わたしアホなので、質問とかしてもムダです。 ご容赦を。
スポンサーサイト

ASP.NET v4.0 (C#)コメント(0)トラックバック(0)|

≪前の記事 (ASP.NET v4.0 (C#)) アクセスしている人の情報(ユーザー名やコンピュータ名など)を取得する
≫次の記事 プラグパーツのトラップ

コメント

コメントの投稿

名前
題名
メールアドレス
URL
コメント

パスワード
Secret
管理者にだけ表示を許可する

トラックバック

ブログ TOP


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。