Пользовательский прослушиватель трассировки с блоками корпоративных приложений - PullRequest
4 голосов
/ 10 февраля 2009

В проекте, над которым я сейчас работаю, для регистрации используется среда Enterprise Libraries V3.1.

Мне нужно взять сгенерированный файл журнала и архивировать его в определенных точках. Кажется, встроенные прослушиватели трассировки сохраняют файл открытым между событиями регистрации. Я настроил пользовательский Trace Listener, который добавит файл и закроет его, так что файл всегда будет смещаемым.

Это выглядит так (минус обработка ошибок для ясности):

[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class AlwaysClosedTextFileTraceListener : CustomTraceListener
{
    private string logFilePath;

    public AlwaysClosedTextFileTraceListener ()
    {
        logFilePath = @"hardcodedpath\log.txt";
    }

    public override void Write(string message)
    {
        using (StreamWriter logFile = File.AppendText(logFilePath))
        {
            logFile.Write(message);
            logFile.Flush();
            logFile.Close();
        }
    }

    public override void WriteLine(string message)
    {
        using (StreamWriter logFile = File.AppendText(logFilePath))
        {
            logFile.WriteLine(message);
            logFile.Flush();
        }
    }

    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
    {
        if (data is LogEntry && this.Formatter != null)
        {
            WriteLine(this.Formatter.Format(data as LogEntry));
        }
        else
        {
            WriteLine(data.ToString());
        }
    }
}

Это прекрасно работает, но я бы предпочел передать путь как параметр, а не жестко его кодировать.

Ради интереса я попытался добавить его в конструктор, чтобы посмотреть, что произойдет:

    public LogFolderTraceListener(string logFilePath)
    {
        this.logFilePath = logFilePath;
    }

Когда я это делаю, мне возвращается сообщение об ошибке, указывающее на то, что я делаю неправильно:

System.InvalidOperationException : The type 'AlwaysClosedTextFileTraceListener' specified for custom trace listener named 'MyLogFile' does not a default constructor, which is required when no InitData is specified in the configuration.

С этого момента мои исследования очень сильно подошли к противоположности тупиков, бесконечным проблемам вероятности.

Я нашел этот пробежку по исходному коду для встроенного RollingTraceListener

  • Существует класс RollingFlatFileTraceListenerData : TraceListenerData, который, кажется, содержит все настройки, переданные в конструктор
  • В нижней части файла для RollingFlatFileTraceListenerData находится класс RollingTraceListenerAssembler : TraceListenerAsssembler, который кажется фабричным
  • Существует еще один класс SystemDiagnosticsTraceListenerNode : TraceListenerNode, который, кажется, делает класс Data презентабельным для приложения конфигурации

У меня такой вопрос: как мне создать CustomTraceListener с настраиваемым параметром path?

Ответы [ 5 ]

6 голосов
/ 13 октября 2009

CustomTraceListener является производным от TraceListener, у него есть StringDictionary под названием Attributes.

Он будет содержать все атрибуты в строке конфигурации для вашего TraceListener и может быть получен по имени, например.

string logFileName= Attributes["fileName"]
1 голос
/ 09 октября 2009

проблема типичная Microsoft .. (добавьте свои собственные прилагательные здесь) ..

1) когда вы добавляете пользовательский прослушиватель трассировки, добавляется «необработанный» оператор app.config:

   name="Custom Trace Listener" initializeData="" formatter="Text Formatter" />

2) обратите внимание на 'initializeData' - это то, что загадочное сообщение об ошибке вызывает 'InitData'.

3) Так что все, что он говорит, это то, что вам нужен конструктор, который принимает данные инициализации - на языке vb:

  sub new (byval initstuff as string)

4) ИЛИ удалите 'initializeData = ""' и получите конструктор по умолчанию:

  sub new()

Я подозреваю, что люди из P & P живут в пузыре. riix.

1 голос
/ 10 сентября 2009

Я подозреваю, что, возможно, блоки корпоративных приложений, хотя (возможно) и замечательные, кажутся излишне сложными и, в конечном счете, доставляют больше хлопот, чем их ценность для такой настройки.

0 голосов
/ 26 января 2010

У меня только что была такая же проблема (за исключением Enterprise Library v4.1).

Решение, которое я нашел, состоит в том, чтобы удалить конструктор по умолчанию, и только у него есть конструктор со строковым параметром для имени файла, т. Е.

public AlwaysClosedTextFileTraceListener (string pathParameter)   
{   
    logFilePath = pathParameter;   
} 

Затем в app.config укажите свой путь в параметре initializeData

<add ... initializeData="C:\Logs\myLog.log" />

Хотя это не распознается редактором конфигурации Entriprise Library и не так аккуратно, как могло бы быть, оно работает, пока существует только один параметр.

Если кто-то решит, как это сделать правильно, пожалуйста, напишите и дайте нам знать - это не должно быть так сложно, конечно.

0 голосов
/ 12 сентября 2009

Для чего это стоит, так я это реализовал. В моем this.buildCurrPath () я могу читать из файла конфигурации, или в этом случае я просто получаю «стартовую панель» для веб-приложения. Но это прекрасно работает для меня. Я еще не включил его в производственный код, но он скоро выйдет.

[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class CustomListener: CustomTraceListener
{

    #region Fields (3) 
    private int logSize;
    StreamWriter sw;
    #endregion Fields 

    #region Constructors (1) 

    public CustomListener ():base()
    {
        string startPath = this.buildCurrPath();
        sw = new StreamWriter(startPath + "\\Logs\\test.log");
        sw.AutoFlush = true;

    }
...