В конечном счете, у вас есть много вариантов, и вам просто нужно выбрать подход, который вы считаете лучшими но я расскажу несколько примеров из различных продуктов, которые мы разрабатываем.
Статический журнал
Как уже Wilko @ Matt поделился, вы могли бы взять один из самых простых подходов и иметь статический List<String>
для журналов. Если вы выполняете требования регистрации, это очень просто, это лучший подход. Он дает вам то, что вы хотите, общие журналы, доступные во всем приложении, с минимальным требуемым программированием.
public static class Log
{
private static readonly List<String> entries = new List<String>();
public static ICollection<String> Entries => entries;
}
Единственное замечание я добавлю, что я подвергла бы это как ICollection<String>
, как List<String>
больше предназначена как частное деталей реализации класса, а не тип общественного апи, хотя это может быть List<String>
внутри, вызывающему не нужно знать это или заботиться.
Единица работы лесозаготовительной апи
Я написал Logging API как часть нашего слоя данных.У нас есть стандартный просмотрщик журналов, который мы создали как часть нашего веб-приложения, но все наши журналы программного обеспечения находятся в одном месте с использованием согласованного api. В нашем случае это, в конечном счете, используется Entity Framework
, но это может быть StreamWriter
или FileStream
. Вы можете игнорировать это и сосредоточиться только на дизайне api.
using (var context = new DataContext())
{
context.Log.NewEntry(LogCategory.Information, "Message");
}
Я также разработаны различные варианты исполнения, потому что у нас есть миллионы строк, так что вы можете делать такие вещи, как отключить context.AutoSave
, пока вы не будете готовы писать журналы вне. И, хотя это было частью нашего слоя данных, он был абстрагирован на свой собственный LogContext
.
using (var logger = new LogContext())
{
logger.NewEntry(LogCategory.Error, "Message");
}
И в конце концов, мы сделали это реализовать в другом слое, как Singleton
так журналы будут совместно, так что мы имели один LogContext
для приложения.
протоколирование компонентов
Я недавно написал заявление, где я хотел собрать протоколирование в конце процесса и показать, что для пользователя. В моем случае это было приложение на основе мастера, где каждая страница была получена из одного базового класса и отвечала за собственный журнал.
public abstract class UpgradeStep
{
public ICollection<Log>
{
get;
private set;
}
}
public class DatabaseUpgradeStep : UpgradeStep
{
public override void PerformStep()
{
Log.Add(new UpgradeLog { Message = "Hello" });
}
}
В моем случае, журналы не просто в System.String
были, но в конце работы мастера я был в состоянии перечислить через мою коллекцию UpgradeSteps
и создать коллективный журнал из различных этапов.
Существует множество способов реализовать регистрацию, и, как я уже сказал, выберите один, который прост и наилучшим образом соответствует вашим потребностям, если вам не нужно что-то более сложное. В вашем случае это звучит так, как будто ваши потребности довольно простые, но я оставлю вас с несколькими советами, которые мы живем, после написания слишком большого количества журналов.
- Попытка отделить протоколирование из вашей логики с помощью событий, обратных вызовов, адаптеры
- Put протоколирования словоблудие в файл ресурсов, поэтому он может быть изменен без изменения кода
кодов
- Использование статуса вместо длинного словоблудия где
Создайте модуль (это будет глобальный) и объявите свой список там как 'Dim loggingList как новый список (Of String)'. – Arvo
Есть несколько действительно хороших библиотек для ведения журнала, а не изобретать инструмент, но класс, чтобы сделать все это для вас, имеет смысл. Один экземпляр может регистрировать все для приложения. – Plutonix