设为首页 收藏本站
查看: 985|回复: 0

[经验分享] log4net.redis+logstash+kibana+elasticsearch+redis 实现日志系统

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-21 04:58:18 | 显示全部楼层 |阅读模式
  前端时间写了个随笔 log4net.NoSql +ElasticSearch 实现日志记录 ,因项目原因需要把日志根java平台的同事集成采用logstash+kibana+elasticsearch+redis结构实现日志统计分析,所以需要一个将log4net日志输出到redis的组件。没有找到现成的,就自己动手了。参考了 log4net.NoSql 的代码。
  redis的C#客户端使用了 ServiceStackRedis,json序列化使用 RestSharp。代码结构如下:
   DSC0000.png
  
  JsonLayout.cs代码:


DSC0001.gif DSC0002.gif


  public class JsonLayout : LayoutSkeleton
{
public readonly string HostName;
private readonly ITextTransform _transform;
public string LogType { get; set; }
public string AppName { get; set; }
public JsonLayout()
: base()
{
HostName = Dns.GetHostName();
_transform = TextTransform.Instance;
}
public override string ContentType
{
get { return "application/json"; }
}
public override void ActivateOptions()
{
//nothing to do here
        }
public override void Format(TextWriter writer, LoggingEvent loggingEvent)
{
var info = loggingEvent.LocationInformation;
var loggingEventJson = _transform.Serialize(new JsonLogMessage
{
class_method = info.MethodName,
class_name = info.ClassName,
host_ip = HostName,
line_number = info.LineNumber,
log_level = loggingEvent.Level.DisplayName,
log_message = loggingEvent.MessageObject.ToString(),
exception = BuildExceptionMessage(loggingEvent),
log_time = loggingEvent.TimeStamp.ToString("yyyy-MM-dd HH:mm:ss"),
logger_name = loggingEvent.LoggerName,
run_time = "0", //目前获取不到
thread_name = loggingEvent.ThreadName,
host = HostName,
log_type = this.LogType,
app_name = this.AppName,
path = ""
});
writer.Write(loggingEventJson);
}
private JsonLogException BuildExceptionMessage(LoggingEvent loggingEvent)
{
if (loggingEvent.ExceptionObject == null)
return new JsonLogException { exception_class = "", exception_message = "", exception_stacktrace = "" };
var exception = loggingEvent.ExceptionObject;
return
new JsonLogException
{
exception_class = exception.Source,
exception_message = exception.Message,
exception_stacktrace = exception.StackTrace
};
}
}
View Code  RedisAppender.cs





public class RedisAppender : AppenderSkeleton
{
private volatile PooledRedisClient _pooledRedisClient;
private readonly object _padlock = new object();
public string Host { get; set; }
public string Port { get; set; }
public string ListId { get; set; }
public string MaxPoolSize { get; set; }
public RedisAppender()
{
}
private PooledRedisClient Client
{
get
{
if (_pooledRedisClient != null) return _pooledRedisClient;
lock (_padlock)
{
if (_pooledRedisClient == null)
{
_pooledRedisClient = new PooledRedisClient(this.Host, int.Parse(this.Port), int.Parse(this.MaxPoolSize));
}
}
return _pooledRedisClient;
}
}
protected override void Append(LoggingEvent loggingEvent)
{
var sb = new StringBuilder();
var writer = new StringWriter(sb);
base.Layout.Format(writer, loggingEvent);
this.Client.AddItemToListAsync(ListId, writer.ToString());
}
}
View Code  PooledRedisClient.cs





  public class PooledRedisClient
{
private readonly string _baseUri;
private readonly PooledRedisClientManager _clientManager;
///
/// 实例化连接池客户端
///
///
///
/// 默认值10
public PooledRedisClient(string host, int port, int maxPoolSize = 10)
{
_baseUri = string.Format("{0}:{1}", host, port);
var config = new RedisClientManagerConfig();
config.MaxReadPoolSize = maxPoolSize;
config.MaxWritePoolSize = maxPoolSize;
_clientManager = new PooledRedisClientManager(new string[] { _baseUri }, new string[] { _baseUri }, config);
}
///
/// 异步记录
///
///
///
public void AddItemToListAsync(string listId, string log)
{
//使用Task任务异步执行
var task = new Task(() =>
{
try
{
using (var clinet = _clientManager.GetClient())
{
clinet.AddItemToList(listId, log);
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
});
task.Start();
}
}
View Code  在RedisClient连接时用了连接池,写日志时用Task做了异步。这种写法不知道会不会存在问题?!
  配置文件























View Code  Layout和Appender里的属性配置和代码里属性配置名称一致,Log4net的框架就可以读取配置数据反射到实体属性上。
  代码下载地址:
  http://download.iyunv.com/detail/zbl131/7702673
  
  参考文章:
  1.用Kibana和logstash快速搭建实时日志查询、收集与分析系统
  http://storysky.blog.iyunv.com/628458/1158707/
  2.使用ServiceStackRedis链接Redis简介
  http://www.iyunv.com/daizhj/archive/2011/02/17/1956860.html
  3.ServiceStack.Redis的问题与修正
  http://blog.iyunv.com/susubuhui/article/details/8930417
  4.对ServiceStack.Redis的连接池进行故障转移改造
  http://www.iyunv.com/smark/archive/2013/05/24/3096488.html
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-88792-1-1.html 上篇帖子: Redis快速入门 下篇帖子: Redis系列三(redis配置文件分析)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表