Log4J

在程序的开发过程中,可以使用debug打断点来调试程序,观察程序的运行情况。那代码上线之后,怎么看程序的运行情况呢?打log。

1、
程序log的几处应用:
  • 定位问题
  • 观察程序的运行状态
  • 统计
log的三大组件:
Logger:输入日志的具体内容
Appender:输出到哪里
Layout:输出日志的样式


2、打log的方式:
打log无非就是在程序中通过硬编码的方式,输出一些信息。极端点,通过system.out.print()也照样能打出信息来,为啥那搞那么复杂的日志系统呢?我个人的理解,主要是为了便于统一控制。举个栗子,不要maven,去各大网站把jar包一个个的下载下来,再导入到项目里,也一样能让程序跑起来,为啥大家不这么干呢 ?不就是为了方便和统一管理么。

3、log的level:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
举个栗子,在实例化Logger对象的时候,设置的配置级别是INFO,那么,至少要用logger.info()才能打印出来,用logger.debug()是不会进行打印的。
通常,使用Level来限制日志的输出,还有另一种方式是使用Threshold,概念上是类似的。

4、创建logger实例:
在代码中,常常会使用如下的方式获取一个logger实例,
private static final Logger LOGGER = LoggerFactory.getLogger(ProductAuditResultListener.class);
这种方式其实是使用类的全限定名来生成logger实例的,上面的代码就等价于:
private static final Logger LOGGER = LoggerFactory.getLogger("com.dianping.secondhand.service.mq.consumer.ProductAuditResultListener);
而在log4j中,也是靠名字来区分logger的层次结构的,举个栗子:
比如:名称为java的Logger就是java.util的父Logger;java.util是java.util.Collection的父Logger;Logger的体系结构和package的结构划分类似,使用.来区分;所以我们前面才说,使用类的全限定名是最简单,也是最符合logger的体系结构的命名方式。

5、root logger:
  • root logger是没有名字的
  • root logger是自动存在的
  • root logger必须设置level
  • Logger.getRootLogger()可以用来获取root logger
在log4j中,按道理说,应该为每一个logger都指定其level、appender与layout,然而log4j使用层级与继承的方式,让配置最大程度的简化,并提供了相当大的灵活性。

6、appender:
appender指的是日志的输出目的地。对于appender而言,其对parent的态度不是继承或覆盖,而是一种叠加或叫追加。它会把它所有parent的appender都追加到自身之上,这可能导致同一条log.info()语句输出好几遍。可以通过设置
additivity="false"
来禁止这种特性。

7、Layout:
Layout指明了输出的日志的格式。一般该对象是绑定在appender上的,的创建appender的时候指定。反应到XML配置文件中,就有如下的配置结构:
为root logger指定level、appender -> 在appender的声明中指定layout 

8、log4j的启动:
在整个应用启动时,就得完成log4j相应配置的读取和加载,否则log4j会告警的。至少,怎么说也得把root logger配置好[level、appender、layout]吧。在web应用中,可以通过在web.xml配置个listener

org.apache.logging.log4j.web.Log4jServletContextListener
来完成log4j的启动 

原文地址:https://www.cnblogs.com/dosmile/p/6444409.html