Bir yapılandırma dosyası kullanmak yerine log4net kodunu yapılandırabilir misiniz?


136

Log4net'in app.configgünlüğe kaydetmeyi ayarlamak için neden dosyaları kullandığını anlıyorum - böylece kodunuzu yeniden derlemeye gerek kalmadan bilgilerin nasıl günlüğe kaydedileceğini kolayca değiştirebilirsiniz. Ama benim durumumda app.configyürütülebilir dosya ile bir dosya paketlemek istemiyorum . Günlük kurulumumu değiştirmek istemiyorum.

Günlük kodunu kullanmak yerine kodunu ayarlamamın bir yolu var mı app.config?

İşte benim basit yapılandırma dosyası:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs\EventLog.txt" />
      <appendToFile value="false" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="1GB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
    </appender>
    <root>
      <level value="Info" />
      <appender-ref ref="RollingLogFileAppender" />
      <appender-ref ref="MemoryAppender" />
    </root>
  </log4net>
</configuration>

DÜZENLE:

Tamamen net olmak gerekirse: Amacım XML dosyası olmaması. Bir akışa dönüştüğüm gömülü bir kaynak olarak bile. Amacım kayıt cihazını tamamen programlı olarak tanımlamaktı. Mümkün olup olmadığını ve sözdiziminin bir örneğini bulabileceğim yerde merak ediyorum.

Yanıtlar:


223

NİHAİ ÇÖZÜM: 1

Gelecekte buna rastlayabilecek herkes için işte burada yaptım. Aşağıdaki statik sınıfı yaptı:

using log4net;
using log4net.Repository.Hierarchy;
using log4net.Core;
using log4net.Appender;
using log4net.Layout;

namespace Spectrum.Logging
{
    public class Logger
    {
        public static void Setup()
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = @"Logs\EventLog.txt";
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;            
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = Level.Info;
            hierarchy.Configured = true;
        }
    }
}

Ve sonra tek yapmam gereken, XML dosyasını çağırdığım kodu aşağıdaki çağrı ile değiştirmekti:

//XmlConfigurator.Configure(new FileInfo("app.config")); // Not needed anymore
Logger.Setup();

1 (bu cevap OP tarafından soruya düzenlendi, bunu topluluk yanıtı yapma özgürlüğünü aldım, nedenini görün )


2
Silindirin.File dizesinde değişkenler kullanıyorsanız, sonucu foller.File öğesine atamadan önce biçimlendirmek için log4net.Util.PatternString sınıfını kullanabilirsiniz.
Eric Scherrer

1
Bu yöntemi kullanarak yinelenen günlük girişleri elde sona erdi. Ben "hierarchy.Root.RemoveAllAppenders ();" ekleyerek çözdüm Kurulumun başlangıcına ().
Philip Bergström

4
Tüm bunlardan ILog'u nasıl edinebilirim?
Mickey Perlstein

3
BasicConfigurator.Configure(hierarchy);Sadece ayar yerine arama yapmadıkça benim için çalışmıyor hierarchy.Configured = true;.
Eivind Gussiås Løkseth

3
Günlük dosyasına yazmayı beklediğiniz işlemin, günlük dosyasının yazılmasını istediğiniz klasörde yazma izinlerine sahip olduğundan emin olun. Log4net sorunlarını teşhis etmek için log4net.Util.LogLog.InternalDebugging = true;herhangi bir log4net çağrısından önce ekleyin , ardından hata ayıklayıcı altında çalıştırın ve çıktıyı inceleyin. log4net işlerin nerede yanlış gittiğini size söyleyecektir.
Manfred

12

Ayrıca XML'den tamamen kaçabilirsiniz, burada minimum programatik yapılandırmaya sahip bir örnek yazdım .

Özetle, işte ihtiyacınız olan şey

var tracer = new TraceAppender();
var hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.AddAppender(tracer);
var patternLayout = new PatternLayout {ConversionPattern = "%m%n"};
patternLayout.ActivateOptions();
tracer.Layout = patternLayout;
hierarchy.Configured = true;

6
Hiyerarşi sınıfı ne için?
user20358

11

Evet, log4net'i aşağıdakileri arayarak yapılandırabilirsiniz:

log4net.Config.XmlConfigurator.Configure(XmlElement element)

Log4net belgelerine bakın .


Bağlantı artık öldü
Toby Smith

@TobySmith - düzeltildi.
Joe

4

Alternatif olarak, log4net.Config.ConfiguratorAttribute öğesinden devralınan özel bir öznitelik ve burada yapılandırdığınız sabit kodu oluşturabilirsiniz:

using log4net.Appender;
using log4net.Config;
using log4net.Core;
using log4net.Layout;
using log4net.Repository;
using log4net.Repository.Hierarchy;
using System;
using System.Reflection;

namespace ConsoleApplication1
{
    [AttributeUsage(AttributeTargets.Assembly)]
    public class MyConfiguratorAttribute : ConfiguratorAttribute
    {
        public MyConfiguratorAttribute()
            : base(0)
        {
        }

        public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
        {
            var hierarchy = (Hierarchy)targetRepository;
            var patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();

            var roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = @"Logs\EventLog.txt";
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            hierarchy.Root.Level = Level.Info;
            hierarchy.Configured = true;
        }
    }
}

Ardından, bir .cs dosyasına aşağıdakileri ekleyin:

[assembly: ConsoleApplication1.MyConfigurator]

1

Kök kaydediciye, ancak geçerli / diğer günlükçüye appender eklemek istemeyenler için:

//somewhere you've made a logger
var logger = LogManager.GetLogger("MyLogger");

// now add appender to it
var appender = BuildMyAppender();
((log4net.Repository.Hierarchy.Logger)logger).AddAppender(appender);

logger.Debug("MyLogger with MyAppender must work now");

// and remove it later if this code executed multiple times (loggers are cached, so you'll get logger with your appender attached next time "MyLogger")
((log4net.Repository.Hierarchy.Logger)logger).RemoveAppender(sbAppender);

0

Kabul edilen cevap iki uyarı buldum:

  • İlk başta benim için çalışmadı, ancak roller.Filemülk için tam bir mutlak yol kullandıktan sonra çalışmaya başladı.
  • Bunu F # (bir fsx komut dosyasında) kullanmak zorunda kaldı, bu yüzden C # dönüştürürken bazı sorunlar vardı. Sonuçla ilgileniyorsanız (log4net nuget paketini indirmenin bir yolu da dahil), aşağıya bakın:

nuget_log4net.fsx:

#!/usr/bin/env fsharpi

open System
open System.IO
open System.Net

#r "System.IO.Compression.FileSystem"
open System.IO.Compression

type DummyTypeForLog4Net () =
    do ()

module NetTools =

    let DownloadNuget (packageId: string, packageVersion: string) =
    use webClient = new WebClient()
    let fileName = sprintf "%s.%s.nupkg" packageId packageVersion

    let pathToUncompressTo = Path.Combine("packages", packageId)
    if (Directory.Exists(pathToUncompressTo)) then
        Directory.Delete(pathToUncompressTo, true)
    Directory.CreateDirectory(pathToUncompressTo) |> ignore
    let fileToDownload = Path.Combine(pathToUncompressTo, fileName)

    let nugetDownloadUri = Uri (sprintf "https://www.nuget.org/api/v2/package/%s/%s" packageId packageVersion)
    webClient.DownloadFile (nugetDownloadUri, fileToDownload)

    ZipFile.ExtractToDirectory(fileToDownload, pathToUncompressTo)

let packageId = "log4net"
let packageVersion = "2.0.5"
NetTools.DownloadNuget(packageId, packageVersion)

let currentDirectory = Directory.GetCurrentDirectory()

// https://stackoverflow.com/a/19538654/6503091
#r "packages/log4net/lib/net45-full/log4net"

open log4net
open log4net.Repository.Hierarchy
open log4net.Core
open log4net.Appender
open log4net.Layout
open log4net.Config

let patternLayout = PatternLayout()
patternLayout.ConversionPattern <- "%date [%thread] %-5level %logger - %message%newline";
patternLayout.ActivateOptions()

let roller = RollingFileAppender()
roller.AppendToFile <- true
roller.File <- Path.Combine(currentDirectory, "someLog.txt")
roller.Layout <- patternLayout
roller.MaxSizeRollBackups <- 5
roller.MaximumFileSize <- "1GB"
roller.RollingStyle <- RollingFileAppender.RollingMode.Size
roller.StaticLogFileName <- true
roller.ActivateOptions ()

let hierarchy = box (LogManager.GetRepository()) :?> Hierarchy
hierarchy.Root.AddAppender (roller)

hierarchy.Root.Level <- Level.Info
hierarchy.Configured <- true
BasicConfigurator.Configure(hierarchy)

let aType = typedefof<DummyTypeForLog4Net>
let logger = LogManager.GetLogger(aType)

logger.Error(new Exception("exception test"))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.