2014-11-06 1 views
6

Ich arbeite mit einer Lösung auf Visual Studio 2008, .net Framework 3.5, Windows 7. Ich habe eine log4net-Bibliothek erstellt, die in eine TXT-Datei schreibt und möchte es in mehreren Projekten auf meiner Lösung und auch auf einem WCF-Service, der in der gleichen Lösung ist, die lokal von Visual Studio ausgeführt wird.Wie log4net einzurichten, so dass es auf einem WCF-Dienst funktioniert?

Ich starte das Programm von einer Konsolenanwendung auf der Lösung. Und die Konsolen-App ruft die anderen Projekte auf, und diese Projekte verwenden log4net. Auf dieser Ebene im Workflow ist das Protokoll gut geschrieben. Das Problem tritt auf, wenn der WCF-Dienst aufgerufen wird. Der Dienst wcf verwendet das Protokoll, log4net schreibt jedoch nicht in die Datei.

Auf der Konsole Projekt Ich habe diese:

Auf der AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

Auf der App.config Ich habe die log4net-Konfiguration.

Auf Program.cs, auf der Main-Methode habe ich:

LogManager.GetLogger("Initialise log4net from the current assembly attributes"); 

Auf dem WCF-Dienst Ich habe dies:

das gleiche auf der AssemblyInfo.cs als Konsolenprojekt.

Gleiches in Web.config wie die App.config im Konsolenprojekt.

Auf dem Konstruktor der Service1.svc ich habe:

LogManager.GetLogger("Initialise log4net from the current assembly attributes"); 

Dies ist, wie mein App.config und Web.Config loos wie:

innerhalb des configSections tag:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/> 

und in der Hauptkonfiguration Tag:

<log4net> 
    <root> 
     <level value="DEBUG"/> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" > 
     <file value="C:\test3.txt"/> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="5" /> 
     <maximumFileSize value="10MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d [%t] %-5p %c %m%n" /> 
     </layout> 
    </appender> 
    </log4net> 

Wie kann ich das lösen?

+0

ich es nie geschafft, meine WCF-Dienste zu erhalten Montage zu verwenden Attribute, am Ende habe ich aufgegeben und einfach 'XmlConfigurator.ConfigureAndWatch (...) ' – stuartd

+0

@stuartd Sie sagen, ich sollte den log4net Teil in der web.config des Dienstes entfernen und den Teil auf der AssemblyInfo.cs auf dem Dienst belassen. Ich habe das geändert, aber der Dienst schreibt nicht in die Datei. – pyram

+1

Nein, ich habe es nie geschafft, dass meine WCF-Dienste log4net über Assembly-Attribute geladen haben. Daher habe ich den XmlConfigurator verwendet, um die Protokollierung zu konfigurieren. Ich habe nicht zu viel Zeit damit verbracht, denn ich wollte arbeiten und weitermachen. Gibt 'LogManager.GetRepository(). Configured' nach Ihrem Aufruf von GetLogger den Wert" true "zurück? – stuartd

Antwort

3

Haben Sie ein Beispiel für den XmlConfigurator, damit ich die Protokollierung konfigurieren kann?

var logpath = HostingEnvironment.MapPath("~/web.config"); 
var fileInfo = new FileInfo(logpath); 

if (fileInfo.Exists == false) 
{ 
    throw new InvalidOperationException("Can't locate the web.config file"); 
} 

log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo); 

Beachten Sie, dass nur die Überlastung des ConfigureAndWatch Verfahren, das ein Fileinfo nimmt kann eine app.config oder web.config zusehen, wie sie die CONFIG-Datei direkt anstelle der Verwendung System.Configuration liest (was einmal liest Die Datei kann sie nicht erneut lesen).

Die Dokumentation erklärt dieses here.

Edit von @pyram: weil beide Projekte auf die gleiche Datei protokollieren war es notwendig, diese Zeile in der appender Config beider Projekte hinzuzufügen:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

Ich habe Ihren Antwortcode vor dem Aufruf der GetLogger-Methode im Dienstkonstruktor platziert. Ich kann das sehen ** LogManager.GetRepository(). Configured ** gibt true zurück, aber der Dienst schreibt nicht in die Datei. Ich habe meine Konfiguration in meine Frage gestellt. – pyram

+1

Config sieht OK aus. Machst du einen Anruf? – stuartd

+0

ein Aufruf der GetLogger-Methode? ..... ja, in meinem Service-Konstruktor habe ich Ihren Code platziert, und gleich danach habe ich das Protokoll wie folgt aufgerufen ** LogManager.GetLogger ("LogNet von LogLogger initialisieren Die aktuellen Assembly-Attribute "); ** – pyram

Verwandte Themen