net core中动态给log4net添加日志类型
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添加日志类型的更多相关文章
- 一行代码在 .NET Core 中快速使用 log4net
原文:一行代码在 .NET Core 中快速使用 log4net 1. .NET Core 控制台程序中使用 第一步:添加引用 Install-Package log4net 第二步:将附件 LogH ...
- .net core中的那些常用的日志框架(NLog篇)
前言 咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog). NLog简介 NLog是适用于各种.NET平台(包括.N ...
- .net core中的那些常用的日志框架(Serilog篇)
前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...
- .net core中的那些常用的日志框架(Logging篇)
前言 日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢! As ...
- Log4net 根据日志类型输出日志
第一步:引入Log4net.dll 文件的引用 第二步:添加LogHelper类,代码如下 using System; using System.Collections.Generic; using ...
- log4net 添加日志
1. 在config里配置一下 <configSections> <section name="log4net" type="System.Co ...
- log4net根据日志类型写入到不同的文件中
<?xml version="1.0"?> <configuration> <configSections> <!--log4net配置安 ...
- 在drupal7中动态的为某个内容类型添加字段
$myField_name = "my_new_field_name"; if(!field_info_field($myField_name)) // check if the ...
- Log4Net不同日志类型写入到不同文件
1. 一直在用log4net,从来没有自己整理过.实践出真知,只有自己整理过才能真正掌握. 2. log4net,应该读logfornet,以前一直说log4,log4............ 安装 ...
随机推荐
- 3、redis使用场景
现代高并发复杂系统面临的挑战 现代系统随着功能的复杂化,各种各样需求层出不穷,面对愈加复杂话的业务系统.越来越庞大的用户群体,以及用户对体验的要求越来越高,性能就变得更加重要. 抛开代码逻辑.服务器性 ...
- 游戏AI
玩游戏太累了,我或许可以写一个机器人帮我玩游戏发QQ发空间啥的
- day1.接口测试(概念、Postman、SoapUI、jmeter)
一.什么是接口测试 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑 ...
- 在chrome console中添加jQuery
由于现有seajs等封装,jQuery等已不在全局暴露,即使网站中已使用jQuery,在console也使用不了. 在chrome中可以用以下代码加入jQuery: fetch('http://cod ...
- POJ2159 Ancient Cipher
POJ2159 Ancient Cipher Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 38430 Accepted ...
- hashcode()和equals()
一.equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实 ...
- dva中roadhog版本升级后带来的问题及解决方法
从同事手中接手项目之后.npm install 然后npm start的时候.开始报上图的错误.解决方法一(比较 愚蠢)当时找到的解决方法都没有用.然后只能按照报错的路径,从同事那边复制了node_m ...
- MongoDB(1)--MongoDB安装及简介
一.MongoDB的应用场景及实现原理二.MongoDB的常用命令及配置三.手写基于MongoDB的ORM框架四.基于MongoDB实现网络云盘实战五.MongoDB 4.0新特性 一.MongoDB ...
- pyqt5 -——菜单和工具栏
一. 状态栏 # -*- coding: utf-8 -*-# @Time : 2018/12/22 12:37# @Author : Bo# @Email : mat_wu@163.com# @Fi ...
- pyqt5 -——基本功能(HelloWorld)
一. 简单窗口 这个简单的小例子展示的是一个小窗口.但是我们可以在这个小窗口上面做很多事情,改变大小,最大化,最小化等,这需要很多代码才能实现.这在很多应用中很常见,没必要每次都要重写这部分代码,Qt ...