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/C++中指针和java的引用区别

    C++指针  要区分指针变量和指针变量所指对象. 指针变量先是一个变量,它有自己的地址和存储的内容,所以要想清楚是改变指针变量的值(即地址),还是改变指针变量所指对象的值. #include < ...

  2. mysql5.7基于gtid主从重做

    master上备份mysql/data/Percona-5721/scripts/xtra_sohmysql_fullbak.sh scp 备份文件到备机 关闭slave service mysql ...

  3. [EasyUI]确认删除

    //删除方法 function del() { var obj = getSelected(); if (obj) { $.messager.confirm('确认', '确定要删除:' + obj. ...

  4. C#动态给Word文档填充内容

    //filePath:word文档的路径:strOld:需要替换的内容:strNew:替换的新内容: //注意:strOld中的字符数量要与新的strNew中的一一对应 public static v ...

  5. 转发:VB程序操作word表格(文字、图片)

    很多人都知道,用vb操作excel的表格非常简单,但是偏偏项目中碰到了VB操作word表格的部分,google.baidu搜爆了,都没有找到我需要的东西.到是搜索到了很多问这个问题的记录.没办法,索性 ...

  6. 转:APP开发浅谈-Fiddler抓包详解

    原文地址:http://www.luoxudong.com/?p=306 Fiddler抓包工具在APP开发过程中使用非常频繁,对开发者理解HTTP网络传输原理以及分析定位网络方面的问题非常有帮助.今 ...

  7. postgresql清理工具

    1. 每个DB都单独进行了vacuumdb的命令: vacuumdb -d mydb -z -v 2. full vacuum : vacuumdb -a  -f -z -v  .  自动vacuum ...

  8. django 三种缓存模式的使用及注意点

    Django 缓存模式的使用(主要针对RestFul设计模式的项目) 有三种模式: 全站使用缓存模式(整个项目每个接口都会使用缓存,缺点:所以接口都无法实时性获取数据) 单独视图缓存模式(单个接口使用 ...

  9. js Base64 转化成图片格式

    function dataURLtoFile(dataurl, filename = 'file') { let arr = dataurl.split(',') let mime = arr[0]. ...

  10. docker 搭建 web 服务环境

    docker容器虽然早就听说过,但是本人还真的没去用过,刚好看到相关的文章,就分享了下,有机会可以实践下...... 做过开发的人对开发环境的安装.配置应该都不会太陌生,不管你做什么开发,对开发环境都 ...