Wo erstellt log4net diese Protokolldatei?

76

logs\log-file.txtWo genau wird dieser Ordner erstellt, wenn ich den Dateiwert auf setze ? Im /binVerzeichnis?

Meine web.config sieht folgendermaßen aus:

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="logs\log-file.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
</log4net>

Ist dies die richtige Art zu protokollieren:

ILog logger = LogManager.GetLogger(typeof(CCController));
logger.Error("Some Page", ex);  // where ex is the exception instance
Blankman
quelle

Antworten:

67

Wenn Sie möchten, dass Ihre Protokolldatei an einem bestimmten Speicherort abgelegt wird, der zur Laufzeit als Projektausgabeverzeichnis festgelegt wird, können Sie Ihren .configDateieintrag auf diese Weise konfigurieren

<file type="log4net.Util.PatternString" value="%property{LogFileName}.txt" />

und dann im Code vor dem Aufruf log4net configureden neuen Pfad wie unten festlegen

 log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
 log4net.Config.XmlConfigurator.Configure();

Wie einfach ist das? :) :)

Avijit Chatterjee
quelle
2
Toller Trick, es hilft, die gesamte Konfiguration an einem Ort zu platzieren :)
Hoàng Long
1
Was ist, wenn Sie mehrere Protokolldateien in einem Programm haben möchten, von denen jede zur Laufzeit in einem anderen Pfad festgelegt ist? Gibt es eine Möglichkeit, die Eigenschaft LogFileName nicht in einem globalen freigegebenen Kontext festzulegen?
Jimmy
Es gibt andere Muster, wie z. B.% date {}, die verwendet werden können, sobald Sie den Typ log4net.Util.PatternString
Justin
51

Die Datei wird im Stammverzeichnis Ihres Projekts / Ihrer Lösung erstellt.

Sie können in der web.config Ihrer App einen Speicherort Ihrer Wahl wie folgt angeben:

   <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="c:/ServiceLogs/Olympus.Core.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value=".yyyyMMdd.log" />
      <maximumFileSize value="5MB" />
      <staticLogFileName value="true" />
      <lockingModel type="log4net.Appender.RollingFileAppender+MinimalLock" />
      <maxSizeRollBackups value="-1" />
      <countDirection value="1" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" />
      </layout>
    </appender>

Das Datei-Tag gibt den Speicherort an.

Oladipo Olasemo
quelle
16
+1 die einzige Antwort, die direkt die Frage beantwortet "Wo wird log4net diese Protokolldatei erstellen?"
Keith
5
Hallo Oladipo, für mich ohne Pfaddefinition wird ein Protokoll im bin-Ordner erstellt.
Pompair
20

Der Dateiwert kann entweder ein absoluter Pfad wie "c: \ logs \ log.txt" oder ein relativer Pfad sein, von dem ich glaube, dass er relativ zum bin-Verzeichnis ist.

Bei der Implementierung setze ich normalerweise Folgendes an die Spitze jeder Klasse, in die ich mich einloggen möchte:

private static readonly ILog Log = LogManager.GetLogger( 
MethodBase.GetCurrentMethod().DeclaringType);

Schließlich können Sie es so verwenden:

Log.Debug("This is a DEBUG level message.");
Ben.Vineyard
quelle
4
hmm..es scheint die Protokolldatei nirgendwo zu erstellen, und ich erhalte keine Fehlermeldung?
Blankman
2
Klingt nach Berechtigungsproblemen. Ich würde die Konfiguration einem absoluten Pfad außerhalb Ihres Webverzeichnisses zuordnen. Stellen Sie anschließend sicher, dass die Protokolldatei und der Ordner über Berechtigungen verfügen, damit der asp.net-Worker ordnungsgemäß zugreifen kann.
Ben.Vineyard
Für einen relativen Pfad möchte ich, dass sich die Protokolldatei auf Projektebene befindet: <file value = "../../log.text" />
Dave Mateer
@Blankman Ich hatte ein ähnliches Problem. Das Problem ist nicht der Pfad oder die Berechtigung, sondern dass ich vergessen habe, die Konfiguration aufzurufen, um die Protokollierung zu starten. Bitte lesen Sie die Antwort auf die andere Frage zum Stapelüberlauf. stackoverflow.com/questions/20512548/…
Nap
10

Log4net speichert in Ihrem Projektordner. So etwas wie : \SolutionFolder\ProjectFolder\bin\SolutionConfiguration\logs\log-file.txt.

Wo:

  • In SolutionFolder speichern Sie Ihre Lösung
  • ProjectFolder ist der Ordner, in dem sich Ihr Projekt in der Lösung befindet
  • SolutionConfiguration ist der Ordner, der alle Binärdateien Ihres Projekts enthält (der Standardwert ist Debug oder Release).

Hoffe das hilft!

Alfredo Cavalcanti
quelle
6
FileAppender appender = repository.GetAppenders().OfType<FileAppender>().FirstOrDefault();
if (appender != null)
    logger.DebugFormat("log file located at : {0}", appender.File);
else
    logger.Error("Could not locate fileAppender");
Mickey Perlstein
quelle
2
ILoggerRepository repository = log4net.LogManager.GetAllRepositories (). FirstOrDefault ();
Louis Somers
2
Das Repository ist bereits hier : yourlogger.Logger.Repository. So können Sie Folgendes machen : yourlogger.Info($"Logfile opened: {m_Logger.Logger.Repository.GetAppenders().OfType<FileAppender>().FirstOrDefault()?.File}");. Beachten Sie, dass es nicht kaputt geht, wenn etwas ist null.
Nicolas
4

Gehen Sie für den Protokollordner und die Datei mit @ Bens Antwort .

Ich werde jedoch den Teil zum Erstellen des Protokolls kommentieren. Imo gibt es keinen richtigen Weg. Wenn ich Logger manuell codiere, mache ich es so, wie Sie es machen:

ILog logger = LogManager.GetLogger(typeof(CCController));

weil es kurz und prägnant ist.

Trotzdem erstelle ich heutzutage keine Logger-Instanzen innerhalb der Klassen , sondern lasse sie von meinem IoC-Container injizieren .

Peter Lillevold
quelle
0

Ich denke, Ihr Beispiel wird in Ihren Projektordnern gespeichert. Wenn der Standardbenutzer iis oder .NET keine Erstellungsberechtigung hat, kann er den Protokollordner nicht erstellen.

Ich würde zuerst den Protokollordner erstellen und dem Benutzer die volle Berechtigung erteilen und prüfen, ob die Protokolldatei erstellt wird.

Griegs
quelle
0

Wenn Sie den Pfad zur Protokolldatei dynamisch auswählen möchten, verwenden Sie die in diesem Link beschriebene Methode : Methode zur dynamischen Auswahl des Protokolldateipfads .

Wenn Sie möchten, können Sie den Pfad zu dem Ort festlegen, an dem Ihre App-EXE-Datei vorhanden ist.

var logFileLocation = System.IO.Path.GetDirectoryName
(System.Reflection.Assembly.GetEntryAssembly().Location);

und senden Sie diese 'logFileLocation' dann an die im obigen Link geschriebene Methode wie folgt:

Initialize(logFileLocation);

und du bist bereit zu gehen! :) :)

Ben.S
quelle
0

Ich habe für .NET Core 2.1 mit log4net 2.0.8 entwickelt und festgestellt, dass NealWalters-Code über 0 Argumente für XmlConfigurator.Configure () stöhnt. Ich habe hier eine Lösung von Matt Watson gefunden

        log4net.GlobalContext.Properties["LogFileName"] = @"E:\\file1"; //log file path
        var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
        XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
Andrew Pate
quelle