Я ищу способ добавления и удаления TraceListener для всех существующих TraceSources.
(Я не уверен, что мой подход здесь правильный, какие другие способы я могу использовать? В основном я хочу записать весь вывод трассировки в файл, который использует текущее имя проекта как имя файла. Всякий раз, когда пользователь создает или возобновляет проект, я хочу добавить журналы в правильный файл. Одновременно может быть открыт только один проект.)
Пример кода:
Я создаю несколько TraceSources в моем приложении, по одному для каждого класса
public class Class1
{
private static readonly System.Diagnostics.TraceSource trace =
new System.Diagnostics.TraceSource("Class1");
}
public class Class2
{
private static readonly System.Diagnostics.TraceSource trace =
new System.Diagnostics.TraceSource("Class2");
}
Теперь я хочу добавить или удалить traceListener во все мои трассировки в Runtime, например:
private System.Diagnostics.TextWriterTraceListener myListener;
private onProjectOpen()
{
// user created a new project or opened an existing one
myListener = new System.Diagnostics.TextWriterTraceListener("log-"+projectname+".log");
ALL_TRACESOURCES.Add ( myListener) ; // <-- how to do this?
}
private onProjectClose()
{
// user closed a project
ALL_TRACESOURCES.Remove( myListener) ; // <-- how to do this?
myListener.Flush();
myListener.Close();
myListener.Dispose(); // <-- not sure if all this is neccessary
}
До сих пор я не нашел способа сделать это, не открыв все мои трассировочные источники (кажется плохая идея), а затем перечисляю все мои классы следующим образом:
Class1.Trace.Add( myListener );
Class2.Trace.Add( myListener );
...
который кажется плохим выбором дизайна на нескольких уровнях.
или
Добавьте все мои TraceSources в пользовательскую глобальную коллекцию в конструкторе каждого класса (легко забыть/испортить, а глобальные переменные - плохие)
Есть ли лучший способ? В принципе, я ищу способ установить другой приемник по умолчанию