log4j日志框架

log4j日志框架

Log4j定义

Log4j是一个常用的日志框架,用于记录应用程序的执行过程或异常等记录在日志文件中,可以通过日志文件知道应用程序的操作和异常信息

补充:框架的意思

java框架的意思就是基于java这门语言封装了许多的类库,比如我们的JDBC连接数据集用最低层的java代码写需要连接至少10行,但是目前市面上提供了一些基于java这门语言封装出来的类库也叫框架,我们用框架去连接数据库可能只需要两三行代码,框架可以大大的提高我们在企业开发项目的效率,目前企业最常用的java框架有SSM(mybatis、spr ing、springMVC)框架

对于一个应用程序来说,日志记录是必不可少的一部分。线上问题追踪,基于日志的业务逻辑统计分析,用户的操作记录等都离不开日志。java领域存在的多种日志框架,目前常用的日志框架有Log4j1 , Log4j2 , Commons、Logging、SIf4j、logback、 JUl等等各种。

Log4j是Apache公司的开源项目,用于各种日志处理,在apache网站https://logging.apache.org/log4j/2.x/download.html

常用的日志框架

(1)Log4jApacheLog4j是一个基于java的日志记录工具。它是由Ceki Gülcu首创的,现在则是Apache软件基金会的一个项目。 Log4j是几种Java日志框架之一。

(2)Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品。

(3)Commons Logging Apache基金会所属的项目,是一套ava日志接口,之前叫akarta Commons Logging,后更名为Commons Logging。

(4)SI4j 类似于Commons Logging,是一套简易java日志门面,本身并无日志的实现(Simple Logging Facade for Java,缩写SIlf4j)。

(5)Logback 一套日志组件的实现SIf4阵营。

(6)Jul (Java Util Logging),自Java1.4以来的官方日志实现。

实现步骤

步骤1

导入log4j的jar包

因为log4j日志框架不是oracle公司的,不在jdk内置环境里面,如果需要用到jdk以外的其他java代码,需要将对应的jar包引入到项目中来,并且需要通过build path构建到项目中。

步骤2:

创建logger对象,根据不同的级别引来记录日志

public static void main(String[] args) {

		//创建logger对象,记录日志
		Logger logger=Logger.getLogger(Test1.class);
		logger.error( "用于记录errror级别的信息");
		logger.warn( "用于记录warn级别的信息");
		logger.info( "用于记录info级别的信息");
		logger.debug("用于记录debug级别的信息");

	}

步骤3:

配置log4j.properties配置文件

log4j.properties这个配置文件是用于log4j的框架信息,需要配置三个重要信息:

强调:; log4j.properties是在src下创建的(类路径下)

1.配置什么级别的日志可以记录在文件中
2.指定输出的目的地,是将日志记录在控制台还是磁盘中的某个文件中
3.指定输出到控制台或者文件中日志信息的输出格式,或者说以什么样子的格式记录这些日志信息
# 设置logger输出的基本及目的地和输出的格式 
#指定输出的级别和目的地(多个目的地可以用,分隔)
#(设置info级别,可以将info以及更高级别的记录到日志文件中,但其更低的比如debug级别就不会记录到日志文件中)
log4j.rootLogger=info,stdout

#指定目的地
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#指定输出日志的格式或样式
log4j.appender.stdout.Target=Sys.err
#(PatternLayout值按照我们的布局规划输出)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#(PatternLayout指定了布局规划)
log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n

日志的输出级别

日志信息的优先级从高到低一般有error、warn、info、debug,分 别用来指定这条信息的重要程度,然后通过在log4j.properties配置文件中来设置该记录什么级别的信息记录到日志文件里面去。

日志级别具体有七个,但是一般是用四个级别:

1.off最高等级。用于关闭所有日志记录

2.fatal指出每个严重的错误时间将会导致应用程序的退出

3.error指出虽然发生错误事件,但仍然不影响系统的运行

4.warn表明会出现潜在的错误情形。

级别从高到低: off>fatal>error>warn>info>debug>all
log4j建议只使用四个级别: error>warn>info>debug我们可以在这里定义日志的输出级别,可以来控制应用程序根据响应的级别来管理日志输出的开关;比如在配置文件中设置了info级别,那么只有info以及info级别更高的日志输出是可以输出到日志文件的, debug级别不够那么debug的日志信息就不会输出到日志文件中。

日志输出格式

appender用于指定日志的输出目的地、输出格式、是否拼接等。

值可以是以下的值

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

样式布局:

log4j.appender.stdout.Target=System.err
(PatternLayout值按照我们的布局规则输出)
log4j.appender.stdout.layout=org.apache.1og4j.PatternL ayout

layout的值可以选择以下的值:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(按照自定义的规则指定布局模式), 
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
(PatternLayout指定了布局规划)
log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n
%m 输出代码中指定的消息 
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
%r 输出自应用启动到输出该log信息耗费的毫秒数  
%c 输出所属的类目,通常就是所在类的全名  
%t 输出产生该日志事件的线程名  
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
log信息耗费的毫秒数  
%c 输出所属的类目,通常就是所在类的全名  
%t 输出产生该日志事件的线程名  
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”  
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921  
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%F:运行的类名
%M:method缩写 方法名

上机案例:

案例1:

设定日志级别输出到控制台

public class Test1 {
public static void main(String[] args) {
// System.out.println("用于打印信息");
//创建logger对象,记录日志
Logger logger= Logger.getLogger(Test1.class);
logger.error("用于记录errror级别的信息");
logger.warn("用于记录warn级别的信息");
logger.info("用于记录info级别的信息");
logger.debug("用于记录debug级别的信息");
}
}

log4j.properties配置文件

### 设置Logger输出的级别以及目的地和输出的格式 ###
#键值对形式存储,底层是根据键获取到你=号后面设置的值的
#指定输出级别和目的地(多个目的地可以用,分隔)
#(设置info级别,可以将info以及更高级别的记录到日志文件中,但其更低的比如debug级别就不会记录
到日志文件中)
log4j.rootLogger=info,stdout
#指定目的地(ConsoleAppender表示将日志输出到控制体)
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#指定输出日志的格式或样式 (System.err是红色样式、Sysm.out是黑色样式)
log4j.appender.stdout.Target=System.err
#(PatternLayout值按照我们的布局规则输出)
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#(PatternLayout指定了布局规则)
log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n

案例2:

将日志以文件形式输出

import java.util.InputMismatchException;
import java.util.Scanner;
import org.apache.log4j.Logger;
/**
* 需求:通过log4j日志框架将应用程序的操作记录在D:\\peng.log文件中
* @author Administrator
*
*/
public class Test1 {
//创建logger对象,记录日志
private static Logger logger= Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1=input.nextInt();
//用不同级别记录了对被除数的操作
logger.debug("debug:输入被除数"+num1);
logger.info("info:输入被除数"+num1);
System.out.println("请输入除数:");
int num2=input.nextInt();
//用不同级别记录了操作
logger.debug("debug:输入除数"+num2);
logger.info("info:输入除数"+num2);
int result=num1/num2;
//用不同级别记录了结果值
logger.debug("debug:结果:"+result);
logger.info("info:结果:"+result);
System.out.println(String.format("%d/%d=%d",num1,num2,result));
}catch (InputMismatchException e) {
e.printStackTrace();
// logger.warn("");
logger.error("没有输入正确的格式,错误信息:"+e.getMessage());
}catch (ArithmeticException e) {
e.printStackTrace();
logger.error("算术错误,错误信息:"+e.getMessage());
}catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("感谢使用本程序,程序结束!");
        }
    }
}

log4j.properties配置文件

### 设置Logger输出的级别以及目的地和输出的格式 ###
log4j.rootLogger=info,logfile
#指定目的地(ConsoleAppender表示将日志输出到控制体)
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=E:\\penglog.log
#没有使用绝对路径那就会保存在项目的根路径上创建penglog.log文件
#log4j.appender.logfile.File=penglog.log
#指定输出日志的格式或样式 (System.err是红色样式、Sysm.out是黑色样式)
log4j.appender.logfile.Target=System.err
#(PatternLayout值按照我们的布局规则输出)
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
#(PatternLayout指定了布局规则)
#log4j.appender.logfile.layout.ConversionPattern=%d %l %m %n
log4j.appender.logfile.layout.ConversionPattern=%p %d %F %M %m %n

案例3:

将日志信息分别输出到控制台和文件中

/**
* 需求:通过log4j日志框架将应用程序的操作记录在D:\\peng.log文件中
* @author Administrator
*
*/
public class Test1 {
//创建logger对象,记录日志
private static Logger logger= Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1=input.nextInt();
//用不同级别记录了对被除数的操作
logger.debug("debug:输入被除数"+num1);
logger.info("info:输入被除数"+num1);
System.out.println("请输入除数:");
int num2=input.nextInt();
//用不同级别记录了操作
logger.debug("debug:输入除数"+num2);
logger.info("info:输入除数"+num2);
int result=num1/num2;
//用不同级别记录了结果值
logger.debug("debug:结果:"+result);
logger.info("info:结果:"+result);
System.out.println(String.format("%d/%d=%d",num1,num2,result));
}catch (InputMismatchException e) {
e.printStackTrace();
// logger.warn("");
logger.error("没有输入正确的格式,错误信息:"+e.getMessage());
}catch (ArithmeticException e) {
e.printStackTrace();
logger.error("算术错误,错误信息:"+e.getMessage());
}catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("感谢使用本程序,程序结束!");
     }
   }
}
### 设置Logger输出的级别以及目的地和输出的格式 ###
log4j.rootLogger=info,stdout,logfile
########################## 将日志输出到控制台中 ################################
################ 我们真实的项目中一定是将日志保存在文件中而不是控制台,因为需要持久化保存
############
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n
########################## 将日志输出到文件中 ################################
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=E:\\pengqi1123.log
log4j.appender.logfile.Target=System.err
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
#log4j.appender.logfile.layout.ConversionPattern=%p %d %F %M %m %n
log4j.appender.logfile.layout.ConversionPattern=%p %d{yyyy-MM-dd HH:mm:ss} %F %M
%m %n

案例4:

将不同级别的日志信息保存到不同的文件中

/**
* 需求:通过log4j日志框架将应用程序的操作记录在D:\\peng.log文件中
* @author Administrator
*
*/
public class Test1 {
//创建logger对象,记录日志
private static Logger logger= Logger.getLogger(Test1.class.getName());
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入被除数:");
int num1=input.nextInt();
//用不同级别记录了对被除数的操作
logger.debug("debug:输入被除数"+num1);
logger.info("info:输入被除数"+num1);
System.out.println("请输入除数:");
int num2=input.nextInt();
//用不同级别记录了操作
logger.debug("debug:输入除数"+num2);
logger.info("info:输入除数"+num2);
int result=num1/num2;
//用不同级别记录了结果值
logger.debug("debug:结果:"+result);
logger.info("info:结果:"+result);
System.out.println(String.format("%d/%d=%d",num1,num2,result));
}catch (InputMismatchException e) {
e.printStackTrace();
// logger.warn("");
logger.error("没有输入正确的格式,错误信息:"+e.getMessage());
}catch (ArithmeticException e) {
e.printStackTrace();
logger.error("算术错误,错误信息:"+e.getMessage());
}catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("感谢使用本程序,程序结束!");
     }
  }
}
#将不同的级别输出的日志信息存放到不同的文件里面去
#将debug级别以上放到E:\\logs/info.log
#将error级别以上的放到E:\\logs/errorinfo.log
### 设置Logger输出的级别以及目的地和输出的格式 ###
log4j.rootLogger=debug,stdout,D,E
########################## 将日志输出到控制台中 ################################
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %l %m %n
########################## 根据不同日志级别输出到不同的文件中去
################################
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=E:\\logs\\info.log
#log4j.appender.D.Append=true
#指定DEBUG级别或以上的存在E:\\logs/info.log文件中
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%p %d{yyyy-MM-dd HH:mm:ss} %F %M %m %n
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=E:\\logs\\errorinfo.log
#log4j.appender.D.Append=true
#指定ERROR级别或以上的存在E:\\logs/errorinfo.log文件中
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=%p %d{yyyy-MM-dd HH:mm:ss} %F %M %m %n
上一篇:Python Turtle绘图[难度3星]:24节气倒计时(2.使用字典存储数据)


下一篇:Mybatis日志