Я переношу из Enterprise Library, и его Write() api позволяет нам указывать такие вещи, как Категория, Уровень важности, Заголовок и Приоритет.
В этом конкретном примере я хотел бы зарегистрировать в поле базы данных заданное пользователем значение для категории. например, в онлайн-корзине покупок, я хочу поместить такие категории, как [Камеры], [Ноутбуки], [Маршрутизаторы], [Аккаунт], [Заказы], [Доставка] и т.д.
Я знаю, что в log4net есть поле свойств, и мы делаем это уже в нашем конфиге для отображения в базу данных:
<parameter>
<parameterName value="@MachineName" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{log4net:HostName}" />
</layout>
</parameter>
Я хочу, чтобы мой Api выглядел примерно так:
public class LogService
{
public LogService()
{
_log = LogManager.GetLogger(this.GetType());
}
public void WriteDebug(string message, string category)
{
_log.Debug(message);
}
}
Могу ли я сделать это, было бы безопасно? или есть другой способ?
public void WriteDebug(string message, string category) { ThreadContext.Properties["Category"] = category _log.Debug(message); ThreadContext.Properties["Category"] = ""; }
У нас есть много асинхронного кода в нашей базе кода приложения... поэтому я волнуюсь, что это вообще не потокобезопасно.
log4net.ThreadContext безопасен для многопоточных операций и предоставляет местоположение для конкретной информации, относящейся к потоку. Вы также можете указать идентификатор потока/имя потока в вашем шаблоне PatternLayout для лучшего понимания. В этом же макете содержатся все необходимые свойства, как указано имя узла. Если вы хотите подключиться к базе данных, используйте AdoNetAppender.