首页 > 其他分享 >通过代码实现log4net自定义配置

通过代码实现log4net自定义配置

时间:2024-12-01 09:02:53浏览次数:10  
标签:log4net 自定义 代码 static ex Key msg Logger public

大家在使用log4net的时候,常规的用法都是在配置文件里面进行设置。但是配置文件里面的配置项非常多,不利于记忆,所以说我们希望他能直接在代码中设置。

于是,我写了个自定义日志配置的方法,核心的配置对象为RollingFileAppender,只需要对他进行设置就可以了。

下面给大家展示下,基于使用场景下的日志服务示例。

public class LogService
    {
        private static readonly ConcurrentDictionary<string, ILog> _loggerContainer = new ConcurrentDictionary<string, ILog>();

        public const string Logger_Key_Default = "default";
        public const string Logger_Key_Crash = "crash";

        static LogService()
        {
            //初始化默认的日志服务
            GetOrAddLogger(Logger_Key_Default, new LoggerConfiguration().SetDefaultValue(Logger_Key_Default));
            GetOrAddLogger(Logger_Key_Crash, new LoggerConfiguration().SetDefaultValue(Logger_Key_Crash));
        }

        /// <summary>
        /// 日志统一处理事件
        /// </summary>
        /// <param name="action"></param>
        protected static void DoLog(Action action)
        {
            SingleThreadPool.Default.Post(() =>
            {
                action();
            });
        }

        private static ILog GetOrAddLogger(string key, LoggerConfiguration loggerConfiguration)
        {
            return _loggerContainer.GetOrAdd(key, new Func<string, ILog>((pKey) =>
            {
                var loggerName = loggerConfiguration.GetFileNameFunc();
                Hierarchy repository = (Hierarchy)LogManager.GetRepository();
                Logger logger = repository.LoggerFactory.CreateLogger(repository, loggerName);
                logger.Hierarchy = repository;
                logger.Parent = repository.Root;
                logger.Level = loggerConfiguration.LogLevel;
                logger.Additivity = false;
                logger.AddAppender(GetFileAppender(loggerConfiguration));
                logger.Repository.Configured = true;
                return new LogImpl(logger);
            }));
        }

        private static ILog GetLoggerFromKey(string key)
        {
            if (_loggerContainer.ContainsKey(key))
            {
                return _loggerContainer[key];
            }
            return default(ILog);
        }

        private static RollingFileAppender GetFileAppender(LoggerConfiguration logConfiguration)
        {
            var appender = new RollingFileAppender
            {
                LockingModel = new FileAppender.MinimalLock(),
                Name = "RollingFileAppender",
                File = logConfiguration.SavePath,
                AppendToFile = true,
                MaxSizeRollBackups = logConfiguration.MaxSizeRollBackUps,
                MaximumFileSize = logConfiguration.MaximumFileSize,
                StaticLogFileName = true,
                RollingStyle = RollingFileAppender.RollingMode.Size,
                DatePattern = logConfiguration.DatePattern
            };
            PatternLayout layout = new PatternLayout(logConfiguration.LayoutPattern);
            appender.Layout = layout;
            layout.ActivateOptions();
            appender.ActivateOptions();
            return appender;
        }

        #region 公开事件

        public static void Warn(object msg, Exception ex = null)
        {
            DoLog(() =>
            {
                GetLoggerFromKey(Logger_Key_Default)?.Warn(msg, ex);
            });
        }

        public static void Info(object msg, Exception ex = null)
        {
            DoLog(() =>
            {
                GetLoggerFromKey(Logger_Key_Default)?.Info(msg, ex);
            });
        }

        public static void Debug(object msg, Exception ex = null)
        {
            DoLog(() =>
            {
                GetLoggerFromKey(Logger_Key_Default)?.Debug(msg, ex);
            });
        }

        public static void Error(object msg, Exception ex = null)
        {
            DoLog(() =>
            {
                GetLoggerFromKey(Logger_Key_Default)?.Error(msg, ex);
            });
        }

        public static void Crash(object msg, Exception ex = null)
        {
            DoLog(() =>
            {
                GetLoggerFromKey(Logger_Key_Crash)?.Error(msg, ex);
            });
        }

        #endregion
    }

    public class LoggerConfiguration
    {
        public LoggerConfiguration SetDefaultValue(string key)
        {
            LayoutPattern = "%date% %message%newline";
            DatePattern = "yyyyMMdd";
            MaxSizeRollBackUps = 20;
            MaximumFileSize = "50MB";
            LogLevel = Level.All;
            GetFileNameFunc = new Func<string>(() =>
             {
                 return $"{key}_{Process.GetCurrentProcess().ProcessName}_{Process.GetCurrentProcess().Id}_{DateTime.Now.ToString("yyyyMMdd")}.log";
             });
            SavePath = $"{CoreValue.Instance.MizPCTempFilePath}/log/{GetFileNameFunc()}";
            return this;
        }

        public string LayoutPattern { get; set; }

        public string DatePattern { get; set; }

        public int MaxSizeRollBackUps { get; set; }

        public string MaximumFileSize { get; set; }

        public Level LogLevel { get; set; }

        public string SavePath { get; set; }

        public Func<string> GetFileNameFunc { get; set; }
    }

这样就可以了。

标签:log4net,自定义,代码,static,ex,Key,msg,Logger,public
From: https://blog.csdn.net/qq_22933729/article/details/144145747

相关文章

  • 11.29《代码大全2》读后有感1
    第一次读《代码大全2》,收获颇丰,仿佛开启了一场编程知识的深度探索之旅。书中从软件构建的各个层面进行了细致剖析,让我意识到编写高质量代码远不止敲出几行语句那么简单。从前期的规划设计,到具体的代码结构搭建,再到后续的调试优化,每一步都有着诸多学问。它强调了代码可读性的重要......
  • 11.30《代码大全2》读后有感2
    对《代码大全2》深入研读的第二阶段,又有了不一样的体会,愈发觉得它是编程领域的“宝藏书籍”。书中提到的软件构建的原则,犹如基石般稳固且重要。它让我明白遵循合理原则去构建代码,软件项目才能站得稳、走得远。比如代码的复用性,不再是简单地重复使用代码片段,而是要有策略地进行规......
  • HAL库软件IIC、硬件IIC移植江科大0.96寸OLED屏幕代码;软件I2C和硬件I2C区别
    程序链接:软件IIC链接:https://pan.baidu.com/s/1PoTuWDgO3i-ELu5gbV_vOA?pwd=feee提取码:feee硬件IIC链接:https://pan.baidu.com/s/12v2VeP7-FPFYyziSGsBwdw?pwd=3nhw提取码:3nhw 1.江科大OLED链接:[模块教程]第1期0.96寸OLED显示屏_哔哩哔哩_bilibili江科大的......
  • Multi-Agent 系统架构设计综述与项目代码实践
    Multi-Agent系统架构设计综述与项目代码实践关键词:Multi-Agent系统、分布式AI、协作智能、系统架构、通信协议、决策机制、项目实践摘要:本文深入探讨了Multi-Agent系统的架构设计原理和实践应用。从背景介绍开始,详细阐述了Multi-Agent系统的核心概念、设计原则和关键......
  • .NET 项目自定义 MSBuild Task
    ......
  • 第十六届蓝桥杯模拟赛(第二期)c++答案与代码
    一、【问题描述】如果一个数p是个质数,同时又是整数a的约数,则p称为a的一个质因数。请问,2024的最大的质因数是多少?答案:23#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);......
  • 【Q1~Q6题解】第七届传智杯全国IT技能大赛-程序设计赛道第一场院校赛(初赛)思路+解题代
    本文为作者的题解解析。Q1~Q6,思路仅供参考文章目录Q1:汤姆和杰瑞解题代码解题思路Q2:游游的重组偶数解题代码解题思路Q3:小红的四子棋解题代码解题思路Q4:小欧的平面连线解题代码解题思路Q5:小红的数组操作解题代码解题思路Q6:游......
  • 代码大全读后感(1)
    第一章欢迎进入软件构建的世界第一章介绍了软件构建。软件构建是指在软件开发过程中,将各种源代码、库文件以及资源文件等整合在一起,生成最终可执行程序的一系列操作和过程。它涵盖了从最初的编码与调试,到编写单元测试确保每个模块的功能正确性,再到整体规划构建流程和各个组件间......
  • vue3实现自定义导航菜单
    一、创建项目    1.打开HBuilderX图1    2.新建一个空项目        文件->新建->项目->uni-app        填写项目名称:vue3demo        选择项目存放目录:D:/HBuilderProjects        一定要注意vue的版本,当前选择的版......
  • easyexcel导出头部样式设置,多个tab导出,头部自定义RGB颜色
    alibabaeasyexcel版本3.0.5,poi版本4.1.2,导出头部样式设置,多个tab导出,头部自定义RGB颜色 效果,头部三行,三个tab  下面贴出代码:packagecom.alpha.erp.dto.accounts;importcom.alibaba.excel.metadata.Head;importcom.alibaba.excel.metadata.data.WriteCellDa......