Я нашел другие сообщения с похожими проблемами, но пока не могу решить свой конкретный случай.
Если я помещу конфигурацию log4net в app.config, тогда все будет работать нормально, но я хочу, чтобы это было в отдельном файле.
Я просмотрел следующие ссылки и попытался реализовать некоторые из предложенных решений (но, возможно, я это неправильно понял):
Аналогичный вопрос SO, но с веб-сценарием
Документация Apache, раздел «Чтение файлов напрямую»
Итак, вот содержимое моего файла Log4NetSettings.config (заключенного в элемент конфигурации):
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="" />
<commandText value="INSERT INTO [Calculation Engine Log] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="AdoNetAppender"/>
</root>
</log4net>
Я меняю значение строки подключения во время выполнения.
Вот что у меня есть в app.config:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<appSettings>
<add key="log4net.Config" value="Log4NetSettings.config" />
</appSettings>
<log4net configSource="Log4NetSettings.config" />
В исполняемом классе у меня есть это:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4NetSettings.config", Watch = true)]
а затем, как только я получаю строку подключения и настраиваю ее для AdoNetAppender, я вызываю:
log.Info("Testing");
У меня тоже есть:
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
в классе с атрибутом сборки и первым вызовом журнала.
В файле Log4NetSettings.config для действия сборки установлено значение Content, а для параметра «Копировать в выходной каталог» установлено значение «Всегда копировать».
Я выдергивал волосы и не знаю, что делаю не так. Следует ли мне использовать Log4NetSettings.config как обычный XML-файл? Следует ли поместить атрибут сборки в файл AssemblyInfo.cs? Мне лучше позвонить:
XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4NetSettings.config"));
чем у сборочного атрибута?
Такое ощущение, что я перепробовал столько разных вещей, что, возможно, перепутал их и получил неправильную комбинацию.
log4net.Config.XmlConfigurator.Configure(new Uri(System.IO.Directory.GetCurrentDirectory() + @"\Config\LogConfig.xml"));
- person o_weisman   schedule 15.04.2015