日志系统设计

日志系统设计  

2009-12-11 00:46:58|  分类: 技术 |  标签: |字号 订阅

一、重要性
日志系统在整个系统架构中的重要性可以称得上基础的基础,但是这一点,都容易被大多数人所忽视。因为日志在很多人看来只是printf。在系统运行期间,是很难step by step的,所以只能根据系统的运行轨迹来推断错误出现的位置,这往往也是唯一的资料,特别是在高可靠性的情况下。
从更大方面的范围来说,日志系统是运营维护的范畴。但小的方面来说,这是必须的调试的手段。在多年的开发经验来看,日志系统必须被我们重视的。

二、解决问题
日志系统的主要解决的问题是记录系统的运行轨迹,在这个基础上,进行跟踪分析错误,审计系统运行流程。在高可靠的系统中,是不允许系统运行终止的。日志系统的内容可以分为2类,一类可是业务级别的日志,主要供终端用户来分析他们业务过程;另一类是系统级别的日志,供开发者维护系统的稳定。
由于日志系统的数据输出量比较大,所以不能不考虑对整个系统性能的影响。从另外一方面来看,海量的日志内容有时候并不件好事,因为,很容易覆盖真实问题的蛛丝马迹。也增加日志阅读者信息检索的困难。
日志系统的设计,必须解决几个问题:
1、使用方便,包括开发和信息检索。
2、组织合理,日志内容被有效的组织起来。有助于基于日志内容的分析。
3、过程重现,这个目标其实对开发者来说是最重要的。基于日志的分析,最重要的是重现当时运行的过程。
4、可控制性,允许用户进行干预,特别是运行期的干预。比如关闭某些内容,或者重定向内容的输入目标点。

三、系统构成
一个日志系统根据他的过程,可以分为日志来源,系统控制,日志输出,【日志存储】。根据这个过程,我们可以将整个系统分为4个模块,并加以抽象。

1、日志来源
日志内容可以来源于任何其他系统,但对日志系统来说,这是个格式化的缓冲区。对于日志系统来说,任何内容都是合法的。最重要的是,日志系统必须提供一个简单的规则,为后续的管理和检索提供方便性和灵活性。在传统的printf格式中,是很难维护一个格式化的日志输出。文本方式对人来说阅读方便,但不容易检索,特别是在大量日志的情况下,更不好维护了。
2、日志控制
系统控制的重点在于控制日志内容在日志系统中的流转过程。比如日志输出目的地,比如日志的输出级别。我们在apache的Logging项目中曾经看到,他们提供了一个和平时不太一样的输出目的地,telnet。这和传统的stdout、stderr、syslog有很大的区别,便于远程管理,更大的潜力在于,可以在运行期,通过登录telnet来动态调整系统环境配置。
3、日志输出
日志在控制台输出是比较常见的,但如何考虑为系统的可靠性提供支持,以及大量日志内容的情况下,这个一般不予考虑的。在控制台输出的,只会是非常核心的内容或者是致命的错误,况且,在有些情况下,不一样会有控制台。我们一般在这种情况下,都倾向于将日志输出到文件。但对一个完善的日志系统,日志输出和日志存储又是有区别的。日志存储是日志输出到文件的一种方式。日志输出也是日志控制的一个内容。
4、日志存储
日志存储在很多小型系统往往并不需要关注,一个可靠性要求很高的系统中,对日志存储却是极为苛刻。就是在现在的数据库系统中,也必须依赖日志的存在,来还原操作。

四、日志内容
1、内容分级
在LINUX的SYSLOG中,对日志内容进行分级,将分为8个级别,如下:

#define LOG_EMERG 0 /* system is unusable */
#define LOG_ALERT 1 /* action must be taken immediately */
#define LOG_CRIT 2 /* critical conditions */
#define LOG_ERR 3 /* error conditions */
#define LOG_WARNING 4 /* warning conditions */
#define LOG_NOTICE 5 /* normal but significant condition */
#define LOG_INFO 6 /* informational */
#define LOG_DEBUG 7 /* debug-level messages */

这样,我们只需要设置一个全局变量,监控日志内容输出级别。当产生日志内容的级别比输出级别更优先时,将被记录下来,否则被简单的忽略。这种方式,很容易控制日志的输出内容。在WIN32平台下,有分类的功能,但是没有分级。但实际上也有个问题,就是只能控制一个输出范围,如果想只输出特定类的日志内容,在策略上,还是比较麻烦的。
2、内容分类
在LINUX的SYSLOG中,不但对日志内容有分级,同样也有分类,主要是根据日志内容的来源,如下:

#define LOG_KERN (0<<3) /* kernel messages */
#define LOG_USER (1<<3) /* random user-level messages */
#define LOG_MAIL (2<<3) /* mail system */
#define LOG_DAEMON (3<<3) /* system daemons */
#define LOG_AUTH (4<<3) /* security/authorization messages */
#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */
#define LOG_LPR (6<<3) /* line printer subsystem */
#define LOG_NEWS (7<<3) /* network news subsystem */
#define LOG_UUCP (8<<3) /* UUCP subsystem */
#define LOG_CRON (9<<3) /* clock daemon */
#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */
#define LOG_FTP (11<<3) /* ftp daemon */

在WIN32平台下的事件管理器也是有相应的功能,只是有部分区别。WIN32的系统日志被分为安全性、应用程序、系统等几类。每类都有几个固定的字段,日志内容是以文本方式被保存的。分类的主要依据也是日志内容的来源。

3、内容格式
虽然内容的分级和分类在很大的程度上,对日志内容进行归类,但这远远不够。这个规则的粒度相当粗糙。也就是说,针对特定级别特定类的日志内容也会是相当地庞大。因此有必要针对日志内容在更小粒度的划分,就是内容格式的设计。内容格式的设计上,有个很致命的问题,就是内容的多样性,很难用一个统一的格式来限定内容输出。对于动态内容的格式话,其实我们也有几个现成方案值得借鉴。
首先、XML在格式化多样性内容方面具有相当大的灵活性,不过他也有个致命的弱点,就是解析内容时,具有相当大的时间复杂度。
其实、TDS协议是SYBASE数据库在输出DBMS结果给客户端时,数据流的格式。他允许在一个流中存在不同类表的数据,比如多个不同结果字段的游标。在灵活性方面不如XML,但速度要快于XML。
最后、每个内容块都遵循同样的格式,这种方式,灵活性最差,但要简单多了。整个日志内容相当于一个固定结构的表。
从笔者的角度出发,倾向于以TDS的格式为基础,引进XML的某些特性,来设计出一个内容格式。

4、内容边界

日志系统可能需要将各种各种格式的日志内容统一存储在一起,这些内容同样可能是不同的大小,因此我们需要确认每个内容边界,否则极有可能混淆每个内容的确切内容。内容边界是日志系统设计的一个最基本细节,否则这个日志系统将是不可能。没法确切区分每个日志内容,后续的分析就没法是实现了。内容边界的设计,在日志存储系统之前就必须是明确的。

五、日志控制
1、控制目标
日志系统要控制的目标包含整个日志内容流转的过程。对日志来源的控制,一般着重于对日志内容的过滤。上面对内容进行分级、分类、制定格式,一个最重要的原因就是对日志内容的过滤。对日志输出控制,主要着重于输出目的,比如是文件还是SYSLOG,以及诸如此类。
日志控制是日志内容流转过程中的一个强化功能。一般来说,越多的日志内容,对系统跟踪分析更有利,但更多的内容,就越增加分析的难度。所以我们需要通过日志控制这个功能来进行平衡。

2、来源控制
一个最明显的例子,为了方便调试,可能需要在系统中增加调试信息,在正在发布中,这些是不需要。所以在很多系统发布版本中,都要区分发布版和调试版。如果增加了来源控制系统,那么这些事情就简单多了。我们只要将这些信息简单地分级分类。通过一个逻辑控制,将不需要的给过滤掉。前面的分级分类的工作,在这个时候就会发挥很大的作用。
在wireshark,原来的ethereal,允许自己编辑过滤条件。POSIX的正则表达式也是个很好的设置过滤条件工具。过滤是来源控制功能的一个很重要的工作。实际上,内容在来源上已经产生,只是没有到达或者说没有必要到达到输出目的地。

3、输出控制
输出控制是日志控制的一个重要工作,但是这个工作和日志输出会有个概念重合的地方。控制只是负责按规则解释这个内容究竟是否需要输出,至于输出的具体内容,其实和他已经没有什么关系了。

六、日志输出
日志输出有两个重点功能,就是输出什么样以及往哪里输出。
1、输出格式
输出格式,是解释内容是什么样的工作,printf的格式串是很明显的例子。但是一个强大的日志系统可能更为复杂,比如DBMS的日志系统。格式问题往往在日志检索中,或者日志分析中,体现出巨大的作用。在通常的使用中,还是要依赖于分级和分类。不过格式的使用,针对日志内容级别的检索和分析将更为有用。

2、输出目标
输出目标通常为文件,控制台,syslog,在apache logging项目中还有个telnet。在文件和syslog作为输出目标时,其实和存储已经很相似了。往哪个目标输出是输出控制的功能,不过,每个目标输出内容应该如何输出,就是日志输出的工作了。

3、telnet
telnet作为输出目标是很少见,因为他比较复杂,不过,因为他功能强大,所以,在大型服务器中,是非常需要的。在这里必须着重提醒一下。apache logging项目,专门有个功能。telnet配合日志控制,允许在运行期得到更为详细的功能供调试。这是个很重要的特性,他提供了在运行期和系统进行交互的一个手段。

七、日志存储
日志存储其实是日志输出的一部分,不过是日志输出中一个很特别的部分。日志输出可能没有IO操作,只在内存中完成操作,但是日志存储是必须存储到物理磁盘中。这个特性就会涉及到一个效率问题。我们知道IO操作和内存操作的性能级别不是一个数量级的。当日志系统涉及到存储时,就必须考虑到性能问题。当大量的数据频繁地被写入到磁盘中,性能问题就更为严重。必须采取更有效的措施来避免写盘操作对其他系统的影响。

原文转自:http://blog.csdn.net/romandion/archive/2007/11/10/1877189.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj 1124 [POI2008]枪战Maf 贪心

[POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 741 Solved: 295[Submit][Status][Discuss]Description 有n个人&#xff0c;每个人手里有一把手枪。一开始所有人都选定一个人瞄准&#xff08;有可能瞄准自己&#xff09;。然后他们按某个顺序开枪&#x…

核心API最佳实践——JDK日志分级

核心API最佳实践——JDK日志分级 时间:2005-10-29 08:00 来源:网管之家bitsCN.com 字体:[大 中 小]日志&#xff08;Log&#xff09;是什么&#xff1f;字典对其的解释是"对某种机器工作情况或某项任务进展情况的记载"。对于应用系统来说&#xff0c;日志就应该记录应…

20165234 《Java程序设计》第五周学习总结

第五周学习总结 教材学习内容总结 第七章 内部类与异常类 内部类内部类&#xff1a;在一个类中定义另一个类。 外嵌类&#xff1a;包含内部类的类&#xff0c;称为内部类的外嵌类。 内部类的类体中不能声明类变量和类方法。外嵌类的类体中可以用内部类声明对象&#xff0c;作为…

Java日志操作总结

Java日志操作总结 (2008-04-21 17:39:06)标签&#xff1a; 杂谈 . 使用Jakarta Commons Logging(JCL) 1.1. 概述 Apache的开源日志组件Jakarta CommonsLogging(JCL)提供的是一个日志(Log)接口(Interface)&#xff0c;同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中…

4-2日装饰器,带参数的装饰器

1&#xff0c;函数的有用信息 from functools import wraps#引用模块 def wrapper(f): # f func1wraps(f)def inner(*args,**kwargs): #聚合#args &#xff08;1,2,3&#xff09;执行函数之前的相关操作ret f(*args,**kwargs) # 打散 1,2,3执行函数之后的相关操作return re…

Apache Storm:如何使用Flux配置KafkaBolt

微型框架中的助焊剂可以帮助我们定义和部署Storm拓扑。 Flux有各种包装器&#xff0c;可帮助您定义所需的流并初始化Bolts和Spouts&#xff08;使用带有或不带有参数的构造函数&#xff0c;并通过反射自动调用自定义配置方法&#xff09;。 您只需要使用Flux就是将其作为依赖…

java 获取当前函数名

import java.text.SimpleDateFormat; import java.util.Date; /** * Java实现类似C/C中的__FILE__、__FUNC__、__LINE__等,主要用于日志等功能中。 * * version 1.0 2011-07-13 * */ public abstract class CommonFunction { /** * 打印日志时获取当前的程序文件名、行号、方法…

美国华尔街拥抱区块链是最大的威胁

Overstock的首席执行官帕特里克伯恩宣布证券交易委员会已批准其计划在区块链上发行股票&#xff0c;该区块链是推动比特币数字货币的巨大在线分类账。 这是一个重要的时刻。至少在理论上&#xff0c;区块链可以更有效&#xff0c;准确和公开地跟踪股票&#xff0c;债券和其他金…

java枚举和枚举类_Java枚举:您拥有优雅,优雅和力量,这就是我所爱!

java枚举和枚举类当Java 8即将面世时&#xff0c;您确定您对Java 5中引入的枚举很熟悉吗&#xff1f; Java枚举仍然被低估了&#xff0c;很可惜&#xff0c;因为它们比您想象的要有用&#xff0c;它们不仅仅用于通常的枚举常量&#xff01; Java枚举是多态的 Java枚举是可以包…

Java关键字final、static使用总结

Java关键字final、static使用总结 一、final 根据程序上下文环境&#xff0c;Java关键字final有“这是无法改变的”或者“终态的”含义&#xff0c;它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变&#xff1a;设计或效率。 final类不能被继承…

【SpringCloud】第五篇: 路由网关(zuul)

前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。 工具:…

ubuntu shell简介

ubuntu shell简介 (2012-03-13 19:48:09) 标签&#xff1a; 杂谈 分类&#xff1a; 虚拟机下的ubuntu8.04 1.什么是shell&#xff1f; shell是接受用户或应用层的命令&#xff0c;并将这些命令解释给底层的系统内核层&#xff0c;由这些内核完成相应的工作&#xff0c;并将结果…

如何更新Jenkins作业发布config.xml

最近&#xff0c;我想更新Cloudbees中的一些作业&#xff08;未使用DSL定义&#xff09;&#xff0c;为每个作业添加一些属性。 好吧&#xff0c;我在使其工作时遇到了一些麻烦&#xff0c;这是我的注意事项&#xff08;我使用的是Jenkins 1.651.2.1&#xff0c;但有可能它应与…

月下“毛景树”

Description 毛毛虫经过及时的变形&#xff0c;最终逃过的一劫&#xff0c;离开了菜妈的菜园。 毛毛虫经过千山万水&#xff0c;历尽千辛万苦&#xff0c;最后来到了小小的绍兴一中的校园里。爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树”下面&#xff0c;发现树上长着他最…

自由口通信模式下计算机读写PLC存储区的程序

自由口通信模式下计算机读写PLC存储区的程序 2008-8-20 8:51:00 来源&#xff1a;摘 要&#xff1a;本文介绍了在自由口通信模式下&#xff0c;用计算机读写S7-200 PLC存储区内相邻的多个字节数据的通信程序设计方法&#xff0c;程序设计中采用了多种可靠性措施。 关键词&…

Zookeeper入门

ZooKeeper 是一个开源的分布式协调架&#xff0c;主要用来解决分布式集群中应用系统的一致性问题 本质 分布式的文件存储系统(Zookeeper文件系统监听机制)&#xff0c;是一个基于观察者模式设计的分布式服务管理框架 zookeeper的数据结构 Zookeeper的层次模型称作Data Tree,…

【laravel5.4】重定向带参数

1、 2、重定向回上一页面 3、返回上一页面带参数 转载于:https://www.cnblogs.com/xuzhengzong/p/8715463.html

Google Protocol Buffers 2.3.0 for java 快速开始

Google Protocol Buffers &#xff12;.3.0 for java 快速开始 博客分类&#xff1a; Java JavaGoogleUbuntuLinux数据结构Protocol Buffers是一个平台中立&#xff0c;编程语言无关的&#xff0c;可扩展的机制&#xff0c;是用于结构化数据串行化的灵活、高效、自动的方法&a…

jenkins api_接触Jenkins(Hudson)API,第2部分

jenkins api这篇文章从本教程的第1部分继续。 已经快一年了&#xff0c;但是我终于有时间重新审视我为与Jenkins api交互而编写的一些代码。 我已经使用了部分工作来帮助管理许多Jenkins构建服务器&#xff0c;主要是保持插件同步以及将作业从一台机器移动到另一台机器。 在本文…

JAVAC 命令详解

JAVAC 命令详解 结构 javac [ options ] [ sourcefiles ] [ files ]参数可按任意次序排列。 options 命令行选项。 sourcefiles 一个或多个要编译的源文件&#xff08;例如 MyClass.java&#xff09;。 files 一个或多个对源文件进行列表的文件。 说明 javac 有两种方法可将源…