В проекте, над которым я сейчас работаю, для регистрации используется среда 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
?