it-swarm.dev

Konfiguracja Log4net z atrybutu Assembly nie ładuje pliku konfiguracyjnego

Mam następujący plik Log4net.config w moim katalogu 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>

I następujący kod w moim pliku 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)]

Po uruchomieniu programu otrzymuję następujące wyjście debugowania 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 ładuje się, ale wydaje się, że nie przetwarza mojego pliku konfiguracyjnego. Kiedy komentuję atrybut w AssemblyInfo.cs i uruchamiam następujący kod podczas inicjalizacji programu, działa zgodnie z oczekiwaniami:

var log4netConfig = "Log4net.config";
var log4netInfo = new FileInfo(log4netConfig);
log4net.Config.XmlConfigurator.ConfigureAndWatch(log4netInfo);

Co ja robię źle? Chcę załadować z AssemblyInfo.cs.

26
Chris

Mam również problem z tą metodą boostrapping log4net. Dokumentacja mówi, że musisz nawiązać połączenie bardzo wcześnie podczas uruchamiania aplikacji

jeśli używasz atrybutów konfiguracyjnych, musisz wywołać log4net, aby umożliwić mu odczytanie atrybutów. Proste wywołanie LogManager.GetLogger spowoduje, że atrybuty wywołującego zestawu zostaną odczytane i przetworzone. Dlatego konieczne jest wywołanie rejestrowania tak wcześnie, jak to możliwe podczas uruchamiania aplikacji, a już na pewno przed załadowaniem i wywołaniem jakichkolwiek zewnętrznych zestawów.

Spróbuj umieścić rejestrator w tej samej klasie, która uruchamia aplikację (program.cs, app.xaml, cokolwiek). Na przykład

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

I dla kopnięć, wywołaj dowolny dziennik (nawet taki, który jest filtrowany lub oceniany poza procesem dołączania, powinien wymusić na log4net ocenę twojego repozytorium/heirarchii).

static Program()
{
    Log.Debug("Application loaded.");
}
35
Anthony Mastrean

wreszcie znajduję proste rozwiązanie, możesz uzyskać pomoc

  1. Global.asax w funkcji start 

     protected void Application_Start()
     {
       log4net.Config.XmlConfigurator.Configure();
     }
    
  2. W każdej klasie, w której używane jest logowanie na poziomie klasy

dodaj przestrzeń nazw

using log4net;

dodaj tę linię kodu na poziomie klasy

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  1. użyj funkcji dziennika w dowolnym wywołaniu akcji

    log.Error("test error q111..");
    
  2. konfiguracja

    <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>
    

może pomóc wszystkim i być łatwym w użyciu. dzięki

6
adnan

Zachowuję log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); w Global.asax.cs wewnątrz Application_Start () ... Więc nie muszę przenosić polecenia w różnych miejscach. 

4
rkmorgan

Naprawiłem to, dodając RepositoryAttribute do pliku AssemblyInfo.cs, który narusza reguły.

[Assembly: AssemblyTrademark("")]
[Assembly: AssemblyCulture("")]
[Assembly: RepositoryAttribute("Your.Namespace.Here")]
1
NightShovel

Korzystam z sekcji Web.Config, aby skonfigurować program Logger i ręcznie rejestrować zdarzenia, Logger Bootstrapping z global.asax

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

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

Spróbuj załadować go z global.asax

0
Rahul Jujarey