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. CentOS 6.5 升级 PHP 到5.6

    1. 首先先看下已安装的版本: yum list installed | grep php 可以看到我的都是5.3的 php.x86_64 -.el6_8 @updates php-cli.x86_6 ...

  2. .NET Core与.NET Framework、Mono之间的关系

    随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...

  3. Git使用指南(2)——工作区,暂存区,版本库

    1 工作区修改添加到暂存区 git add 2 暂存区提交到版本库 git commit 3 版本库更新到暂存区 git reset HEAD 4 删除暂存区文件 git rm --cached< ...

  4. java.lang.StringBuilder

    1.StringBuilder 的对象和 String 的对象类似,并且 StringBuilder 的对象能被修改.Internally,这个对象被当做一个包含一系列字符的可变长度的数组对待.这个序 ...

  5. Python(正则 Time datatime os sys random json pickle模块)

    正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...

  6. Myeclipse如何整合tomcat

    .在本机上安装MyEclipse和Tomcat 5软件程序 2.运行MyEclipse,设置与Tomcat 5服务器的连接,如下图所示: 选择Window--->Preferences,点击进入 ...

  7. [MethodImpl(MethodImplOptions.Synchronized)]

    在NopCommerce项目的Nop.Core类库中有一个EngineContext类中有一个Initialize方法用到了[MethodImpl(MethodImplOptions.Synchron ...

  8. [INet] I/O模型:同步阻塞,同步非阻塞,异步非阻塞

    POSIX 把这同步.异步两个术语定义 如下: 同步 I/O 操作( synchronous I/O opetation) 导致请求进程阻塞, 直到 I/O 操作完成: 异步 I/O 操作( asyn ...

  9. 009_python魔法函数

    11. (译)Python魔法方法指南 原文: http://www.rafekettler.com/magicmethods.html 原作者: Rafe Kettler 翻译: hit9 原版(英 ...

  10. 自定义Tornado的session组件

    session和cookie的关系 cookie:保存在客户端浏览器上的键值对 session_id = "eyJ1c2VyX2luZm8iOiJ" session:保存在服务器上 ...