Log4Net + Log4Mongo 将日志记录到MongoDb中
实现:
- 将日志保存在MongoDb中;
- 自定义日志字段;
- 日志按照日期拆分集合;
第一部分:将日志保存在MongoDb中
新建控制台程序Log4MongoDemo
通过NuGet安装Log4Net (v2.0.8)、log4mongo-net(v2.2.0)
项目根目录下添加log4net.config配置文件
<?xml version="1.0"?>
<configuration>
<!--声明一个名为“log4net”的自定义配置节-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<!--log4net配置信息-->
<log4net>
<logger name="MongoDBLogger">
<level value="ALL"/>
<appender-ref ref="MongoDBAppender" />
</logger>
<appender name="MongoDBAppender" type="Log4Mongo.MongoDBAppender, Log4Mongo">
<connectionString value="mongodb://(登录名):(密码)@(服务器地址)/app" />
<CollectionName value="logs"/>
</appender>
</log4net>
</configuration>
日志记录方法
public class LogHelper
{
private static readonly ILog log = LogManager.GetLogger("MongoDBLogger");
/// <summary>
/// 记录一般日志
/// </summary>
public static void LogInfo(AppOpLog opLog)
{
if (log.IsInfoEnabled)
{
log.Info(opLog);
}
}
}
记录日志
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure(
new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "\\log4net.config")
);
LogHelper.LogInfo(null);
Console.ReadKey();
}
查看结果

第二部分:自定义日志字段
从github上下载【log4mongo-net】源码进行修改,日志中记录的字段定义在BackwardCompatibility.cs下BuildBsonDocument方法和BuildExceptionBsonDocument方法中,只需要修改这两个方法就可以按照根据自己的需求记录日志内容
将自定义的日志内容通过 log.Info(object) 传递
在BuildBsonDocument方法中通过LoggingEvent的MessageObject属性来获取自定义的日志内容
public class BackwardCompatibility
{
public static BsonDocument BuildBsonDocument(LoggingEvent loggingEvent)
{
if(loggingEvent == null)
{
return null;
} BsonDocument bs = loggingEvent.MessageObject.ToBsonDocument();
var toReturn = bs;
toReturn.Add("TimeStamp", loggingEvent.TimeStamp);
toReturn.Add("ThreadId", loggingEvent.ThreadName); if(loggingEvent.ExceptionObject != null)
{
toReturn.Add("Exception", BuildExceptionBsonDocument(loggingEvent.ExceptionObject));
} PropertiesDictionary compositeProperties = loggingEvent.GetProperties();
if(compositeProperties != null && compositeProperties.Count > 0)
{
var properties = new BsonDocument();
foreach(DictionaryEntry entry in compositeProperties)
{
properties.Add(entry.Key.ToString(), entry.Value.ToString());
} toReturn.Add("Properties", properties);
} return toReturn;
} private static BsonDocument BuildExceptionBsonDocument(Exception ex)
{
var toReturn = new BsonDocument {
{"Message", ex.Message},
{"Source", ex.Source},
{"StackTrace", ex.StackTrace}
}; if(ex.InnerException != null)
{
toReturn.Add("InnerException", BuildExceptionBsonDocument(ex.InnerException));
} return toReturn;
}
}
日志记录:LogHelper.LogInfo(object),object为自定义类型
第三部分:日志按照日期拆分集合
因为MongoDb不需要预先定义集合结构,所以我们只需要根据自己的需求修改集合的生成规则就可以拆分日志到不同的集合中,这里实现将日志按天拆分。
- 在log4net.config配置文件中将CollectionName的value修改为“yyyyMMdd”
- 修改MongoDBAppender.cs下的GetCollection()方法:
private IMongoCollection<BsonDocument> GetCollection()
{
var db = GetDatabase();
var collectionName = CollectionName ?? "logs";
if (collectionName == "yyyyMMdd")
{
collectionName = $"Log{DateTime.Now.ToString("yyyyMMdd")}" ;
}
EnsureCollectionExists(db, collectionName);
var collection = db.GetCollection<BsonDocument>(collectionName);
return collection;
}
完整代码地址:https://github.com/zhrong92/Log4NetDemo
参考文章:https://www.cnblogs.com/zeallag/p/5205571.html
Log4Net + Log4Mongo 将日志记录到MongoDb中的更多相关文章
- 也用 Log4Net 之将自定义属性记录到文件中 (三)
也用 Log4Net 之将自定义属性记录到文件中 (三) 即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑 ...
- 也用 Log4Net 之将日志记录到数据库的后台实现 (二)
也用 Log4Net 之将日志记录到数据库的后台实现 (二) 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之 ...
- 也用 Log4Net 之将日志记录到数据库的配置 (一)
也用 Log4Net 之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需 ...
- Log4Net 之将自定义属性记录到文件中 (三)
原文:Log4Net 之将自定义属性记录到文件中 (三) 即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑到了 ...
- Log4Net 之将日志记录到数据库的后台实现 (二)
原文:Log4Net 之将日志记录到数据库的后台实现 (二) 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之前 ...
- Log4Net 之将日志记录到数据库的配置 (一)
原文:Log4Net 之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要 ...
- asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...
- 使用log4net无法将日志记录插入mysql数据库解决办法
写在前面 今天没事研究了下,将日志文件写入mysql数据库,因为新公司用的数据库也是mysql,项目中需要将日志信息写入数据库,没办法,就研究了下.在使用过程中遇到一个很蛋疼的问题.最后解决了,郁闷了 ...
- 通过代码配置 Log4net来实现日志记录
通过代码来创建配置文件,优点看起来更为简洁,不过还得看需求吧,之前我博客也写了一篇通过读取不同的配置文件还实现配置不同日志类型. //记录异常日志数据库连接字符串 private const stri ...
随机推荐
- mysql8的深坑
主要记录下自己的出坑过程,有些其实并不是mysql8的问题,但是由于这个版本产生的阻塞时间最长,所以一并记录: 1-项目代码别人能运行,我本地运行不了 定位后发现是由于本地代码运行数据库连接失败,后来 ...
- 强大的输入框-应用快速启动uTools
uTools uTools是一个 极简.插件化.跨平台 的现代桌面软件.通过自由选配丰富的插件,打造你得心应手的工具集合. 当你熟悉它后,能够为你节约大量时间,让你可以更加专注地改变世界. uTool ...
- U盘数据泄露,用不到30行的Python代码就能盗走
今天跟大家分享下一段简单的代码,希望能给经常用U盘的人警戒,提高信息安全意识. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...
- Spring Cloud 系列之 ZooKeeper 注册中心
什么是注册中心 服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串.路由信息等.服务注册中心是微服务架构中最基础的设施之一. 注册中心可以说 ...
- Prometheus监控神器-Alertmanager篇(1)
本章节主要涵盖了Alertmanager的工作机制与配置文件的比较详细的知识内容,由浅入深的给大家讲解. 警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.警 ...
- URL中加号(+)转义问题
URL中加号(+)转义问题 前端通过URL传入一个参数,在后台日志中发现参数中的加号变成了空格. 前端传入a+b 后台日志a b 可以看到,+ 变成了空格. 先说结论 HTTP为了避免歧义,一些字符传 ...
- go微服务系列(一) go micro入门
1. 什么是go micro 1.1 go micro作用 1.2 go micro架构组成 2. go micro入门 3. 结合consul进行服务注册/发现 3.1 consul的安装 3.2 ...
- C#LeetCode刷题-堆
堆篇 # 题名 刷题 通过率 难度 23 合并K个排序链表 39.4% 困难 215 数组中的第K个最大元素 51.5% 中等 218 天际线问题 32.9% 困难 239 滑动窗口最大值 ...
- Go 编译器内部知识:向 Go 添加新语句-第 2 部分
这是探讨 Go 编译器两篇文章的最后一篇.在第 1 部分中,我们通过构建自定义的编译器,向 Go 语言添加了一条新语句.为此,我们按照此图介绍了编译器的前五个阶段: 在"rewrite AS ...
- 基于vue的实时视频流开发
背景:多个实时视频的介入 技术:hls.js的流媒体,支持格式已m3u8为主 解决了什么:多个实时视频长时间播放会有卡顿的情况 具体代码实现: import Hls from 'hls.js' pla ...