• <tr id='mvFbUB'><strong id='mvFbUB'></strong><small id='mvFbUB'></small><button id='mvFbUB'></button><li id='mvFbUB'><noscript id='mvFbUB'><big id='mvFbUB'></big><dt id='mvFbUB'></dt></noscript></li></tr><ol id='mvFbUB'><option id='mvFbUB'><table id='mvFbUB'><blockquote id='mvFbUB'><tbody id='mvFbUB'></tbody></blockquote></table></option></ol><u id='mvFbUB'></u><kbd id='mvFbUB'><kbd id='mvFbUB'></kbd></kbd>

    <code id='mvFbUB'><strong id='mvFbUB'></strong></code>

    <fieldset id='mvFbUB'></fieldset>
          <span id='mvFbUB'></span>

              <ins id='mvFbUB'></ins>
              <acronym id='mvFbUB'><em id='mvFbUB'></em><td id='mvFbUB'><div id='mvFbUB'></div></td></acronym><address id='mvFbUB'><big id='mvFbUB'><big id='mvFbUB'></big><legend id='mvFbUB'></legend></big></address>

              <i id='mvFbUB'><div id='mvFbUB'><ins id='mvFbUB'></ins></div></i>
              <i id='mvFbUB'></i>
            1. <dl id='mvFbUB'></dl>
              1. <blockquote id='mvFbUB'><q id='mvFbUB'><noscript id='mvFbUB'></noscript><dt id='mvFbUB'></dt></q></blockquote><noframes id='mvFbUB'><i id='mvFbUB'></i>
                专注Java教育12年 全国咨询/投诉热线:400-8080-105

                首页 hot资讯 Log日志详解

                Log日志详解

                更新时间:2021-08-24 09:11 来源:玩彩网 浏览144次

                日志的级别划分

                Java日志通常可以分为:error、warn、info、debug、trace五个级别。在J2SE中预定义的级别更多,分别为:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST。

                日志对性⌒ 能的影响

                不管是多么优秀的日志工具,在日▃志输出时总会对性能产生或多或少的影响,为了将影响降低到最低,有以☆下几个准则需要遵守:

                如何创建Logger实例:创建Logger实例有是否static的区别,在log4j的早期▼版本,一般要求使用static,而在高版本以及后来的slf4j中,该问题已经得到优化,获取(创建)logger实例的成本已经很低。所〗以我们要求:对于可以预见的多数情况下单例运行的class,可以不ζ 添加static前缀;对于可能是多例居多,尤其是需要频繁创建的class,我们要求要♂添加static前缀。

                判断日志级别:

                n对】于可以预见的会频繁产生的日志输出,比如for、while循环,定期执行的job等,建议先使用if对日志级别进行判断后再输出。

                n对于日志输出内容需要复杂的序列化,或输出的某些信息获取ぷ成本较高时,需要对日志级别进行判断。比如︽日志中需要输出用户名,而用户名需要在日志输出时从数据库获取,此时就需要先判断一下日志级别,看看是否有】必要获取这些信息。

                优先使用参数,减少字∩符串拼接:使用参数的方式输出日志信息,有助于在性能和代码简洁之间取得平衡。当日志级别限制输出该日志时,参数内容将不会融合到最终输出中,减少了◤字符串的拼接,从而提升执行效率。

                什么时候输出▅日志

                日志并不是越多越详细就越好。在分析运行日志,查找问题时█,我们经常遇到该出现的日志没有,无用的╲日志一大堆◣,或者有效的日志被大量无意义的日志信息淹没,查找起来非常困难。那么什么时候输出日志呢?以下列出了一些常见的需要输出︻日志的情况,而且日志的级别基本都是>=INFO,至于Debug级别日→志的使用场景,本节没有专门列出,需要具体情况具体分析,但也是要□ 追求“恰如其分”,不是越多越好。

                系统启动△参数、环境变量

                系统启动的参数、配置、环境变量、System.Properties等信息对于软件的正常运行至关重要,这些信息的输出有助于安装配置人员通过日志快速定位问题,所以程序有●必要在启动过程中把使用到的关键参数、变量在日志中输出出来。在输出时需要注意,不是一股脑的全部输出,而是将¤软件运行涉及到的配置信息输出出来。比如,如果软件对jvm的内存参数∏比较敏感,对最低配置有要求,那么就需要在日志中将-Xms -Xmx -XX:PermSize这几个参数的值输出出来。

                异常捕获处

                在捕获异常处输出日♀志,大家在基本都能做到,唯一需要注意的是怎么输出一个简单明了的日志信息。这在后面的问题问题中有进一步说明。

                函数获得期望之外的结▓果时

                一个函数,尤其是供外部系统或远程调用的函数,通常都↓会有一个期望的结果,但如果内部系统或输出参数发生错误时,函数将无法返回期望的正确结果,此时就需要记录日【志,日志的基本通常是warn。需要特别≡说明的是,这里的期望之外的结果不是说没有返回就不需要记录日志了,也不是说返回false就需要记录日志。比如函数:isXXXXX(),无论返回true、false记录㊣日志都不是必须的,但是如果系统内部无法判断应该返回true还是false时,就需要记录日志,并且日志的级别应该至少是warn。

                关键操作

                关键操作的日志一般是INFO级别,如果数量、频度很高,可以考虑使用DEBUG级别。以下是一些关键操作的举例,实际№的关键操作肯定不止这么多。

                删除:删除一个文件、删除一组重要数据库记录……

                添加:和外系统交互时,收到了一个文件、收到了一个任务……

                处理:开始、结束一〖条任务……

                ……

                日志输出的内容

                ERROR:错误的简短描述,和该错误相关的关键参数,如果有异常,要∩有该异常的StackTrace。

                WARN:告警的简短描述,和该错误相关的关键参数,如果有异常,要有该异常的StackTrace。

                INFO:言简意赅★地信息描述,如果有相关动态关键数据,要☆一并输出,比如相关ID、名称等。

                DEBUG:简单描述,相关数据,如果有异常,要有该异常的StackTrace。

                在日志相关数据输出的时要特别注意对敏感信息的保护,比如修改密①码时,不能将密〓码输出到日志中。

                什么时候使用J2SE自带的日志

                我们通常使用slf4j或log4j这两个工具记录日志≡,那么还需要使用J2SE的日志♀框架吗?当然需要,在我们编写一些通用的工具类时,为了减少对第三方的jar包的依赖,首先要考虑使用java.util.logging。

                考虑到slf4j等日志框架提供了日志bridge工具,为java.util.logging提供了Handler,所以普通应※用的开发过程中也可以考虑使用J2SE自有日志,这样不但可以减少项目的编译依▲赖,同时在应用实施时可以更灵活的选择日志的输出工具包。

                典型问题分析

                该用日志的地方不↙用

                上图对异常的处●理直接使用e.printStackTrace()显然是有问题的,正确的做法是:要么通过日志方式输出错误信息,要么直接抛出异常,要么创建新的自定义异常抛出。

                另:对于静态工具类函数中的异常¤处理,最简单的〒方式就是不捕获、不记录日志,直接向上抛出,如果认为异常类型太多,或者意义◤不明确,可以抛出自定义异常类的实例。

                啰嗦重复、没有重点

                首先上面不■应该有error级别的日志。

                其次在日志中直接输出e.toString(),为定位问题提供的信息♀太少。

                另外需要明确一点:日志系统ω是一个多线程公用的系统,在两行日志输出之间有可能会被◆插入其他线程的日志记录,不会按照我们的意愿顺序输出,后面有更典型的例子。

                最后,上面①的日志可以简化为:

                logger.debug(“从properties中...{}...{}...”,name, value, e); logger.warn(“从properties中获取{}发生错误:{}”,name, e.toString());
                

                或者直接一↘句:

                logger.warn(“从properties中...{}...{}...”,name, value, e);
                

                或者□ 更完美的:

                if(logger.isDebugEnabled()){ logger.warn(“从properties中...{}...”, name, e); }else{ logger.warn(“从properties中获取{}发生错误:{}”, name, e.toString()); }
                

                日志和异常处理的关系

                首先上面的日志信息不够充分,级别定义不够恰当。

                另外,既然将异常捕获》并记录的日志,就不应该重新将一个一模一样◆的异常再次抛出去了。如果将异常再次抛出,那在上层肯定还需要对该异常进行处理,并记录日志,这样就重复了。如果▃没有特别原因,此处不应该捕获异】常。

                System.out方式的日志

                上面的日志形式十分随意,只适合临时的代码调试,不允╱许提交到正式的代码库中。

                对于临时『调试日志,建议在∞日志的输出信息中添加一些特殊的连续字符,也可以用自己的名称、代号,这样可以在调试完毕后,提交∑ 代码之前,方便地找到所有临时代码,一并删除。

                日志信息█不明确

                上面的“添加任务出错。。。”既没有记录任务id,也没有任务名称,软件部署后『发现错误后,根据▼该日志记录不能确认哪一条任务错误,给进一步的分析原因带来困难。

                另外第二个红圈中的问题有:要使用参数;一行日志就可以了。

                还有一些其他共性ㄨ的错误,就不多︽说了。

                忘记←日志输出是多线程公用的

                如果有另外一个线程正在输出日志,上面的记录就会被打断,最终显示输出和预想的就会不一致。正确〓的做法应是将这些信息放到一行,如果需要换行可以考◣虑使用“\r”,如果内∩容较多,考虑增加if (logger.isDebugEnabled())进行判断。而第二个例子中的输出有System.out的习惯,相关内容应该一行完成。

                以上就是玩彩网小编介绍的"Log日志详解",希望对ぷ大家有帮助,想了解更多可查看log4j教程。玩彩网□在线学习教程,针对没有任何Java基础的读者学习,让你从入门到精通,主要介绍了╲一些Java基础的√核心知识,让同学们更好更方便的学习和了解Java编程,感兴趣的同学可以关注一下。

                提交申〗请后,顾问老师会电话与您沟通安排学习

                免费课程推荐 >>
                技术文档推⌒荐 >>

                返回顶部