public void Delete(string id) {
var fileName = Request.MapPath(DATA_FILE_PATH);
var xml = XDocument.Load(fileName);
var result = from item in xml.Descendants("item")
where (string)item.Element("id") == id
select item;
foreach(var item in result.ToList()) item.Remove();
xml.Save(fileName);
}
2008年11月22日土曜日
LINQ to XML でノード削除する。
2008年11月20日木曜日
ログを出力する。
開発時のデバックにも使えるが、ユーザーが不具合を報告してくるときのためにログを出力させたい。
Microsoft関連(サードパーティー)が開発しているものに、Enterprise Libraryというものがあり、この中の「Logging Application Block」が、そのものピッタし。
ダウンロードしてインストールしてみたが、Microsoft Visual Studio Standard版以上が必要とのこと。
無料のExpress版で何とか動かないものかと、いじってみたが無理っぽい。
ググってみると、java開発で使われるlog4jの.NET版のlog4netというものがあった。
log4net.configを作成
<?xml version="1.0" encoding="utf-8" ?>
<!-- [log4net.config] -->
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<appSettings>
<!-- log4net 内部のデバッグメッセージを出力 -->
<add key="log4net.Internal.Debug" value="true" />
</appSettings>
<log4net>
<!-- コンソール出力用 (VS 上 [出力] ウインドウへの出力) -->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<!-- 出力文字列のフォーマット -->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="@%-5level>> %message%newline" />
</layout>
</appender>
<!-- ファイル出力用 -->
<appender name="DailyFileAppender"
type="log4net.Appender.RollingFileAppender">
<!-- ログファイルの切替 { サイズ: Size, 日付: Date } -->
<param name="RollingStyle" value="Date" />
<!-- ファイル名 -->
<param name="File" value="log/" />
<!-- ファイル名に付加する日付パターン -->
<param name="DatePattern" value='yyyy-MM"/AppName_"yyMMdd".log"' />
<!-- ファイル名の固定 -->
<param name="StaticLogFileName" value="false" />
<!-- ファイル書き込み { 追記: true, 上書き: false } -->
<param name="AppendToFile" value="true" />
<!-- 最大保存ファイル数 (古い順に削除) -->
<param name="MaxSizeRollBackups" value="32" />
<!-- 出力文字列のフォーマット -->
<layout type="log4net.Layout.PatternLayout">
<header type="log4net.Util.PatternString" value='[task time="%date{HH:mm:ss,fff}"]%newline' />
<footer type="log4net.Util.PatternString" value="[/task]%newline" />
<conversionPattern value="%-5level %date{yyyy/MM/dd_HH:mm:ss,fff} [%thread] %logger [%property{NDC}] - %message%newline" />
</layout>
<!-- 出力するログ レベルのフィルタ -->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="FATAL" />
</filter>
</appender>
<!-- イベント ログ出力用 -->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<!-- イベント ログ上のアプリケーション名 -->
<applicationName value="AppName" />
<!-- 出力文字列のフォーマット -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date{yyyy/MM/dd_HH:mm:ss,fff} [%thread] %logger [%property{NDC}] - %message%newline" />
</layout>
<!-- 出力するログ レベルのフィルタ -->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<!-- デフォルトの出力設定 -->
<root>
<level value="ALL" />
<appender-ref ref="ConsoleAppender" />
<appender-ref ref="DailyFileAppender" />
<appender-ref ref="EventLogAppender" />
</root>
</log4net>
</configuration>
AssemblyInfo.csに以下を記述
[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"../../log4net.config", Watch = true)]
ログを出力したいクラスに以下を記述し、
private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
以下でログを出力する。
logger.Fatal("log4netによるログ出力例~Fatal(致命的障害)");
logger.Error("log4netによるログ出力例~Error(障害)");
logger.Warn("log4netによるログ出力例~Warn(警告)");
logger.Info("log4netによるログ出力例~Info(情報)");
logger.Debug("log4netによるログ出力例~Degug(デバッグ・トレース用)");
参考
XMLファイルの作成
アプリで使うデータや設定項目をXML ファイルにして保存する。
しかも、環境はC#2008なので最新版らしくLINQ(Language-Integrated Query)を使ってみる。
XElement xmlDoc = new XElement("ブックマークセット",
new XElement("ブックマーク",
new XElement("title", ""),
new XElement("URL", "")
)
);
fileName = Application.StartupPath + @"\data\bookmark.xml" ;
xmlDoc.Save(fileName);
これだけで、下記の内容のbookmark.xmlがアプリのあるフォルダの下のdataフォルダに作成された。
<?xml version="1.0" encoding="utf-8" ?>
<ブックマークセット>
<ブックマーク>
<title></title>
<url></url>
</ブックマーク>
</ブックマークセット>