Как сохранить XmlWriterTraceListener от символов xml-кодировки в сообщении
Я пытаюсь использовать System.Diagnostics.XmlWriterTraceListener для входа в локальный файл. Я начинаю с создания источника и добавления к нему нового XmlWriterTraceListener, например так:
public class Logger
{
const string LOG_ERR_FMT = "<message><![CDATA[{0}]]></message>{2}";
TraceSource tSource = new TraceSource(
"MyApp",
SourceLevels.Verbose | SourceLevels.ActivityTracing
);
public Logger() {
tSource.Listeners.Add(
new XmlWriterTraceListener("C:\\app_path\\app_tracelog.svclog", "LocalListener")
);
}
public static Logger defLogger = new Logger();
public static Logger Default {
get {return defLogger; }
set { if (value != null) defLogger = value; }
}
public void LogError(string msg, string extraXmlData) {
tSource.TraceEvent(TraceEventType.Error, 0, LOG_ERR_FMT, logMsg, extraXmlData);
}
}
Я упростил формат журнала в приведенном выше примере. Настоящий LogError
метод принимает Exception
объект и вставляет некоторые xml-сериализованные данные о нем в сообщение, но это не нужно, чтобы показать, в чем моя проблема здесь.
В любом случае, любая другая часть моего приложения теперь может регистрировать ошибку в файле app_tracelog.svclog с помощью простой строки, например, о...
Logger.Default.LogError(
"Error parsing response from web service \"someservice.com\".",
"<RequestBody><![CDATA[" + responseBody + "]]></RequestBody>"
);
Все хорошо, пока я не открою app_tracelog.svclog. Прежде всего, когда я пытаюсь открыть его с помощью Microsoft Service Trace Viewer, эта программа ведет себя так, как будто она пустая, и выдает мне сообщение "Нет следа, загруженного из файла".
Во-вторых, я открываю файл с помощью старого доброго Notepad++ и обнаруживаю, что мое приложение DID INDEED регистрируется в нем. Я выбираю все и говорю XmlTools, чтобы он был хорош, и инструмент говорит мне, что не может этого сделать, потому что в XML есть ошибки.
Итак, я начинаю форматировать его вручную. Сначала все идет хорошо, пока я не получу сообщение о приложении, которое я зарегистрировал. Здесь я обнаружил, что этот класс STUPID @#$ испортил весь мой вложенный XML, заменив скобки и т. Д. Закодированными сущностями XML/HTML!
Все мои<стали "& lt;", все мои ">стали" & gt; "и т. Д. Итак, сообщение журнала, которое ДОЛЖНО выглядеть так:
<message><![CDATA[Error parsing response from web service "someservice.com".]]></message><RequestBody...
Теперь выглядит так:
<message><![CDATA[Error parsing response from web service "someservice.com".]]></message><RequestBody...
Таким образом, большой вопрос: как я могу заставить XmlWriterTraceListener перестать уничтожать мое сообщение при входе в систему? Я знаю, что делаю, когда вставляю специальные символы XML, и мне кажется, что он знает лучше! - ИЛИ Есть ли другой класс слушателя, который будет регистрировать в локальном файле XML, как я хочу?