.Net Core 實踐 - 使用log4net記錄日誌(2)

實現目標:將log4net的相關操做封裝成一個 .Net Standard類庫
demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V2git

Step 1 創建解決方案和處理項目相關配置

在當前解決方案下新建項目,選擇 .Net Standard類庫,命名「MyLogManager」
github

nuget引用log4net,添加log4net.config配置,右鍵點擊log4net.config,選擇「屬性」,修改log4net.config文件屬性
剛添加的log4net.config文件屬性可能以下圖所示(生成操做爲無,不復制到輸出目錄)
優化

須要修改爲以下所示(生成操做 無 改成 內容複製到輸出目錄 - 選擇 若是較新則複製
pwa

從新生成解決方案後,在生成目錄中就能看到log4net.config文件code

Step 2 上代碼

思路:兩個StartLogger方法,在程序啓動時啓動該方法,一個方法本身配置處理,一個走默認
代碼以下orm

public class MyLogManager
    {
        private static ILoggerRepository _loggerRepository;

        /// <summary>
        /// 啓動logger
        /// </summary>
        /// <param name="repository">repository名稱</param>
        /// <param name="fileName">配置文件名稱</param>
        public static void StartLogger(string repository, string fileName)
        {
            _loggerRepository = LogManager.CreateRepository(repository);
            XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo(fileName));
        }

        /// <summary>
        /// 啓動logger
        /// </summary>
        public static void StartLogger()
        {
            _loggerRepository = LogManager.CreateRepository(nameof(MyLogManager));
            XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo("log4net.config"));
        }

        public static ILog GetMyLog<T>(T t)
        {
            return LogManager.GetLogger(_loggerRepository.Name, t.GetType());
        }

        public static ILog GetMyLog(object obj)
        {
            return LogManager.GetLogger(_loggerRepository.Name, obj.GetType());
        }

        public static ILog GetMyLog(Type type)
        {
            return LogManager.GetLogger(_loggerRepository.Name, type);
        }
    }

封裝以後,調用代碼會比初版本的稍微精簡blog

static void TestV1()
        {
            MyLogManager.MyLogManager.StartLogger("DotNetCoreConsole_V2", "log4net.config");

            var log = MyLogManager.MyLogManager.GetMyLog(typeof(Program));

            const int numberOfCycles = 20000;

            var sw = Stopwatch.StartNew();
            for (var i = 0; i < numberOfCycles; i++)
            {
                log.InfoFormat("testNum: {0} ", i);
            }
            sw.Stop();

            Console.WriteLine();
            Console.WriteLine("Ellapsed: {0}, numPerSec: {1}", sw.ElapsedMilliseconds, numberOfCycles / (sw.ElapsedMilliseconds / (double)1000));
            Console.ReadKey();
        }

代碼重構和優化

思考:可不能夠去掉StartLogger這行代碼呢?能夠。
實現以下get

public class NullLogManager
    {
        private static ILoggerRepository _loggerRepository;

        private static ILoggerRepository LoggerRepository
        {
            get
            {
                if (_loggerRepository != null)
                {
                    return _loggerRepository;
                }
                _loggerRepository = LogManager.CreateRepository(nameof(NullLogManager));
                XmlConfigurator.ConfigureAndWatch(_loggerRepository, new FileInfo("log4net.config"));
                return _loggerRepository;
            }
        }

        public static ILog GetMyLog<T>(T t)
        {
            return LogManager.GetLogger(LoggerRepository.Name, t.GetType());
        }

        public static ILog GetMyLog(object obj)
        {
            return LogManager.GetLogger(LoggerRepository.Name, obj.GetType());
        }

        public static ILog GetMyLog(Type type)
        {
            return LogManager.GetLogger(LoggerRepository.Name, type);
        }

        public static ILog GetMyLog()
        {
            return LogManager.GetLogger(LoggerRepository.Name, nameof(GetMyLog));
        }
    }

調用代碼可再次精簡string

static void TestNullLogManager()
        {
            var log = MyLogManager.NullLogManager.GetMyLog(typeof(Program));

            const int numberOfCycles = 20000;

            var sw = Stopwatch.StartNew();
            for (var i = 0; i < numberOfCycles; i++)
            {
                log.InfoFormat("testNum: {0} ", i);
            }
            sw.Stop();

            Console.WriteLine();
            Console.WriteLine("Ellapsed: {0}, numPerSec: {1}", sw.ElapsedMilliseconds, numberOfCycles / (sw.ElapsedMilliseconds / (double)1000));
            Console.ReadKey();
        }
相關文章
相關標籤/搜索