LoginSignup
0
0

More than 1 year has passed since last update.

脱config file

Posted at

log4net で logger を使おうとしてググるとほぼ100% xml でその定義をした例しかない.
多分それで事足りるんだろうし,十分なんだろうけど, logger class を共通なものを保持しておいて,他のプロジェクトで参照して,参照先プロジェクトで別なlog file を作りたいとか,動的に吐き出し先を変えたいとかはなんか難しい.

ならlogger 作成から動的にすればいいじゃないって感じの記事です.
まぁ英語ベースならいくらでも?あるんですが,せっかくなので日本語で書いてみる.

環境

.Net 6
log4net version: 2.0.15

ベースになるだろう logger class

今回はベースには, Console 出力として, Error のみファイルに書き出す.
ファイルは,日付ごとにファイルは分けることにしてみた.
(xml で書くには RollingFileAppender で書けば良い.)

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

namespace TestConsole
{
    public static class CustomLogger
    {
        public static void Setup()
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            // set root logger
            ConsoleAppender consoleAppender = new ConsoleAppender()
            {
                Name = "Console",
                Layout = CreatePatternLayout(),
            };
            consoleAppender.ActivateOptions();
            // ---

            // set error
            var Filter = new log4net.Filter.LevelRangeFilter()
            {
                LevelMin = log4net.Core.Level.Error,
                LevelMax = log4net.Core.Level.Error,
            };
            Filter.ActivateOptions();

            FileAppender fileAppender = new FileAppender()
            {
                Name = "Error",
                File = $"../ErrorLog_{DateTime.Now.ToString("yyyyMMdd")}.txt",
                Layout = CreatePatternLayout(),
                AppendToFile = true,
            };
            fileAppender.AddFilter(Filter);
            fileAppender.ActivateOptions();
            //

            hierarchy.Root.AddAppender(consoleAppender);
            hierarchy.Root.AddAppender(fileAppender);

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

        public static ILog GetLogger()
            => log4net.LogManager.GetLogger("TestConsole");


        private static PatternLayout CreatePatternLayout()
        {
            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
            patternLayout.ActivateOptions();
            return patternLayout;
        }

        // 後から足すよう
        public static void AddAppender(IAppender appender)
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
            var rootLogger = hierarchy.Root;
            rootLogger.AddAppender(appender);
        }

    }
}

使い方

using System;
class Program
{
    static void Main(string[] args)
    {
        // まず始めに loggr を set する
        TestConsole.CustomLogger.Setup();

        // logger instance を取得し
        var logger = TestConsole.CustomLogger.GetLogger();

        // log を吐き出してみる
        logger.Info("info");
        logger.Error("error");
        logger.Info("info");
        logger.Error("error");

        // 入力待機
        Console.ReadLine();
    }
}

最後に?

これを呼び出す感じにすることで, xml からおさらばできる.

ちなみに,ある程度処理して,あぁここからこの deebug log も分たいって時は, Appender 追加すれば良い.
でも,そんなことあるかな?

project Aでは, 普通の log で,
project Bでは, error log はちょっとわけで出したいって時に使うのかな.

TestConsole.CustomLogger.AddAppender()

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0