private static object m_Lock = new object();

        /// <summary>
/// 根据类型获取对应的日志操作类
/// </summary>
/// <param name="typeName"></param>
/// <returns></returns>
public static ILog GetLog(string typeName)
{
lock (m_Lock)
{
          //这里在初始化时要先创建Repository,如:LogManager.CreateRepository("MeIsTestRepository");//创建之后才能在这里获取到
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", $"yyyy/yyyy-MM/{typeName}-yyyy-MM-dd.TXT");
appender.AppendChild(DatePattern); var maxSizeRollBackups = xmlDoc.CreateElement("maxSizeRollBackups");
maxSizeRollBackups.SetAttribute("value", "");
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="yyyy/yyyy-MM/TestLog-yyyy-MM-dd.TXT" /> <maxSizeRollBackups value="" /> <maximumFileSize value="1MB" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message%newline" /> </layout> </appender>

net core 版本2.0/2.1都测试过了。   net framework 4.6也测过可以了。

log4net版本2.0.8

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

可能存在的问题:

生成的日志文件数量超过maxSizeRollBackups设定的值(现在是10)后,会将之前的日志内容替换掉。

所以如果实在是要记录多数据的,可以把这个值调大点,比如10000什么的……

另外,datePattern的值“yyyy/yyyy-MM/TestLog-yyyy-MM-dd.TXT",是将文件按分年文件夹,底下再分年-月文件夹,然后才是普通的日志文件。

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

  1. 一行代码在 .NET Core 中快速使用 log4net

    原文:一行代码在 .NET Core 中快速使用 log4net 1. .NET Core 控制台程序中使用 第一步:添加引用 Install-Package log4net 第二步:将附件 LogH ...

  2. .net core中的那些常用的日志框架(NLog篇)

    前言 咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog). NLog简介 NLog是适用于各种.NET平台(包括.N ...

  3. .net core中的那些常用的日志框架(Serilog篇)

    前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...

  4. .net core中的那些常用的日志框架(Logging篇)

    前言 日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢! As ...

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

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

  6. log4net 添加日志

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

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

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

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

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

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

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

随机推荐

  1. Struts S2-048 RCE漏洞分析

    应该是S2-048目前最详细的一篇了.. 漏洞影响 Struts 2.3.x系列中的Showcase应用 使用了struts1 插件,并在使用ActionMessages时将客户端可控的参数拼接传递给 ...

  2. CVTE前端一面

    1.如果不设置cookie失效时间:  关闭浏览器自动关闭. 有没有手写过cookie HttpOnly 2.跨域的几种方式 如何实现cors 2.web安全: xss,csrf    如何防范 3. ...

  3. Flex 布局的教程

    前言:以前也经常用flex布局,但是最近看到别人使用的时候,发觉以前自己还是不够理解这个,重新看了一遍http://www.ruanyifeng.com/blog/2015/07/flex-gramm ...

  4. sql_demo

    SELECT M.INSTNCODE, M.METHODCODE, M.CCYPAIRCODE, M.DIR, M.PRD, M.EXCHANGERATE, M.NEARRSKAMOUNT, M.TR ...

  5. LeetCode100.相同的树

    给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1 ...

  6. leetcode每日刷题计划-简单篇day4

    腰酸腿疼肝数模 被教育说代码风格像是小学生而且有点冗余 QAQ之前面试官好像也说过orz努力改努力改 今天把前两天跳过的vector给简单看了一下补上了 Num 14 最长公共前缀 Longest C ...

  7. 转载:深入浅出Zookeeper

    ZAB协议 ZAB协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要是根据ZAB协议是实现分布式系统数据一致性. zookeeper根据ZAB协议建立了主备模型完成zook ...

  8. abc

    无类型: 汇编弱类型.静态类型 : C/C++弱类型.动态类型检查: Perl/PHP强类型.静态类型检查 :Java/C#强类型.动态类型检查 :Python, Scheme静态显式类型 :Java ...

  9. 关于java使用POI导出ppt ,其中表格setText 失败问题

    1.导出ppt 必要的包 使用maven <dependency> <groupId>org.apache.poi</groupId> <artifactId ...

  10. Shell 批量修改主机 用户密码

    问题:132.121.114 和 132.121.118 网段共 48 台主机未添加基础监控,但是 wh 账户不能登录 需进行批量修改密码操作. 目前情况:op1对上述48台机器设备均能免密登录. 操 ...