Bootstrap

Log4j的使用

Log4j的使用(日志处理)

一、日志

1、定义

	日志:生活中的日志是记录你生活的点点滴滴,让它把你内心的世界表露出来,更好的诠释自己
的内心世界,而电脑里的日志可以是有价值的信息宝库,也可以是毫无价值的数据泥潭
	
	ps:主要看分析能力,分析好了就能发掘宝贵的财富,发掘不好就一无所有
	
	ps:要想对日志数据发掘好就要有其他的学科了,即数据分析师:依赖大数据处理技术或者
	收费的编译语言MATLAB
	

2、JAVA中的日志

java中的日志: 是Java中程序处理运行时产生的日志数据信息
	
java中实现日志处理: 依靠第三方的jar包:log4j.jar

3、log4j/日志技术的作用

1)断点调试和记录日志是作为Java程序员所必须要具备的技能
2)后边的一些流行框架技术和互联网技术都有用到日志技术

4、log4j的特性

1)线程安全 ;

2)log4j是经过优化速度的;

3)log4j是基于一个名为记录器的层次结构;

4)log4j的支持每个记录器多输出追加器(appender);

5)log4j支持国际化;

6)log4j并不限于一组预定义的设备;

7)日志行为可以使用配置文件在运行时设置;

8)log4j设计从一开始就是处理java异常;

9)log4j有多个级别 , 通过控制这些级别可以实现将某些不想输出的信息过滤掉;

10)日志输出的格式可以通过拓展Layout类容易的改变;

11)日志输出的目标,以及在写入策略可通过实现Appender程序接口改变;

12)log4j会故障停止,然而,尽管它肯定努力确保传递,log4j不保证每个日志语句将被传递到目的地;

二、log4j的讲解

1、现在log4j分为两大版本:log4j1.x和log4j2.x,其作用都是基本一样的,只是后者使用起来更加灵活的

案例:
1)创建一个普通的java项目,且导入第三方的jar包:log4j-1.2.17.jar,且配置与之对应的源代码包
2)在src级别下创建一个名字为log4j.properties的配置文件,且设定该文件的编码格式为UTF-8
3)在log4j.properties中写入设置信息
//log4j.properties  //未变化的源代码

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =
									 [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/log.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = E://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = 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

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



ps:本例子中配置的日志信息保存的路径为为E盘的路径,要确保你的电脑中有E盘
//java代码

package com.rj.bd;

import org.apache.log4j.Logger;

public class First {
	private static Logger  logger=Logger.getLogger(First.class);
	public static void main(String[] args) {
		
		logger.info("普通的info信息");
		logger.debug("调试的debug信息");
		logger.error("报错的error信息");
		logger.warn("警告的warning信息");
		
	}

}

2、项目中配置了log4j.xml或者log4j.properties,其他地方并没有配置读取log4j配置文件,但程序运行后log4j配置文件会自动起作用,这是为什么?

这是因为通过LogManager.java类中的静态代码块自动的去寻找src目录下且名字叫log4j.properties或者log4j.xml文件
其原理是:如运行原理图

在这里插入图片描述

3、log4j的组成

1)loggers : 负责捕获记录信息;

2)appenders : 负责发布日志信息,以不同的首选目的地;

3)layouts : 负责格式化不同风格的日志信息;

4、log4j的级别大小

ALL: 各级包括自定义级别;

TRACE: 指定细粒度比DEBUG更低的信息事件;

DEBUG: 调试级别;

INFO: 表明消息在粗粒度级别上突出强调应用程序是非常有帮助的,也就是输出一些提示信息;

WARN: 输出潜在的有可能出错的情形,也就是输出警告信息;

ERROR: 指出发生的不影响系统继续运行的错误信息;

FATAL: 指出严重的错误,这些错误将会导致系统终止运行;

OFF: 为最高级别,用于关闭所有日志信息的输出;

PS: 
	1> log4j只会输出级别大于或者等于指定级别的信息 ;
    2> 虽然有这么多级别,但是在log4j.properties中配置的时候只
    是需要用到从高到低分别是 ERROR,WARN,INFO,DEBUG

5、log4j的配置文件

1)配置Logger
					//等级       等级名称
log4j.rootLogger = [ level ] , appenderName , appenderName ……

注意:  
	1>第七条中虽然了很多级别,但log4j推荐只使用四个级别,
优先级从高到低分别是ERROR , WARN , INFO , DEBUG ; 
    2>appenderName指的是日志输出的地址 , 可以同时指定n个 ;
2)配置日志输出的目的地Appender以及每个输出文件的各项属性
								/*类的路径*/
log4j.appender.appenderName = fully.qualified.name.of.appender.class
									/*某些具体的值*/
log4j.appender.appenderName.option1 = value1                             

注意 : log4j中提供的appender有以下几种 :

  1) org.apache.log4j.ConsoleAppender(控制台) ;

  2) org.apache.log4j.FileAppender(文件) ;

  3) org.apache.log4j.DailyRollingFileAppender
  (按照一定的频度滚动产生日志记录文件 , 默认每天产生一个文件) ;

  4) org.apache.log4j.RollingFileAppender
  (文件大小到达指定尺寸的时候产生一个新的文件) ;

  5) org.apache.log4j.WriterAppender(将日志信息以流格式发送到指定的位置) ;

3)配置日志信息的格式或者布局layout以及布局的各项属性
log4j.appender.appenderName.layout = fully.qualified.name.of.appender.class

log4j.appender.appenderName.layout.option1 = value

注意 : log4j中提供的layout有以下几种 :

  1) org.apache.log4j.HTMLLayout(以HTML表格形式布局); 

  2) org.apache.log4j.PatternLayout(可以灵活的指定布局模式
  	(自己指定输出的日志的格式), 但是需要配置layout.ConversionPattern属性);

  3) org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串); 

  4)org.apache.log4j.TTCCLayout(包含日志产生的时间 , 线程 , 类别等等信息);

6、控制台选项

1) log4j.appender.appenderName.Threshold = error
	用法: rootLogger里配置debug,然后某个文件专门存储error以及更高级别的错误信息,
那么就在这个配置这个文件的时候指定Threshold属性为error;

2) log4j.appender.appenderName.ImmediateFlush=true
	用法: 默认值是true , 意味着所有的消息都会被立即输出 , false则是不输出;

3) log4j.appender.appenderName.target=System.out
	用法: 默认值为System.out , 输出到控制台 , 还可以取值System.err,
当做错误信息输出 , 输出的信息全部为红色 ;

4) log4j.appender.appenderName.File=../../../../logs/log.appenderName.txt
    用法: 指定日志输出到指定位置 , 用的是相对于配置文件根目录的相对路径;

5) log4j.appender.appenderName.File.Append=true
	用法: 默认值是true,即将消息追加到指定文件中,如果取值为false,
则会覆盖之前的日志内容;

6) log4j.appender.appenderName.MaxFileSize=20MB
    用法: 后缀可以是KB , MB , GB ,当日志文件的大小到达指定大小后,将会自动滚动,
即将原来的内容移到fileName.1文件中,用记事本打开该文件即可看到原来的内容,改属性只
能在appender=org.apache.log4j.RollingFileAppender时使用;

7) log4j.appender.appenderName.MaxBackupIndex=10
    用法: 指定可以产生滚动文件的最大数量,与RollingFileAppender
和MaxFileSize属性一起使用,当MaxBackupIndex=n的时候,最大日志存在数量为n+1,
即log.txt,log.txt.1 , ... , log.txt.n,当在服务器上运行的时候,如果对日志
数量没有限制,那么随之时间的推移,日志文件会越来越多,占用的内存也将越来越多,
直到占满整个盘;

8) log4j.appender.appenderName.DatePattern='.'yyyy-MM-dd
	用法: 该属性log4j.appender.appenderName=org.apache.log4j.DailyRollingFileAppender 
时使用 , DailyRollingFileAppender默认的频度是每天产生一个日志记录文件,
可以在DatePattern属性值中指定其他的频度,常用的几个频度如下 :

     1> '.'yyyy-MM : 每月产生一个日志记录文件 ;

     2> '.'yyyy-ww : 每周产生一个日志记录文件 ;

     3> '.'yyyy-MM-dd : 每天产生一个日志记录文件 ;

     4> '.'yyyy-MM-dd-a : 每半天产生一个日志记录文件 ;

     5> '.'yyyy-MM-dd-HH : 每小时产生一个日志记录文件 ;

     6> '.'yyyy-MM-dd-HH-mm : 每分钟产生一个日志记录文件 ;

   注意: 该属性指定值之后,将会按照指定的频度来生成日志记录文件,假设指定生
成一个名为 log.txt 的文件,频度指定为每分钟产生一个日志记录文件,当达到指定
频度后,会将log.txt文件中记录的之前的日志记录,重新写入一个名为
log.txt.yyyy-MM-dd-HH-mm的文件中,而此时 log.txt 文件中存放的是新生成的
日志信息,该过程循环往复;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、 LevelRangeFilter(分级过滤器)


如果想要实现不同级别的日志分别输出到不同的位置,可以在properties配置文件
中加入如下语句进行限制,例如:
 log4j.appender.appenderName.Threshold=debug
 log4j.appender.appenderName.filter.filterName=org.apache.log4j.varia.LevelRangeFilter
 log4j.appender.appenderName.filter.filterName.LevelMin=debug
 log4j.appender.appenderName.filter.filterName.LevelMax=debug

 ps: 将最低输出级别LevelMin和最高输出级别LevelMax都设置为debug,
 那么就只能输出debug级别的日志信息了 ;
 
;