一直以来,如何去写日志都萦绕我胸怀已久;直到最近又要开始新的project,关于系统中日志如何设计又一次让我踌躇,发散了思绪,化成了淡淡的笔迹,拿出来给自己,也给大家分享。
在系统中分为两种日志:一种是流程日志,要包含用户最关心的信息,便于问题查找和跟踪;包含系统运行的状态信息和当前步骤;。。。。。。另外一种是调试信息,这有包含系统release debug信息和代码开发测试debug信息两种,release debug信息是希望在系统运行中可能运用到的日至类别;develop&test debug message是在系统开发测试阶段实用,而在code release之后,这些部分需要被删除的(代码冗余,性能考虑,代码净化)。
可以说是三种类型的日志,在code开发过程中都需要在代码中实现的,但是可能在release版本中会有所处理的;这就联系到处理机制。
java一般使用apache的log4j来写日志,可能我们会在log4j的基础之上构建我们系统的日志服务组件,姑且不论哪一种.顺便可以提及log4j的一些feature:日志级别,日志patterns
流程日志是系统运行的必须日志,因此它的级别至少是info级别的。eg:
if(log.isInfoEnabled()){
log.info(“ Message! “);
}
或者
{
log.info(“ Message! “);
}
在这个日志信息中要包含:系统流程信息(有必要输入的),用户关心的信息(以优先级最高或者较高的为主),我们有必要在日志输出中关心的消息(以优先级最高为主);。。。。。。(欢迎补充)
该日志输入对于记录系统运行状态(定时查看系统是否运行良好,可能是一个守护进程),记录流程运行阶段性的信息(当前阶段系统中各个关注点的情况,比方用户的一些信息,或者用户关心的一些信息,以便于系统出现异常是问题跟踪使用,系统维护必须的一些信息)。。。。。。这些日志在系统任何时段都能够准确的输出,因此没有必要对他何种情况输入等进行考虑和限制。对于log.info级别的日志最好能对于条件进行以下判断会更好。
系统release debug日志,是为了便于系统真正运行起来以后,可能进行debug的时候才需要进行日志输入,之所以对他们进行限制,主要是出于性能等方面的考虑。对日志输入的条件进行严格的限制,
if(log.isDebugEnabled()){
log.debug(“ Message! “);
}
尽管程序员是对代码充满自信(证明足够的健壮性),我们还需要在一些不确定,或者可能出现的,对于明天的事情做一些预测,今天对于问题进行防卫,(这些都是软件工程所反对的),我们都需要处理 跟踪 校验 排查等的区域,通过日志预先放置一些”监听器”.这种日志和系统的可维护性息息相关。这里面的很多日志信息都是“流程日志”的强大备份,也是系统通过test以后日志仍然需要变动的地方。也是和develop debug很难区分的一个区域。
前两种日志都是可能会对系统的性能构成影响,或者产生冗余或者日志不完全。尽管编码没有什么难度,但是都需要一些清晰的规范支持(至少是team一级的),主要是日志的可读性,覆盖的面积,可维护性。
develop log基本上上适用于代码调试阶段和单元测试阶段使用的log信息。根据程序员个人喜好和习惯来定制,但是这些log message在正式版本release以前都是要被删除的。需要一些灵活的机制和pattern实现等来支持。eg:
DebugManager{
public static boolean debug = true;
}
if(DebugManager.debug){
if(log.isDebugEnabled()){
log.debug(" Message! ");
}
}
在编译期间中对于这种情况进行优化。