日志在软件系统中的重要性我在此也不赘述了,几乎所有程序员每天都会更日志打交道。 那么你是否曾今为这样的一些事情而困扰过:

- 远程登录到不同的服务器,找到应用程序目然后查看应用日志;
- 来回切换于不同服务器并使用tail来实时监控日志输出信息;
- 解决在各个服务器上各个应用日积月累生成的大量日志文件造成的磁盘空间不足的问题;

如果在你的系统中存在着很多个不同的进程并且运行在多个服务器上,上面的问题将会显得尤为突出。很不幸是,笔者所在的公司的系统中,有数十个windows服务,控制台程序,计划任务同时工作在多个服务器上。 因此,笔者不胜其扰,终于开始寻找日志集中管理的解决方案。 幸运的是,一款开源的日志服务器软件 LogMaster4Net 刚好满足需求,而且正好支持笔者公司系统采用的日志组件log4net。 经过一段时间的使用,LogMaster4Net已在笔者公司稳定运行了超过半年时间。 笔者公司的日志从此规整,监控系统运行情况也比以前方便很多,查询系统运行问题也更迅速。

下面介绍一下LogMaster4Net的使用方法:

下载安装

下载地址: https://github.com/kerryjiang/LogMaster4Net/releases/tag/0.1

配置端口: 打开根目录配置文件(SuperSocket.SocketService.exe.config)设置端口号(默认为2020)

<server name="LogMasterServer"
...
port="[port]"
...
</server>

安装Windows服务: 命令行运行如下指令,安装成功后,如发现服务未启动请在服务列表里找到服务LogMaster4NetService并启动

SuperSocket.SocketService.exe -i

将应用程序的log4net配置文件复制到LogMaster4Net目录

LogMaster4Net可直接使用应用的日志配置文件。应用日志如有文件生成,请注意文件保存路径。 应用配置文件应存放于LogMaster4Net的Config文件夹, 相对路径如下:

\Config\log4net.[LogAppName].Config

[LogAppName] 为应用在LogMaster4Net中的唯一名称,将会在后面设置中使用。

如果 [LogAppName] 为 "QueryApp", 那么此应用的日志配置文件名为:

\Config\log4net.QueryApp.Config

此应用的日志配置内容可为:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="infoAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
</filter>
<file value="AppLogs\SampleApp\info.log" />
<encoding value="utf-8"/>
<preserveLogFileNameExtension value="true" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="infoAppender" />
</root>
</log4net>

应用程序日志转发设置

使用log4net的UdpAppender转发日志:

<appender name="udpAppender" type="log4net.Appender.UdpAppender">
<remoteAddress value="[ServerAddress]" />
<remotePort value="[port]" />
<layout type="log4net.Layout.XmlLayout">
<locationInfo value="true" />
</layout>
</appender>
  • [ServerAddress]: LogMaster4Net服务安装运行的地址
  • [Port]: LogMaster4Net服务监听的端口号;

设置日志全局变量"LogAppName":

log4net.GlobalContext.Properties["LogAppName"] = "QueryApp";

此处LogAppName即为上步所述应用在LogMaster4Net中的唯一名称"QueryApp"。

完成上述步骤之后,编译运行应用程序,日志便会转发到LogMaster4Net上并按照应用的日志的配置进行处理。

LogMaster4Net的优势与缺点

优势如下:

  • 简单: 直接使用现有日志组件的特性,无需额外开发;
  • 透明: 仍使用原应用的配置进行处理,如同在应用本地处理日志一样;
  • 灵活: 灵活的配置策略: 基于SuperSocket的配置允许LogMaster4Net监听多个IP和端口,甚至能允许你运行多个LogMaster4Net服务器实例;
  • 跨平台: 二进制级别的兼容Unix/Linux (通过Mono); (http://docs.supersocket.net/v1-6/zh-CN/Run-SuperSocket-in-Linux-Unix)

缺点:

  • 缺乏相应的日志辅助工具,如dashboard, archive; 如需更多高级功能,需要配合其它工具使用;

展望

当今软件江湖,云计算(PaaS),应用容器(Docker), 微服务等技术(概念)越来越应用广泛。为了追求更好的可靠性,稳定性,易维护性,将来会有更多的系统是以多进程,多实例的方式运行。如此一来,作为软件系统中的基础部件,日志的集中管理将会是一个公共话题。 相关的最佳实践,开源项目也将不断涌现。

传说中的Splunk很好很强大,但是不便宜。 不是所有公司(中国公司)愿意在日志上投入那么多钱。 LogMaster4Net作为其中一个开源软件只是完成了一小步,但对于一些要求不高,技术实力有限的中小IT企业也已经足够。不过还好,LogMaster4Net推出的时间很短,是一个十分年轻的开源项目,如果大家对它有啥建议,不妨直接联系其作者。相信LogMaster4Net在未来的几年里会有不错的发展。

使用LogMaster4Net实现应用程序日志的集中管理的更多相关文章

  1. C# 使用Log4Net记录程序日志

    在之前的博客中,写过使用系统内置的Trace类记录程序日志,具体请参考:C# 使用Trace记录程序日志.这篇博客将介绍如何使用Log4Net记录程序日志. 首先需要引用Log4Net.dll,我们可 ...

  2. 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)

    使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB) http://www.cnblogs.com/mrkelly/p/4015245.html 以往调试Androi ...

  3. 深入剖析HADOOP程序日志

    深入剖析HADOOP程序日志 前提 本文来自于 博客园 逖靖寒的世界 http://gpcuster.cnblogs.com 了解log4j的使用. 正文 本文来自于 博客园 逖靖寒的世界 http: ...

  4. 写window应用程序日志System.Diagnostics.EventLog.WriteEntry

    System.Diagnostics.EventLog.WriteEntry( MySource , Writing to event log. ); 可以写window应用程序日志 查看的地方:右击 ...

  5. 优雅地记录Python程序日志1:logging模块简介

    本文摘自:https://zhuanlan.zhihu.com/p/31893724 本篇涉及: logging模块的调用: 保存log日志为文件: 调整输入日志等级: 修改日志消息格式: 前言 在使 ...

  6. 使用Log4j将程序日志实时写入Kafka(转)

    原文链接:使用Log4j将程序日志实时写入Kafka 很多应用程序使用Log4j记录日志,如何使用Kafka实时的收集与存储这些Log4j产生的日志呢?一种方案是使用其他组件(比如Flume,或者自己 ...

  7. [转]利用C#自带组件强壮程序日志

    利用C#自带组件强壮程序日志   在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...

  8. Linux 文件管理(C语言库函数二--程序日志)

    文件删除和改名 int remove(const char *pathname); int rename(const char *oldpath,const char *newpath); remov ...

  9. 转载——利用C#自带组件强壮程序日志

    利用C#自带组件强壮程序日志   在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简 ...

随机推荐

  1. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  2. 札记:android手势识别,MotionEvent

    摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势T ...

  3. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  4. 说说Golang的使用心得

    13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直 ...

  5. 分治法求解最近对问题(c++)

    #include"stdafx.h" #include<iostream> #include<cmath> #define TRUE 1 #define F ...

  6. npm package.json属性详解

    概述 本文档是自己看官方文档的理解+翻译,内容是package.json配置里边的属性含义.package.json必须是一个严格的json文件,而不仅仅是js里边的一个对象.其中很多属性可以通过np ...

  7. 关于VS2015 ASP.NET MVC添加控制器的时候报错

    调试环境:VS2015 数据库Mysql  WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...

  8. kafka配置与使用实例

    kafka作为消息队列,在与netty.多线程配合使用时,可以达到高效的消息队列

  9. kafka源码分析之一server启动分析

    0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...

  10. 【Reading Note】Python读书杂记

    赋值 >>> list=[] >>> app=[list,list,list] >>> app [[], [], []] >>> ...