2010-10-19 2 views
21

lädt Ich habe die folgende Datei log4net.config in meinem ist:Log4net Konfiguration von Assembly-Attribute nicht Konfigurationsdatei

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

Und den folgenden Code in meiner Datei 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)] 

Wenn ich das Programm laufen lasse, erhalte ich die folgende log4net Debug-Ausgabe:

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 Lasten, aber scheint nicht meine Konfigurationsdatei zu verarbeiten. Wenn ich das Attribut in AssemblyInfo.cs kommentieren und den folgenden Code während meiner Programminitialisierung laufen, funktioniert es wie erwartet:

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

Was mache ich falsch? Ich möchte von AssemblyInfo.cs laden.

Antwort

30

Ich habe auch Probleme mit dieser Methode der Aufladung log4net. Die documentation sagt Sie einen Anruf tätigen müssen sehr früh in Ihrem Start der Anwendung

wenn Sie Konfiguration verwenden Attribute Sie log4net aufrufen müssen, damit sie die Attribute lesen. Ein einfacher Aufruf von LogManager.GetLogger führt dazu, dass die Attribute der aufrufenden Assembly gelesen und verarbeitet werden. Daher ist es unbedingt erforderlich, einen Protokollierungsaufruf so früh wie möglich während des Startvorgangs der Anwendung durchzuführen, und zwar bevor alle externen Assemblys geladen und aufgerufen wurden.

Versuchen Sie, einen Logger in derselben Klasse zu platzieren, die Ihre Anwendung startet (program.cs, app.xaml, was auch immer). Zum Beispiel

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

Und für Kicks, mache jeden Anruf in das Protokoll (auch eine, die aus dem Anfügen Prozess gefiltert oder ausgewertet werden, sollte es log4net zwingen Repository/Hierarchie zu bewerten).

static Program() 
{ 
    Log.Debug("Application loaded."); 
} 
+3

Wie immer, überprüfen Sie die interne log4net Debug-Ausgabe '' –

+0

Für eine Web-Service-Anwendung, wo soll das sein? – oliverdejohnson

+0

@oliverdejohnson Überprüfen Sie http://logging.apache.org/log4net/release/faq.html für Wie aktiviere ich log4net internes Debugging? Es zeigt, wie das Debugging und ein Trace Listener eingerichtet werden. –

0

Ich verwende Web.Config Abschnitte Logger zu konfigurieren und manuell Ereignisse protokollieren, Bootstrapping Logger von global.asax

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

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

von global.asax Bootstrapping Try it

3

I log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config"))); halten Sie in der Global.asax.cs innerhalb der Application_Start() ... Also muss ich den Befehl nicht überall tragen.

-1
var log4NetPath = Server.MapPath("~/log4net.config"); 

FileInfo fileInfo = new FileInfo(log4NetPath); 

XmlConfigurator.ConfigureAndWatch(fileInfo); 
+2

Sie müssen etwas Prosa hier hinzufügen, um zu erklären, was dieser Code tut. Es wurde bereits markiert und wird in der Überprüfungswarteschlange für minderwertige Posts angezeigt. Es besteht daher die Gefahr, dass es gelöscht wird. – sideshowbarker

5

schließlich ich nur die einfache Lösung zu finden, können Sie

  1. Globale helfen dort.asax in Start-Funktion

    protected void Application_Start() 
    { 
        log4net.Config.XmlConfigurator.Configure(); 
    } 
    
  2. In jedem der Klasse, wo auf Klassenebene Verwendung Protokollierung

Add-Namespace

using log4net; 

diesen Code Zeile

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
auf Klassenebene hinzufügen
  1. Verwendung Log-Funktion in einem der Aktionsaufruf

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

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

kann alles und einfach zu bedienen helfen. Danke

1

Ich reparierte dieses, indem ich das RepositoryAttribute der Datei AssemblyInfo.cs der widerwärtigen Versammlung hinzufüge.

[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 
[assembly: RepositoryAttribute("Your.Namespace.Here")] 
+0

Ich habe oben versucht, und jetzt gibt log4net keinen Fehler beim Erstellen des Repository für die Assembly, aber es schreibt immer noch nicht in die Protokolldatei. Nach dem Erstellen des Repositorys wurde die Assembly einfach beendet. irgendeine Idee?? – meghana