private static object m_Lock = new object();

        /// <summary>
        /// 根据类型获取对应的日志操作类
        /// </summary>
        /// <param name="typeName"></param>
        /// <returns></returns>
        public static ILog GetLog(string typeName)
        {
            lock (m_Lock)
            {
                var testRepository = LogManager.GetRepository("MeIsTestRepository");

                var log = LogManager.Exists("MeIsTestRepository", typeName);
                if (log != null)
                {
                    return log;
                }
                CreateXMLLog(testRepository, typeName);
                return LogManager.GetLogger("MeIsTestRepository", typeName);
            }
        }

        /// <summary>
        /// 动态添加日志类型
        /// </summary>
        /// <param name="log"></param>
        /// <param name="typeName"></param>
        private static void CreateXMLLog(log4net.Repository.ILoggerRepository logRepository, string typeName)
        {
            var xmlDoc = new System.Xml.XmlDocument();
            xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null));
            var configuration = xmlDoc.CreateElement("configuration");
            var root = xmlDoc.CreateElement("log4net");

            var appender = xmlDoc.CreateElement("appender");
            appender.SetAttribute("name", typeName + "Appender");
            appender.SetAttribute("type", "log4net.Appender.RollingFileAppender");
            var param = xmlDoc.CreateElement("param");
            param.SetAttribute("name", "Encoding");
            param.SetAttribute("value", "utf-8");
            appender.AppendChild(param);

            var file = xmlDoc.CreateElement("file");
            file.SetAttribute("value", "logfile/");
            appender.AppendChild(file);

            var appendToFile = xmlDoc.CreateElement("appendToFile");
            appendToFile.SetAttribute("value", "true");
            appender.AppendChild(appendToFile);

            var rollingStyle = xmlDoc.CreateElement("rollingStyle");
            rollingStyle.SetAttribute("value", "Composite");
            appender.AppendChild(rollingStyle);

            var staticLogFileName = xmlDoc.CreateElement("staticLogFileName");
            staticLogFileName.SetAttribute("value", "false");
            appender.AppendChild(staticLogFileName);

            var DatePattern = xmlDoc.CreateElement("DatePattern");
            DatePattern.SetAttribute("value", $"'{typeName}'-yyyyMMdd'.log'");
            appender.AppendChild(DatePattern);

            var maxSizeRollBackups = xmlDoc.CreateElement("maxSizeRollBackups");
            maxSizeRollBackups.SetAttribute(");
            appender.AppendChild(maxSizeRollBackups);

            var maximumFileSize = xmlDoc.CreateElement("maximumFileSize");
            maximumFileSize.SetAttribute("value", "1MB");
            appender.AppendChild(maximumFileSize);

            var layout = xmlDoc.CreateElement("layout");
            layout.SetAttribute("type", "log4net.Layout.PatternLayout");

            var conversionPattern = xmlDoc.CreateElement("conversionPattern");
            conversionPattern.SetAttribute("value", "$$%date%message%newline");
            layout.AppendChild(conversionPattern);
            appender.AppendChild(layout);

            var logger = xmlDoc.CreateElement("logger");
            logger.SetAttribute("name", typeName);
            var level = xmlDoc.CreateElement("level");
            level.SetAttribute("value", "DEBUG");
            var appender_ref = xmlDoc.CreateElement("appender-ref");
            appender_ref.SetAttribute("ref", typeName + "Appender");
            logger.AppendChild(level);
            logger.AppendChild(appender_ref);

            root.AppendChild(appender);
            root.AppendChild(logger);

            configuration.AppendChild(root);
            xmlDoc.AppendChild(configuration);

            var array = Encoding.ASCII.GetBytes(xmlDoc.OuterXml);
            var stream = new MemoryStream(array);
            var reader = new StreamReader(stream);
            log4net.Config.XmlConfigurator.Configure(logRepository, reader.BaseStream);

        }

一开始,是想着可以动态将不同的日志写到不同的文件中去,这样方便分类,后面类型太多,不想在log4net.config中一个个添加,所以干脆就动态生成日志配置项好了。

注意,以上方法生成的日志配应该是保存在内存中的,如果停止运行会消失,不会保存到log4net.config文件中。

类似在config文件中的:

    <logger name="TestLog">
      <level value="DEBUG"/>
      <appender-ref ref="TestLogAppender" />
    </logger>
    <appender name="TestLogAppender" type="log4net.Appender.RollingFileAppender">
      <file value="logfile/" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <staticLogFileName value="false" />
      <datePattern value="'TestLog'-yyyyMMdd'.log'" />
      <maxSizeRollBackups value=" />
      <maximumFileSize value="1MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message%newline" />
      </layout>
    </appender>

net core 版本2.0/2.1都测试过了。

log4net版本2.0.8

测试代码太简单就不放了。

net core中动态给log4net添加日志类型的更多相关文章

  1. Log4net 根据日志类型输出日志

    第一步:引入Log4net.dll 文件的引用 第二步:添加LogHelper类,代码如下 using System; using System.Collections.Generic; using ...

  2. log4net 添加日志

    1.  在config里配置一下 <configSections>    <section name="log4net" type="System.Co ...

  3. log4net根据日志类型写入到不同的文件中

    <?xml version="1.0"?> <configuration> <configSections> <!--log4net配置安 ...

  4. 在drupal7中动态的为某个内容类型添加字段

    $myField_name = "my_new_field_name"; if(!field_info_field($myField_name)) // check if the ...

  5. Log4Net不同日志类型写入到不同文件

    1. 一直在用log4net,从来没有自己整理过.实践出真知,只有自己整理过才能真正掌握. 2. log4net,应该读logfornet,以前一直说log4,log4............ 安装 ...

  6. 玩转ASP.NET Core中的日志组件

    简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...

  7. .NET Core中使用Razor模板引擎

    一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...

  8. ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储

    ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...

  9. HttpClient在.NET Core中的正确打开方式

    问题来源 长期以来,.NET开发者都通过下面的方式发送http请求: using (var httpClient = new HttpClient()) { var response = await ...

随机推荐

  1. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  2. Win8 传统桌面下无法上网的解决方法

    Win8 很酷,就连出现的问题也都酷得不行~ 之前遇到的一些问题与解决方法,避免重新安装 1. Word 2013下, 输入法突然秀逗, 经常按了一个键后, 死循环输入该字符直到死机 解决方法: 进入 ...

  3. requirejs的使用

    requirejs的优点: 1.防止在js的加载过程中,阻止页面的渲染: 2.可以引入多个js文件: 3.可以写出重复使用的js模块: 4.有效的防止命名的冲突,通过将变量分装在模块中的方式实现: r ...

  4. 更改XAMPP中MySQL数据库的端口号

    更改XAMPP中MySQL数据库的端口号 如果电脑上已安装MySql数据库,还想用XAMPP中自带的数据库就需要更改XAMPP中数据库的端口号,避免和已安装的数据库冲突.本例以更改为3307端口号为例 ...

  5. 提高性能:用RequireJS优化Wijmo Web页面

    上周Wijmo 2014 V2版本刚刚发布(下载地址),  有网友下载后发现仅仅使用了40个Widgets的一小部分,还需要加载全部的jquery.wijmo-pro.all.3.20142.45.m ...

  6. Leetcode 155 Min Stack 小顶堆+栈,优先队列实现 难度:0

    https://leetcode.com/problems/min-stack/ #include <vector> #include <queue> #include < ...

  7. HDU 2819 — Swap 二分匹配

    Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 你为什么学MSP430

    很清楚,很明白,目的性极强,你学这个,是为了竞赛,学51也是,学习FPGA也是,你压根打心眼里就没打算走硬件方向,原因不多说,尽管你还是喜欢硬件的,但是,现实是,一个人的精力是有限的,你啊,好好弄好你 ...

  9. NGINX当中的SSL配置(PEM启动密码免输入)

    干过的都懂,这个东东好像很碍事. 很影响RELOAD的效率...并且,,,好像这个弄了之后,NGINX作RELOAD之后,可以即时更新配置了..(还是说那个DVROOT.CER影响的??未考证) ht ...

  10. Pandas(python)数据处理:只对某一列DataFrame数据进行归一化

    处理数据要用到Pandas,但是没有学过,不知道是否有直接对某一列归一化的方法调用.自己倒弄了下.感觉还是比较麻烦. 使用Pandas读取到数组之后想把其中的'MonthlyIncome'一列进行归一 ...