#logging #enterprise-library #msmq
#ведение журнала #корпоративная библиотека #msmq
Вопрос:
Я использую MS Patterns and Practices Enterprise Library MsmqTraceListener для регистрации записей в частной очереди с помощью BinaryLogFormatter.
Теперь я хотел бы прочитать эти записи журнала из очереди. Мне нужно установить свойство Formatter для MessageQueue, прежде чем я смогу просмотреть message.Body. Я ожидал, что смогу использовать BinaryLogFormatter из EnterpriseLibrary, но я не могу использовать это как IMessageFormatter. (Исключение InvalidCastException)
Чего я не понимаю?
Ответ №1:
Вы обращали внимание на службу распространения корпоративной библиотеки? Это может делать то, что вы хотите из коробки. Краткое руководство по внедрению: Ведение журнала Enterprise Library 5 с использованием MSMQ.
Если вы не хотите использовать полную службу распространения, посмотрите на исходный код, чтобы увидеть, как они получают доступ к очереди. Похоже, что они десериализуются с помощью BinaryLogFormatter
напрямую. От MsmqLogDistributor.cs:
using (MessageQueue msmq = CreateMessageQueue())
{
Message message = msmq.Peek();
string serializedEntry = message.Body.ToString();
LogEntry logEntry = null;
try
{
logEntry = BinaryLogFormatter.Deserialize(serializedEntry);
}
catch (FormatException formatException)
{
...
}
catch (SerializationException serializationException)
{
...
}
if (logEntry != null)
{
logWriter.Write(logEntry);
}
message = msmq.Receive();
if (this.StopReceiving)
{
this.isCompleted = true;
return;
}
}
Ответ №2:
Одна вещь, которую нужно обязательно сделать, это включить следующее при настройке вашего MessageQueue. В противном случае десерилизация не будет работать.
((XmlMessageFormatter)messageQueue.Formatter).TargetTypeNames = new string[] { "System.String" };
Однажды днем я пытался разобраться в этом.