Bạn có thể cấu hình log4net trong mã thay vì sử dụng tệp cấu hình không?


136

Tôi hiểu tại sao log4net sử dụng app.configcác tệp để thiết lập ghi nhật ký - vì vậy bạn có thể dễ dàng thay đổi cách ghi thông tin mà không cần phải biên dịch lại mã của mình. Nhưng trong trường hợp của tôi, tôi không muốn đóng gói một app.configtập tin với tệp thực thi của mình. Và tôi không có mong muốn sửa đổi thiết lập đăng nhập của tôi.

Có cách nào để tôi thiết lập đăng nhập mã thay vì sử dụng app.configkhông?

Đây là tập tin cấu hình đơn giản của tôi:

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

BIÊN TẬP:

Hoàn toàn rõ ràng: Mục tiêu của tôi là không có tệp XML. Thậm chí không phải là một tài nguyên nhúng mà tôi biến thành một luồng. Mục tiêu của tôi là xác định logger hoàn toàn theo chương trình. Chỉ tò mò nếu nó có thể và nếu vậy tôi có thể tìm thấy một ví dụ về cú pháp.

Câu trả lời:


223

GIẢI PHÁP CUỐI CÙNG: 1

Đối với bất cứ ai có thể vấp ngã trong tương lai, đây là những gì tôi đã làm. Tôi đã thực hiện lớp tĩnh bên dưới:

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

Và sau đó, tất cả những gì tôi phải làm là thay thế mã nơi tôi gọi tệp XML bằng lệnh gọi sau:

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

1 (câu trả lời này đã được OP chỉnh sửa thành câu hỏi, tôi đã tự do biến nó thành câu trả lời của cộng đồng, xem tại sao )


2
Chỉ cần một lưu ý nếu bạn sử dụng các biến trong chuỗi roller.File của mình, bạn có thể sử dụng lớp log4net.Util.PotypeString để định dạng nó trước khi gán kết quả cho foller.File.
Eric Scherrer

1
Tôi đã kết thúc nhận được các mục nhật ký trùng lặp bằng phương pháp này. Tôi đã giải quyết nó bằng cách thêm "hVELy.Root.RemoveAllAppenders ();" đến đầu Cài đặt ().
Philip Bergström

4
Từ tất cả những điều này, làm thế nào để tôi có được ILog?
Mickey Perlstein

3
Không làm việc cho tôi trừ khi tôi gọi BasicConfigurator.Configure(hierarchy);thay vì chỉ cài đặt hierarchy.Configured = true;.
Eivind Gussiås Løkseth

3
Đảm bảo rằng quá trình bạn muốn ghi vào tệp nhật ký có quyền ghi trong thư mục mà bạn muốn tệp nhật ký được ghi. Để chẩn đoán các vấn đề log4net thêm log4net.Util.LogLog.InternalDebugging = true;trước bất kỳ cuộc gọi log4net nào khác, sau đó chạy theo trình gỡ lỗi và kiểm tra đầu ra. log4net sẽ cho bạn biết mọi thứ đi sai ở đâu.
Manfred

12

Bạn cũng có thể thoát hoàn toàn XML, tôi đã viết một mẫu với cấu hình lập trình tối thiểu ở đây .

Tóm lại, đây là những gì bạn cần

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
Lớp phân cấp để làm gì?
dùng2058

11

Có, bạn có thể định cấu hình log4net bằng cách gọi:

log4net.Config.XmlConfigurator.Configure(XmlElement element)

Xem tài liệu log4net .


Liên kết hiện đã chết
Toby Smith

@TobySmith - đã sửa.
Joe

4

Ngoài ra, bạn có thể tạo một thuộc tính tùy chỉnh kế thừa từ log4net.Config.ConfiguratorAttribution và mã cứng mà bạn cấu hình ở đó:

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

Sau đó thêm phần sau vào tệp .cs:

[assembly: ConsoleApplication1.MyConfigurator]

1

Đối với những người không muốn thêm appender vào Root logger, nhưng với logger hiện tại / khác:

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

Câu trả lời được chấp nhận hoạt động sau khi tôi tìm thấy hai hãy cẩn thận:

  • Nó không hoạt động với tôi lúc đầu, nhưng sau khi sử dụng một đường dẫn tuyệt đối đầy đủ cho roller.Filetài sản, nó bắt đầu hoạt động.
  • Tôi đã phải sử dụng điều này trong F # (trong tập lệnh fsx), vì vậy đã có một số vấn đề khi chuyển đổi nó từ C #. Nếu bạn quan tâm đến kết quả cuối cùng (bao gồm cả cách tải xuống gói nuget log4net), hãy xem bên dưới:

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"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.