Есть ли способ, чтобы log4net изменял целевое местоположение предполагаемого журнала через определенные условия в программе, без необходимости обновлять и повторно развертывать конфигурацию xml?
Я не хочу никакого зависимого от конфигурации решения. Он должен работать только через код. У меня есть определенные условия, на основе которых я смогу рассказать о своей программе, которую нужно выбрать. При некоторых условиях программа автоматически переключится между текстовым файлом по заранее определенному пути или SQL Server на предопределенный сервер/базу данных или в журнал событий под моим именем приложения. Путь к файлу, строка соединения sql и параметры журнала событий будут единственной вещью, сохраненной в файле конфигурации приложений.
Это даже выполнимо на log4net? Я не мог найти ничего подходящего для того, что я искал, поэтому у меня нет кода, который я могу показать. Большинство ответов касалось того, как изменить местоположение каталога по умолчанию, но это не то, что я хочу.
благодаря
Я знаю, что вы говорили об изменении своего приложения только в коде, но я действительно думаю, что вы выиграли бы больше, используя выбранные приложения в зависимости от свойства контекста, заданного в коде
Примером может быть сделать что-то подобное в вашем файле конфигурации:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="DB" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your ado configuration -->
<appender name="AnotherAppender" type="log4net.Appender.EventLogAppender,log4net">
<filter type="log4net.Filter.PropertyFilter">
<key value="target" />
<stringToMatch value="EventLog" />
<acceptOnMatch value="true" />
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<!-- your Eventlog configuration -->
Затем в вашем коде вы можете установить target
свойство логгера для нужного адресата:
var isDB = true;
var loggingEvent = new LoggingEvent(typeof(Program), Log.Logger.Repository, Log.Logger.Name, Level.Info, "message", null);
loggingEvent.Properties["target"] = isDB ? "DB" : "EventLog";
Log.Logger.Log(loggingEvent);
Таким образом, у вас нет волшебных выходов регистрации, скрытых в вашем коде, выходы управляются через конфигурацию, поэтому вы можете легко ее изменить, и маршрутизация - это единственное, что вам нужно позаботиться внутри приложения.
Если вам не нужен контекст для каждого сообщения (например, вы знаете, что после внесения изменений в журнал маршрутизации он не будет переключаться снова в течение длительного времени), вы можете использовать один из трех других контекстов, которые можно задать глобально:
log4net.GlobalContext
используется для всех регистраторов в приложении.log4net.ThreadContext
совместно используется регистраторами в одном потокеlog4net.
ThreadLogicalContext распределяется между регистраторами в тех же логических границах для потока (больше информации о различии)Можно программно переключать ведение журнала на каждый добавочный элемент. Вы можете контролировать порог регистрации на основе условий, которые вы определяете.
Например, это код, который переключает приложения, имеющие имя с префиксом "Аудит".
private static void ToggleAuditing(bool enabled)
{
log4net.Appender.IAppender[] appenders = log4net.LogManager.GetRepository().GetAppenders();
foreach (log4net.Appender.IAppender app in appenders)
{
log4net.Appender.AppenderSkeleton skel = app as log4net.Appender.AppenderSkeleton;
if (skel != null && app.Name.StartsWith("Audit"))
{
skel.Threshold = enabled ? Level.All : Level.Off;
}
}
}