Конфигурация Log4net из атрибута сборки не загружает файл конфигурации - PullRequest
27 голосов
/ 19 октября 2010

В моем каталоге bin есть следующий файл Log4net.config:

<?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:\Data\Projects\Active\Clients\MyProject\src\MyProject.Importer\bin\Debug\log4net.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:\Data\Projects\Active\Clients\MyProject\src\MyProject.Importer\bin\Debug\MyCompany.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.cs.

Ответы [ 6 ]

36 голосов
/ 15 июня 2011

У меня также есть проблемы с этим методом загрузки log4net. документация говорит, что вы должны сделать звонок очень рано при запуске приложения

если вы используете атрибуты конфигурации, вы должны вызвать log4net, чтобы позволить ему читать атрибуты. Простой вызов LogManager.GetLogger вызовет чтение и обработку атрибутов в вызывающей сборке. Поэтому крайне важно сделать запись в журнале как можно раньше во время запуска приложения и, безусловно, до того, как какие-либо внешние сборки были загружены и вызваны.

Попробуйте поместить регистратор в тот же класс, который запускает ваше приложение (program.cs, app.xaml, что угодно). Например

private static readonly ILog Log = LogManager.GetLogger(typeof(Program));

И для пиков, сделайте любой вызов в журнал (даже тот, который отфильтрован или оценен из процесса добавления, он должен заставить log4net оценить ваш репозиторий / иерархию).

static Program()
{
    Log.Debug("Application loaded.");
}
6 голосов
/ 01 февраля 2016

наконец, я просто нахожу простое решение, вы можете получить помощь там

  1. Global.asax в функции запуска

     protected void Application_Start()
     {
       log4net.Config.XmlConfigurator.Configure();
     }
    
  2. Влюбой из классов, где используется ведение журнала на уровне класса

добавить пространство имен

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>

это может помочь всеми прост в использовании.спасибо

4 голосов
/ 24 января 2015

Я сохраняю log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); в Global.asax.cs внутри Application_Start () ... Так что мне не нужно переносить команду повсюду.

2 голосов
/ 07 декабря 2016

Я исправил это, добавив RepositoryAttribute в файл AssemblyInfo.cs нарушающей сборки.

[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: RepositoryAttribute("Your.Namespace.Here")]
0 голосов
/ 13 октября 2015
var log4NetPath = Server.MapPath("~/log4net.config");

FileInfo fileInfo = new FileInfo(log4NetPath);

XmlConfigurator.ConfigureAndWatch(fileInfo);
0 голосов
/ 16 января 2015

Я использую разделы Web.Config, чтобы настроить Logger и вручную регистрировать события, Bootstrapping Logger из global.asax

static ILog logger = LogManager.GetLogger(<LoggerName>);

protected void Application_Start()
{
   log4net.Config.XmlConfigurator.Configure(); 
}

Попробуйте загрузить его из global.asax

...