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. c#判断字符串是否为空或null

    通常有: string str=""; .if(str=="") .if(str==String.Empty) .) 三种方法的效果一样,都可以判断字符串是否为 ...

  2. 团队第九次 # scrum meeting

    github 本此会议项目由PM召开,召开时间为4-14日晚上9点,以大家在群里讨论为主 召开时长10分钟 任务表格 袁勤 负责协调前后端 https://github.com/buaa-2016/p ...

  3. setsockopt详解

    Socket描述符选项[SOL_SOCKET] #include <sys/socket.h>  int setsockopt( int socket, int level, int op ...

  4. django之forms组件

    在django中forms组件有其强大的功能,里面集合和众多的函数和方法:下面来看一下它的源码 """ Form classes """ f ...

  5. Android 开发 上拉加载更多功能实现

    实现思维 开始之前先废话几句,Android系统没有提供上拉加载的控件,只提供了下拉刷新的SwipeRefreshLayout控件.这个控件我们就不废话,无法实现上拉刷新的功能.现在我们说说上拉加载更 ...

  6. 转载:Java Lock机制解读

    Java Lock机制解读 欢迎转载: https://blog.csdn.net/chengyuqiang/article/details/79181229 1.synchronized synch ...

  7. IntelliJ IDEA 工程Java文件上红色的无效符

    IntelliJ IDEA 工程Java文件上红色的无效符(红色表示该类是不可编译文件) 1.查看Java.resources文件夹 如图所示,是因为没有配置 2.在Java文件夹点击右键找到Mark ...

  8. 使用samba 共享Linux文件到Windows

    1.使用yum命令安装了samba服务 #yum install samba 2.配置/etc/samba/smb.conf文件,在最后一行添加下面一段配置: #vi /etc/samba/smb.c ...

  9. 如何系统的学习Java

    初学者记住一点,学习Java一定是连续性的且循序渐进的“系统化”学习,首先我给你提供一个优秀Java工程师的学习路线. web前端方面:html.css,Java.jQuery.xml解析.Boots ...

  10. 程序员常用字体(vs2008字体修改方案)

    字体不仅是设计师手中重要的武器,对我们开发人员来说,字体的选择也有许多讲究,一个好的.适合展示代码的字体,应该具备以下要素: 等宽的字符 简洁.清晰并且规范的字符形状 支持ASCII码为128以上的扩 ...