আপনি একটি কনফিগার ফাইল ব্যবহারের পরিবর্তে কোডে লগ 4 নেট কনফিগার করতে পারেন?


136

আমি বুঝতে পেরেছি কেন লগ 4 নেট app.configলগিং সেট আপ করার জন্য ফাইলগুলি ব্যবহার করে - যাতে আপনি আপনার কোডটি পুনরায় সংকলনের প্রয়োজন ছাড়াই তথ্য কীভাবে লগইন করা যায় তা সহজেই পরিবর্তন করতে পারবেন। তবে আমার ক্ষেত্রে আমি app.configআমার এক্সিকিউটেবলের সাথে কোনও ফাইল প্যাক করতে চাই না । এবং আমার লগিং সেটআপটি পরিবর্তন করার কোনও ইচ্ছা আমার নেই।

আমার বদলে কোড লগ-ইন ব্যবহার সেট আপ করার জন্য একটি উপায় আছে কি app.config?

এখানে আমার সাধারণ কনফিগারেশন ফাইলটি দেওয়া হয়েছে:

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

সম্পাদনা করুন:

সম্পূর্ণ পরিষ্কার হতে: এক্সএমএল ফাইল না রাখা আমার লক্ষ্য। এমনকী এম্বেড হওয়া সংস্থান হিসাবেও নয় যে আমি একটি স্রোতে পরিণত করি। আমার লক্ষ্য ছিল লगरকে পুরোপুরি প্রোগ্রামগতভাবে সংজ্ঞায়িত করা। এটি সম্ভব হলে কেবল কৌতূহল এবং যদি তাই হয় যেখানে আমি সিনট্যাক্সের উদাহরণ খুঁজে পেতে পারি।

উত্তর:


223

শেষ সমাধান: 1

ভবিষ্যতে যে কেউ এতে হোঁচট খেতে পারে তার জন্য আমি এখানে যা করেছি তা এখানে। আমি নীচে স্থির শ্রেণি তৈরি করেছি:

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

এবং তারপরে আমাকে যা করতে হয়েছিল তা হ'ল নিম্নলিখিত কোডের সাথে XML ফাইলকে কোডটি প্রতিস্থাপন করেছি:

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

1 (এই উত্তরটি ওপি কর্তৃক প্রশ্নের উত্তরে সম্পাদিত হয়েছিল, আমি এটি একটি সম্প্রদায়কে উত্তর হিসাবে মুক্ত করার স্বাধীনতা নিয়েছি, কেন এখানে দেখুন )


2
আপনি যদি আপনার রোলারআল.ফায়াল স্ট্রিংয়ে ভেরিয়েবলগুলি ব্যবহার করেন তবে কেবল একটি নোট আপনি ফল 4 ফলের ক্ষেত্রে ফলাফল নির্ধারণের আগে ফর্ম্যাট করতে log4net.Util.PatternString বর্গ ব্যবহার করতে পারেন।
এরিক Scherrer

1
আমি এই পদ্ধতিটি ব্যবহার করে সদৃশ লগ এন্ট্রি পেয়েছি। আমি "শ্রেণিবদ্ধ। রুট। রিমুওএল অ্যাপেন্ডারস ()" যোগ করে এটি সমাধান করেছি; সেটআপ () এর শুরুতে।
ফিলিপ বার্গস্ট্রোম

4
এই সমস্ত থেকে, আমি কীভাবে আইএলজি পাব?
মিকি পার্লস্টাইন

3
আমি BasicConfigurator.Configure(hierarchy);কেবল সেটিংয়ের পরিবর্তে কল না করা আমার পক্ষে কাজ করে না hierarchy.Configured = true;
আইভিন্দ গুসিসের লাক্সেথ

3
লগ ফাইলটিতে যে প্রক্রিয়াটি আপনি লিখতে চেয়েছিলেন তা যে ফোল্ডারে লগ ফাইলটি আপনি লেখতে চান তাতে ফোল্ডারে লেখার অনুমতি রয়েছে তা নিশ্চিত করুন। লগ 4 নেট সমস্যাগুলি নির্ণয় করতে log4net.Util.LogLog.InternalDebugging = true;অন্য কোনও লগ 4 নেট কলের আগে যুক্ত করুন , তারপরে ডিবাগারের অধীনে চলুন এবং আউটপুটটি পরীক্ষা করুন। লগ 4 নেট আপনাকে বলবে যেখানে জিনিসগুলি ভুল হয়।
মানফ্রেড

12

আপনি এক্সএমএল সম্পূর্ণরূপে পালাতে পারেন, আমি এখানে ন্যূনতম প্রোগ্রাম্যাটিক কনফিগারেশন সহ একটি নমুনা লিখেছি ।

সংক্ষেপে, আপনার যা প্রয়োজন তা এখানে

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
হায়ারার্কি ক্লাসটি কিসের জন্য?
ব্যবহারকারী 20358


4

বিকল্পভাবে আপনি একটি কাস্টম অ্যাট্রিবিউট তৈরি করতে পারেন যা লগ 4 নেট থেকে প্রাপ্ত হয় on

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

তারপরে একটি .cs ফাইলে নিম্নলিখিতটি যুক্ত করুন:

[assembly: ConsoleApplication1.MyConfigurator]

1

যারা রুট লগারে অ্যাপেন্ডার যুক্ত করতে চান না, তবে বর্তমান / অন্যান্য লগারে:

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

আমি দুটি ক্যাভেটের সন্ধান পাওয়ার পরে গৃহীত উত্তরটি কাজ করে:

  • এটি প্রথমে আমার পক্ষে কাজ করছিল না, তবে roller.Fileসম্পত্তির জন্য একটি সম্পূর্ণ বিস্মৃত পথ ব্যবহার করার পরে , এটি কাজ শুরু করে।
  • আমাকে এফ # তে এটি ব্যবহার করতে হয়েছিল (একটি এফএসএক্স স্ক্রিপ্টে), তাই এটি সি # থেকে রূপান্তর করার সময় কিছু সমস্যা ছিল। আপনি যদি শেষ ফলাফলটিতে আগ্রহী হন (লগ 4 নেট ন্যুগেট প্যাকেজ ডাউনলোড করার উপায় সহ), নীচে দেখুন:

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"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.