Log4net configuration from assembly атрибут не загружает файл конфигурации
у меня есть следующий файл Log4net.config в моем каталоге bin:
<?xml version="1.0" encoding="utf-8" ?>
<log4net xmlns="urn:log4net">
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<param name="file" value="MyLogFile.log"/>
<param name="appendToFile" value="false"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
</layout>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date (%logger) [%5level] - %message" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
<appender-ref ref="ConsoleAppender"/>
</root>
<logger name="NHibernate" additivity="false">
<level value="WARN"/>
</logger>
</log4net>
и следующий код в моем файле AssemblyInfo.cs файл:
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyTitle("My Project")]
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
когда я запускаю программу, я получаю следующий вывод отладки log4net:
log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [D:DataProjectsActiveClientsMyProjectsrcMyProject.ImporterbinDebuglog4net.dll]. (.NET Runtime [4.0.30319.1] on Microsoft Windows NT 6.1.7600.0)
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository for assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] Loaded From [D:DataProjectsActiveClientsMyProjectsrcMyProject.ImporterbinDebugMyCompany.Framework.dll]
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: DefaultRepositorySelector: Assembly [MyCompany.Framework, Version=2.1.72.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
The thread 'vshost.RunParkingWindow' (0xd30) has exited with code 0 (0x0).
The thread '<No Name>' (0x15d0) has exited with code 0 (0x0).
log4net: Hierarchy: Shutdown called on Hierarchy [log4net-default-repository]
Log4net загружается, но, похоже, не обрабатывает мой файл конфигурации. Когда я комментирую атрибут в AssemblyInfo.cs и запустите следующий код во время инициализации моей программы, он работает как ожидалось:
var log4netConfig = "Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);
что я делаю не так? Я хочу загрузить из AssemblyInfo.цезий.
6 ответов
у меня также есть проблемы с этим методом boostrapping log4net. The документация говорит, что вы должны сделать звонок в самом начале запуска приложения
Если вы используете атрибуты конфигурации, вы должны вызвать log4net, чтобы позволить ему читать атрибуты. Простой вызов LogManager.GetLogger вызовет чтение и обработку атрибутов вызывающей сборки. поэтому необходимо сделать вызов журнала как можно раньше во время запуск приложения и, конечно же, перед загрузкой и вызовом любых внешних сборок.
Попробуйте поместить регистратор в тот же класс, который запускает ваше приложение (программу.cs, app.xaml, что угодно). Например
private static readonly ILog Log = LogManager.GetLogger(typeof(Program));
и для пинков сделайте любой вызов журнала (даже тот, который фильтруется или оценивается из процесса добавления, он должен заставить log4net оценить ваш репозиторий/heirarchy).
static Program()
{
Log.Debug("Application loaded.");
}
наконец-то я нашел простое решение, вы можете получить помощь
-
глобальные.asax в функции Start
protected void Application_Start() { log4net.Config.XmlConfigurator.Configure(); }
в любом классе, где используется ведение журнала на уровне класса
добавить пространство имен
using log4net;
добавить эту строку кода на уровне класса
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-
используйте функцию журнала в любом из действий звоните
log.Error("test error q111..");
-
конфигурация
<configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net " /> </configSection> <log4net debug="true"> <!--AdoNet appender is use for write log file into sql server--> <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="1" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=DESKTOP-NLH31FH; Initial Catalog=SmallBizDb;Integrated Security=true" providerName="System.Data.SqlClient" /> <commandText value="INSERT INTO [dbo].[Logs] ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@logdate,@thread, @loglevel, @logger, @message, @exception)" /> <parameter> <parameterName value="@logdate" /> <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="@loglevel" /> <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> <!--Add appender which you want to use, You can add more then one appender . Like if you want save log both plain text or sql server ,Add both appender.--> <root> <level value="Debug" /> <!--<appender-ref ref="RollingLogFileAppender" />--> <!--Enable this line if you want write log file into plain text file--> <appender-ref ref="AdoNetAppender" /> <!--Enable this line if you want write log file into sql server--> </root> </log4net> <appSettings> <add key="log4net.Internal.Debug" value="true"/> </appSettings> </configuration>
это может помочь всем и прост в использовании. спасибо
Я log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
в мировой.асакс.cs внутри Application_Start()... Так что мне не нужно разносить команду повсюду.
я исправил это путем добавления RepositoryAttribute к AssemblyInfo оскорбительной сборки.cs файл.
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: RepositoryAttribute("Your.Namespace.Here")]
Я использую Web.Разделы конфигурации для настройки Logger и вручную регистрировать события, загрузочный Logger от global.асакс
static ILog logger = LogManager.GetLogger(<LoggerName>);
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
}
попробуйте загрузить его из global.асакс
var log4NetPath = Server.MapPath("~/log4net.config");
FileInfo fileInfo = new FileInfo(log4NetPath);
XmlConfigurator.ConfigureAndWatch(fileInfo);