Я хочу реализовать ведение журнала с помощью EntLib Logging и подключить два TraceListeners для категории "Отладка". Один напишет эти сообщения в файл, а другой выведет их на вывод системной трассировки так же, как и Debug.Write(чтобы я мог контролировать их с помощью Sysinternals DbgView), но я не могу найти, как настроить этот второй прослушиватель с помощью форматирования, который Мне нужно. Все, что мне действительно нужно, это просто сообщение, но оно выводит целую кучу вещей, таких как EventId, Priority и т.д. Как я вырезаю все это?
Как написать только сообщение для отладки вывода с помощью регистрации в корпоративной библиотеке?
Ответ 1
Я нашел хорошее прохождение в MSDN: Создание пользовательского прослушивателя трассировки
Он делает именно то, что мне нужно. Вот полный код, в который я попал:
using System;
using System.Diagnostics;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
namespace Common.Utils
{
[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class FormattedDebugWriterTraceListener : CustomTraceListener
{
public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
{
if (data is LogEntry && this.Formatter != null)
{
this.WriteLine(this.Formatter.Format(data as LogEntry));
}
else
{
this.WriteLine(data.ToString());
}
}
public override void Write(string message)
{
Debug.Write(message);
}
public override void WriteLine(string message)
{
Debug.WriteLine(message);
}
}
}
Файл конфигурации:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<loggingConfiguration name="Logging Application Block" tracingEnabled="true"
defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
<listeners>
<add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
traceOutputOptions="None" type="Common.Utils.FormattedDebugWriterTraceListener, Common.Utils"
name="FormattedDebugWriterTraceListener" initializeData="" formatter="SimpleMessageFormatter" />
<add fileName="log\Debugging.log" rollSizeKB="0" timeStampPattern="yyyy-MM-dd"
rollFileExistsBehavior="Overwrite" rollInterval="Week" formatter="GeneralTextFormatter"
header="----------------------------------------" footer="----------------------------------------"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
traceOutputOptions="None" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
name="RollingFlatFileTraceListener" />
</listeners>
<formatters>
<add template="{message}
" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
name="SimpleMessageFormatter" />
<add template="Timestamp: {timestamp}
Message: {message}
Category: {category}
Priority: {priority}
EventId: {eventid}
Severity: {severity}
Title:{title}
Machine: {machine}
Application Domain: {appDomain}
Process Id: {processId}
Process Name: {processName}
Win32 Thread Id: {win32ThreadId}
Thread Name: {threadName}
Extended Properties: {dictionary({key} - {value}
)}"
type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
name="GeneralTextFormatter" />
</formatters>
<categorySources>
<add switchValue="All" name="Debugging">
<listeners>
<add name="FormattedDebugWriterTraceListener" />
<add name="RollingFlatFileTraceListener" />
</listeners>
</add>
<add switchValue="All" name="General" />
</categorySources>
<specialSources>
<allEvents switchValue="All" name="All Events" />
<notProcessed switchValue="All" name="Unprocessed Category" />
<errors switchValue="All" name="Logging Errors & Warnings" />
</specialSources>
</loggingConfiguration>
</configuration>
И использование будет выглядеть следующим образом:
Debug.Write("Debug.Write test");
Logger.Write("EntLib test", "Debugging");
Оба заканчиваются в отладочном выходе, легко отслеживаемом DbgView.
Ответ 2
В конфигурации EntLib для вашего приложения вы указываете, какой Formatter вы хотите использовать. Формат форматирования по умолчанию включает всю эту информацию. Чтобы удалить интересующую вас информацию, не удаляйте их из TextFormatter, который вы используете, или создайте новый текстовый форматировщик, содержащий нужные вам поля, и измените "Отладка", чтобы использовать новый форматтер.