前言:

前两天在查找如何扩展log4net的日志格式时找到一个开源项目Log4net.NoSql,它通过扩展Appender实现了把日志输出到ElasticSearch里面。顺藤摸瓜,发现涉及的项目还挺多,于是打算学习一下,记录在此。

项目一句话简介,详情点击链接去项目主页查看,最后提供打包下载

1.log4net.nosql

A collection of log4net Appenders to NoSQL data stores. Currently only ElasticSearch is supported.

Uses RESTSharp to communicate with the ElasticSearch REST Api and contains a custom Layout, which makes use of the RESTSharp JSON Serializer to convert the LoggingEvent into JSON.

2.RestSharp

Simple REST and HTTP API Client for .NET

3.Curl

curl是利用URL语法在命令行方式下工作的开源文件传输工具。

4.elasticsearch

Elasticsearch is a distributed RESTful search engine built for the cloud.

5.elasticsearch-head 

A web front end for an Elasticsearch cluster

部署说明:

我这里是把es和log4net分开部署到两台机器的,因为es需要jdk,我不想在开发机上安装,所以把es装到xp的虚拟机上了。log4net.nosql是扩展了log4net的Layout实现了json格式的日志输出,然后扩展了Appender通过调用RestSharp把数据发送给es。Log4net的配置文件如下:

  <appender name="Elastic1" type="log4net.NoSql.Appender.ElasticSearchAppender, log4net.NoSql">
<Host value="192.168.66.90" />
<Port value="9200" />
<Index value="logs" />
<DocumentType value="apps" />
<layout type="log4net.NoSql.Layout.JsonLayout,log4net.NoSql" />
</appender>

在插入日志之前,需要先在es里建立索引,nosql提供了一个脚步log4net.NoSql-master\scripts\create_indices.bat:

curl -XDELETE localhost:9200/logs
echo "" curl -XPOST localhost:9200/logs -d '{
"_all" : {"enabled" : true},
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"apps":{
"_timestamp" : {
"enabled" : true,
"store" : true
},
"_ttl" : {
"enabled" : true,
"store" : true,
"default" : "5000"
}
}
}
}'

可惜存在几个问题:

1.window下默认没有curl运行环境

解决方法:下载一个curl-7.17.0-win32-nossl文件,把curl.exe放到script目录下

2.命令行下切换目录到script目录,运行create_indices.bat报错。

解决方法:通过错误信息可以看到把每一行的开头字符当做命令了,所以改成curl -XPOST localhost:9200/logs -d '{后面的换行去掉}'

3.再次运行还是报错,大致意思就是 ''' 不能解析。

解决方法:把-d后面和最后的单引号改成双引号。

下面是整理后的部署步骤:

1.xp,安装jdk配置JAVA_HOME环境变量

2.xp,运行两个es实例,然后运行es-head,如下图:

es路径:..\elasticsearch-1.1.1\bin\elasticsearch.bat

head路径:..\elasticsearch-head-master\index.html

3.win7,把下载的curl.exe放到NoSql下的Script目录下,修改bat文件把localhost 改成es服务器的ip地址192.168.66.90,然后运行。这样就在ES里建立了一个logs索引,如下图:

4.使用vs打开Log4net.NoSql解决方案。修改log4net.NoSql.TestHarness.log4net.config文件里的host地址为192.168.66.90.运行写入日志到es,如下图:

在这里遇到两个问题:

a.我两台机器都设置了代理,默认情况下我是访问不到192.168.66.90机器,所以去ES里查询不到日志记录。如何调试查看写入是否成功呢?

修改\log4net.NoSql-master\log4net.NoSql\Util\ElasticSearchClient.cs 38行,把返回值输出:

   //dont care about response as if it fails should not throw any exceptions
_restClient.ExecuteAsync(request, response =>
{
Debug.WriteLine(response.ToString());
});

b.写入日志成功后ES里还是查询不到数据。

在新建logs索引时指定了超时时间为5秒,所以电脑一卡5秒过去了,去es里就查询不到数据了。

结束语:

前几天在园子里看了 黑客马拉松,里面的一句话“软件开发听上去高大上,但实际很简单,全部活动可以分为两类:造轮子,搭积木。”感觉很精辟,所以才开始了这次的搭积木过程。每个项目都是了解皮毛,以后会抽时间仔细研究研究源码。这么简单的组合一下就可以解决项目中分布式日志记录和查询的需求,事半功倍。ES是基于luceuce的搜索引擎,加上分词插件,还有更多的应用场景可以去使用。

参考链接:

1.curl 命令使用http://www.cnblogs.com/wangkangluo1/archive/2012/04/17/2453975.html

2.ElasticSearch 初次使用小结,一起学习进步哈~http://ruby-china.org/topics/15337

3.ElasticSearch入门笔记http://www.qwolf.com/?p=1387

4. 分布式搜索elasticsearch集群管理工具headhttp://blog.csdn.net/laigood/article/details/8193758

5.使用RestSharp 库消费Restful Servicehttp://www.cnblogs.com/shanyou/archive/2012/01/27/RestSharp.html

log4net.NoSql +ElasticSearch 实现日志记录的更多相关文章

  1. .Net Core 实践 - 使用log4net记录日志(3)— log4net向ElasticSearch写日志

    demo地址:https://github.com/PuzzledAlien/log4net_demo/tree/master/DotNetCoreConsole_V3 Windows 10 安装部署 ...

  2. 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

    http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...

  3. .Net Log4Net配置多文件日志记录

    其他配置详情在网上都可以找到,但是很多看着都晕,本人就记录一下如何使用: 1.按不同级别(官方说明)可记录的日志级别有: Info.Warn.Error.Debug 2.可以按着四个配置四个输出日志路 ...

  4. .Net Core(.NET6)中接入Log4net和NLog进行日志记录

    一.接入Log4net 1.按日期和大小混合分割日志 nuget包安装 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore 配置文件 配置文 ...

  5. ASP.NET Core 异常处理与日志记录

    1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...

  6. Serilog 是 ASP.NET Core 的一个插件,可以简化日志记录

    [翻译] ASP.NET Core 利用 Docker.ElasticSearch.Kibana 来记录日志 原文: Logging with ElasticSearch, Kibana, ASP.N ...

  7. Log4Net异常日志记录在asp.net mvc3.0的应用

    前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...

  8. 日志记录类库log4net的使用总结

    log4net是一个开源的日志记录类库,经过配置后可以自动抓取程序中的错误.异常信息,并写入磁盘,也可以在异常发生时执行其他指定的操作,比如:通知某人右键.写入数据库等.这里写个ASP.NET MVC ...

  9. log4net日志记录

    这里是接着上一篇来优化的,上篇:ASP.NET MVC中错误日志信息记录 log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件,数据库,EventLog等),日志就是程序的黑 ...

随机推荐

  1. 【转】ACM/ICPC生涯总结暨退役宣言—alpc55

    转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写 ...

  2. WinForm中跨线程操作控件

    在WinForm编程时会遇到通过后台线程操作界面的情况,直接在后台线程执行的方法中直接操作控件会报错,这时候就要使用跨线程方式间接操作控件.下面是两种实现方式.   1.采用定义delegate的方式 ...

  3. Repeater嵌套绑定Repeater

    前台Html代码 <asp:Repeater runat="server" ID="rpList" OnItemDataBound="rpLis ...

  4. AppCan接入微信并且进行文字分享

    AppCan接入微信并且进行文字分享 接入指引 实现简单的文字分享功能 接入指引 详情请参见:http://newdocx.appcan.cn/index.html?templateId=412 实现 ...

  5. 在页面关闭或者刷新的时候触发 onbeforeunload

    该实例演示了如何使用 HTML DOM 向 body 元素添加 "onbeforeunload" 事件. 关闭当前窗口,按下 F5 或点击以下链接触发 onbeforeunload ...

  6. Date类型,Boolean类型,Number类型

    1.Date类型:  1)创建Date对象:    var date=new Date();  //Date对象会把当前日期和时间保存为其初始值 2)Date对象的方法:    --这些得到的都是数字 ...

  7. Java菜鸟学习 Script 脚本语言(简介)

    script 可以写在head里 也可以写在body里 还可以写在 /html后面 script 也是成对出现的  <script></script> 他有三种常见的对话框 1 ...

  8. Sublime Text怎么在切分两行视口内显示同一个文件

    原文链接:http://devlog.en.alt-area.org/?p=1098 How to split one file into two views in Sublime Text2 You ...

  9. [问题2014A02] 解答一(两次升阶法,由张钧瑞同学、董麒麟同学提供)

    [问题2014A02] 解答一(两次升阶法,由张钧瑞同学.董麒麟同学提供) 将原行列式 \(|A|\) 升阶,考虑如下 \(n+1\) 阶行列式: \[|B|=\begin{vmatrix} 1 &a ...

  10. 细话 - 如何在web应用中使用百度地图

    初步接触了高德地图嵌入到网站应用中的知识后,对高德地图提供的文档,源码以及使用快捷,方便非常满意. 由此,利用周末时间研究了下如何使用 百度地图 . 总的来说,方式方法都差不多,都提供了源码和文档实例 ...