实现:

  1. 将日志保存在MongoDb中;
  2. 自定义日志字段;
  3. 日志按照日期拆分集合;

第一部分:将日志保存在MongoDb中

  1. 新建控制台程序Log4MongoDemo

  2. 通过NuGet安装Log4Net (v2.0.8)、log4mongo-net(v2.2.0)

  3. 项目根目录下添加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>
  4. 日志记录方法

    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);
    }
    }
    }
  5. 记录日志

    static void Main(string[] args)
    {
    log4net.Config.XmlConfigurator.Configure(
    new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "\\log4net.config")
    );
    LogHelper.LogInfo(null);
    Console.ReadKey();
    }
  6. 查看结果

第二部分:自定义日志字段

从github上下载【log4mongo-net】源码进行修改,日志中记录的字段定义在BackwardCompatibility.cs下BuildBsonDocument方法和BuildExceptionBsonDocument方法中,只需要修改这两个方法就可以按照根据自己的需求记录日志内容

  1. 将自定义的日志内容通过 log.Info(object) 传递

  2. 在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;
    }
    }
  3. 日志记录:LogHelper.LogInfo(object),object为自定义类型

第三部分:日志按照日期拆分集合

因为MongoDb不需要预先定义集合结构,所以我们只需要根据自己的需求修改集合的生成规则就可以拆分日志到不同的集合中,这里实现将日志按天拆分。

  1. 在log4net.config配置文件中将CollectionName的value修改为“yyyyMMdd”
  2. 修改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中的更多相关文章

  1. 也用 Log4Net 之将自定义属性记录到文件中 (三)

    也用 Log4Net  之将自定义属性记录到文件中 (三)  即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑 ...

  2. 也用 Log4Net 之将日志记录到数据库的后台实现 (二)

    也用 Log4Net 之将日志记录到数据库的后台实现 (二)  大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之 ...

  3. 也用 Log4Net 之将日志记录到数据库的配置 (一)

    也用 Log4Net  之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需 ...

  4. Log4Net 之将自定义属性记录到文件中 (三)

    原文:Log4Net 之将自定义属性记录到文件中 (三) 即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑到了 ...

  5. Log4Net 之将日志记录到数据库的后台实现 (二)

    原文:Log4Net 之将日志记录到数据库的后台实现 (二) 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之前 ...

  6. Log4Net 之将日志记录到数据库的配置 (一)

    原文:Log4Net 之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要 ...

  7. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  8. 使用log4net无法将日志记录插入mysql数据库解决办法

    写在前面 今天没事研究了下,将日志文件写入mysql数据库,因为新公司用的数据库也是mysql,项目中需要将日志信息写入数据库,没办法,就研究了下.在使用过程中遇到一个很蛋疼的问题.最后解决了,郁闷了 ...

  9. 通过代码配置 Log4net来实现日志记录

    通过代码来创建配置文件,优点看起来更为简洁,不过还得看需求吧,之前我博客也写了一篇通过读取不同的配置文件还实现配置不同日志类型. //记录异常日志数据库连接字符串 private const stri ...

随机推荐

  1. 一些html基础概念

    不做前端好多年,之所以突然写这个,是因为最近在做一个监控平台,需要一点web前端开发,想着顺便做了,但是由于长时间没接触前端导致一些基础知识的遗忘,所以在此记录下备忘,没有啥高深的东西,完全是为了对抗 ...

  2. [转]Nginx介绍-反向代理、负载均衡

    原文:https://www.cnblogs.com/wcwnina/p/8728391.html 作者:失恋的蔷薇 1. Nginx的产生 没有听过Nginx?那么一定听过它的"同行&qu ...

  3. Spring纯注解配置

    待改造的问题 我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置: <!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器 ...

  4. Python初学者的自我修养,找到自己的方向

    今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...

  5. angular.js 本地数据存储LocalStorage

    定义工厂模式 factory  本地存储数据服务 app.factory('locals', ['$window', function ($window) { return { //存储单个属性 se ...

  6. 面向对象的js编程 Call和apply方法

    JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.arg ...

  7. 2020-05-29:redis怎么保证高可用,高可用模式有那些?对比下优缺点?

    福哥答案2020-05-29: Redis 高可用架构如下:1.Redis Sentinel 集群 + 内网 DNS + 自定义脚本.2.Redis Sentinel 集群 + VIP + 自定义脚本 ...

  8. C#LeetCode刷题之#225-用队列实现栈(Implement Stack using Queues)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4106 访问. 使用队列实现栈的下列操作: push(x) -- ...

  9. 解Bug之路-dubbo流量上线时的非平滑问题

    前言 笔者最近解决了一个困扰了业务系统很久的问题.这个问题只在发布时出现,每次只影响一两次调用,相较于其它的问题来说,这个问题有点不够受重视.由于种种原因,使得这个问题到了业务必须解决的程度,于是就到 ...

  10. ECharts 常见的问题总结

    以前也用过ECharts(不得不说,这真的是百度的良心产品),但是都是一些简单的示例.这次因为工作的需要,做了很多表格,对ECharts有了更加深刻的理解,现在来总结一下. 第一个肯定是新手经常遇到的 ...