一.日志系统基本常识

1.日志系统作用:将日志信息输出到控制台和文本文件,以追踪代码运行信息。

2.日志系统操作的是什么?日志系统打印信息,也是调用日志系统的log.Info(),log.Warn()这些方法的,调用方法就要消耗cpu和栈,尤其日志系统的输入参数和输出参数都是字符串,日志系统输出的都是字符串信息,否则怎么显示在控制台和保存在文本文件中嘛,所以就更消耗cpu了和内存了。因为涉及很多字符串的拼接操作,在log的info和warn()入参中。且,在log的info和warn()入参中,我们还经常调用其他方法,所以日志系统的输出方法,是很消耗cpu和内存的。

3.那么应该如何避免日志系统影响程序运行效率呢?

常用方法:1.避免log.info(),debug()入参提前生成,免去无用功,通过加入判断日志系统级别的代码,即if(logger.isInfoEnabled()).避免日志输出方法参数的提前生成。因为logger.info方法内部有判断输出级别的代码。但是在进入logger.info函数之前,("User " + userId + " is using app " + appId) 这个表达式已经通过运算拼接成了一个字符串;而如果事先使用 if (logger.isInfoEnabled())进行判断,那么当log级别在INFO以上时,就能省去上述的字符串操作,在高并发和复杂log信息拼接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。---防止更高日志输出级别时,判断了低级别但不输出。

2.java正确声明实例化new logger。尽量将所有logger是声明为static静态的保证内存中只声明一份。否则多次创建同一个对象,就白白创建了多个logger实例。

3.log.info(),log.debug()这些传参中,尽量避免一些复杂的调用,比如Log.info()里再连接数据库读取user的名字。

4.日志系统是已经写好了的功能代码:是一段JDK里或者其他JAR包里已经写好的代码,是代码,才能执行输入输出嘛。JAVA有自己实现的日志系统,就在java.util包里,叫java.util.logging。这是JDK自带的日志系统,还有常用的Apache log4j,第三方日志工具。

5.我们常用的日志工具有三种:jdk自带的日志工具,第三方日志工具Apache log4J,和第三方SLF4J。Apache log4J要引用jar包到buildpath。这里重点讲一下slf4j,这个才是最常用的。

6. slf4j并不能真正提供打印功能,它只是其他日志工具的封装,将不同的日志工具接口抽象出来。提供真正打印功能的还是log4j或者jdk日志工具。Slf4j的使用,使我们可以跨越和随意更换不同的具体日志实现工具,而不必更改代码和jar包import引用语句。

用途:比如,你想写一个jar包供其他人使用,jar包里的类和方法要打印一些信息,因为你不知道具体系统究竟用什么日志工具,所以在你jar包里,就可以完全使用slf4j打印。等他人系统调用你jar包时,你jar包里的打印方法会由具体的本地系统所有的日志工具实现。

如果你开发的是类库或者供其他人使用的组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。

7.使用SLF4J项目的日志结构,具体项目,就要有log4j日志实现工具jar包,和slf4j实现工具jar包。

8.日志工具的几个输出级别:日志系统有5个输出级别,debug,info,warn,error,fatal,一个等级比一个等级高。

Debug,最低级别,一般在生产环境,是不进行输出的,只在测试环境输出,任何在调试代码时,一些必要的信息,输出来都行。

Info输出级别:info输出的信息是可以给使用人员顾客看的,在生产环境中是肯定要输出info级别的日志的。某种程度来讲,info级别的日志输出,是可以当做软件的一部分的。

Warn,error,fatal:这三个级别都是很高的级别。

9.日志级别规则:低级别的日志输出,会一并输出比目前级别高的输出。比如,日志输出级别定为debug,debug是最低级别,所以一定会打印出info,warn,error,fatal都会输出。

答:因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。而我们其实已经假定,Warn 信息其实并不影响系统的正常运行,这一般只代表系统中存在一些还没有被发现或者修改的小 Bug。这些 Warn 信息会让最终用户困惑甚至恐慌,系统发出警告了,该怎么办?

10.日志系统只有1个:因为进行控制台输出嘛,相当于打印机一样,多个logger只能按序输出。多线程调用日志系统时候,两行日志输出之间有可能会被插入其他线程的日志记录,不会按照我们的意愿顺序输出。

11.判断日志界别,避免生成无效入参。这完全是防止当目前日志级别log输出所用级别高时,做的无效入参形成。记住,是防止防止当目前日志级别log输出所用级别高时。因为判断日志级别的代码,是在log,info(),debug()这里方法里的代码,参数已经被形成了。

二.在代码哪里使用日志,及怎么使用?

1.一定要日志对象logger,声明为static静态的,保证一个类只有一个logger对象,避免多次创建对象时多次创建logger,造成内存浪费。

private static org.slf4j.Logger logger = LoggerFactory.getLogger(APPMain.class);

2.一定要加入日志级别判断java代码,logger.isInfoEnabled(),避免入参无效形成,做无用功。提高效率。(在调用任何方法前,都是先执行和生成方法的入参,再去执行方法里的代码,这涉及到创建栈,一个方法被调用时,就创建一个新的栈空间,就会先创建方法入参。)---防止更高日志输出级别时,判断了低级别但不输出。

3. 系统启动的参数、配置、环境变量、System.Properties等信息一定要打印日志:对于软件的正常运行至关重要,这些信息的输出有助于安装配置人员通过日志快速定位问题,所以程序有必要在启动过程中把使用到的关键参数、变量在日志中输出出来。

4. 关键步骤增删改查一定要打印日志:比如,增删改查地方一定要添加打印。因为这涉及到数据是否更改成功。用于提示程序员。

5.捕获异常处一定要打印日志且不要再向外抛出异常,打印内容是stacktrace堆栈信息。堆栈信息描述了发生异常时候的瞬间堆栈信息。会指出报错位置和地方。既然你已经打印了日志信息,就不要再抛出异常了。异常处直接用looger.error()方法输出。

catch (Exception e) {

if(logger.isErrorEnabled()) {

logger.error("init um2UserService error", e);

}

三.怎样配置使用日志工具?

1.配置Log4j:Log4j配置文件,就是个properties文件,里面是keyvalue键值对,等号相连。Appender 为日志输出目的地,Log4j提供的appender有以下几种:

能够输出到控制台,文件,每日输出文件,文件到指定大小时候产生新文件,发送日志。

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

2)为不同的 Appender 设置日志输出级别:

### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 保存异常信息到单独文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 异常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
og4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

2.项目中怎样启动Log4j?

答:将jar包引入buildpath,并配置好log4j.properties配置文件后。就可以直接使用logger了,logger类的第一次加载时候,会自动初始化lo4j的配置文件,通过static代码块的方式。

注:但凡自动读取配置文件,全都是用static初始化块来调用的,初始化快用来执行配置文件的读取。

日志工具全面理解及配置应用---以Log4j例子的更多相关文章

  1. 使用 Android 的日志工具LogCat

    Android 中的日志工具类是 Log(android.util.Log),这个类中提供了如下几个方法来供我们打印日志. 1.    Log.v() 这个方法用于打印那些最为琐碎的,意义最小的日志信 ...

  2. 【转】使用 Android 的日志工具LogCat

    Android中的日志工具类是 Log(android.util.Log),这个类中提供了如下几个方法来供我们打印日志. 1.    Log.v() 这个方法用于打印那些最为琐碎的,意义最小的日志信息 ...

  3. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  4. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  5. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  6. Java主流日志工具库

    在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...

  7. 【工具推荐】ELMAH——可插拔错误日志工具

    今天看到一篇文章(构建ASP.NET网站十大必备工具(2)),里面介绍了一个ELMAH的错误日志工具,于是研究了一下. ELMAH 是 Error Logging Modules and Handle ...

  8. Android-LogCat日志工具(二)

    既然是Java语言,那么对于很多人来说,用System.out.println() 方法来打印日志是最熟悉.最简单不过了.不过在真正的项目开发中,是极度不建议使用 System.out.println ...

  9. Java 标准日志工具 Log4j 的使用(附源代码)

    源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...

随机推荐

  1. 关于excel导入、导出(POI)

    当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中, ...

  2. HDU 1171 Big Event in HDU(多重背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  3. nyist oj 115 城市平乱 (最短路径)

    城市平乱 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南将军统领着N个部队.这N个部队分别驻扎在N个不同的城市. 他在用这N个部队维护着M个城市的治安.这M个城市 ...

  4. 开源APM应用性能管理工具调研

    近期在设计一个DevOps平台.希望整合一个APM工具进来,由于APM既可用于性能測试也可用于运维性能监控,是典型的Dev+Ops产品. 商业的APM工具国内外已经有不少成熟产品了,而开源的好像不多见 ...

  5. 0x14 hash

    被虐爆了 cry 我的hash是真的菜啊... poj3349 肝了一个上午心态崩了...一上午fail了42次我的天,一开始搞了个排序复杂度多了个log,而且是那种可能不同值相等的hash,把12种 ...

  6. AI安全初探——利用深度学习检测DNS隐蔽通道

    AI安全初探——利用深度学习检测DNS隐蔽通道 目录 AI安全初探——利用深度学习检测DNS隐蔽通道 1.DNS 隐蔽通道简介 2. 算法前的准备工作——数据采集 3. 利用深度学习进行DNS隐蔽通道 ...

  7. ES内存持续上升问题定位

      https://discuss.elastic.co/t/memory-usage-of-the-machine-with-es-is-continuously-increasing/23537/ ...

  8. RAC中的各种IP-PUBLIC-VIP-Private-SCAN IP

    RAC中的各种IP-PUBLIC-VIP-Private-SCAN IP   1.PUBLIC和VIP Oracle RAC中每个节点都有一个虚拟IP,简称VIP, 与公网PUBLIC  IP在同一个 ...

  9. 移动端H5页面编辑器开发实战--经验技巧篇

    很久前的写的文章了,转载下发到这里 原本地址: https://blog.csdn.net/tech_meizu/article/details/52484775

  10. POJ 2446 匈牙利算法

    题意: 思路: 二分图匹配... // by SiriusRen #include <cmath> #include <cstdio> #include <cstring ...