log4j
来源:互联网 发布:i3-2350m编程好用吗 编辑:程序博客网 时间:2024/05/22 05:06
1、什么是log4j
Log4j是Apache为Java提供的日志管理工具。Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2Log4j核心概念
Log4j中有三大组件:日志器(Logger)、日志输出目标(Appender)、格式化器(Layout)
l Logger:用来输出日志消息的类,它可以输出不同级别的消息,例如错误消息、警告消息等;
l Appender;通常我们希望日志输出到文件中,以及控制台,也可能希望日志输出数据库,该类就表示一个输出的目标;
Layout:对输出的消息进行格式化,例如在消息中添加日期,以及级别等。
3、Demo
public class Demo {
static Logger log = Logger.getLogger(Demo.class.getName());
static {
Appender appender = new ConsoleAppender(new SimpleLayout());
BasicConfigurator.configure(appender);
}
@Test
public void fun() {
log.info("hello log4j!");
}
}
Logger
1 日志级别
在Log4j中日志消息分为五个级别,级别由高到低排列如下:
FATAL:重大错误,例如系统崩溃;
ERROR:错误,例如某模块瘫痪;
WARN:警告,程序的隐患,如果不处理,将来可能就是错误;
INFO:信息,可以用来查看程序执行的流程;
DEBUG:调试,用来调试程序的bug。
我们可以使用日志器输出这五种不同的日志,然后通过设置日志器的级别来控制输出的结果。来看下面的代码:
public void fun() {
log.setLevel(Level.ERROR);
log.debug("hello log4j!");
log.info("hello log4j!");
log.warn("hello log4j!");
log.error("hello log4j!");
log.fatal("hello log4j!");
}
上面代码中,只有error()和fatal()两个方法的输出会完成,其他级别的输出都不会完成。
因为设置日志器的级别为Level.ERROR后,只有高于ERROR级别的日志才能输出。
2 日志器名称
在创建日志器时,需要给日志器指定一个名称:Logger log = Logger.getLogger(“hello”);
日志器的名称不只是一个名称而已,日志器的名称说明了日志器之间的父子关系。子日志器会继承父日志器的Appender和Level。
日志器的父子关系是通过日志器的名称来决定的,例如名称为cn.itcast的日志器是cn.itcast.logger的日志器的爸爸。
cn.itcast.logger会继承cn.itcast的Appender以及Level。
public void fun() {
Logger log = Logger.getLogger("cn.itcast");
Appender appender = new ConsoleAppender(new SimpleLayout());
BasicConfigurator.configure(appender);
log.setLevel(Level.ERROR);
Logger log1 = Logger.getLogger("cn.itcast.logger");
log1.debug("看不见!");
}
通常我们创建日志器都是使用当前类的名称来创建:
Logger log = Logger.getLogger(Demo.class.getName());
这样我们可以通过配置父日志器来改变日志器的Appender和Level。
配置文件
1log4j配置概述
log4j有两种配置文件,log4j.properties和log4j.xml。因为log4j是比较简单的组件,所以建议使用log4j.properties。
如果你把log4j放到项目的src下(即放到classes下),并且命名为log4j.properties,那么log4j会自动加载这个配置文件,这也是我们最为常用的方式。
2 根日志器
在配置文件中,需要配置名为log4j.rootLogger的日志器,它就是根日志器。
其他的日志器都是根日志器的子日志器,会继承根日志器的发送器,以及级别等。
log4j.properties配置文件内容:
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
其中
log4j.rootLogger表示根日志器,DEBUG是指定根日志器的输出级别,只要大于等于DEBUG级别的日志就可以输出。stdoutA1是说明发送器(Appender)的名称;
log4j.appender.stdout表示发送器,org.apache.log4j.ConsoleAppender表示发送器为控制台发送器,即输出结果在控制台上显示;
log4j.appender.stdout.layout表示stdout这个发送器的格式化器,org.apache.log4j.PatternLayout表示简化格式化器。
3 其他日志器
当然,也可以去配置其他的日志器,语法如下:
log4j.rootLogger=DEBUG,stdout
log4j.logger.cn.itcast=WARN,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
我们不只配置了一个根日志器,还配置了一个名称为cn.itcast的日志器。继承关系你是懂得对吧。
所有日志器如果名称是以cn.itcast前缀的,那么都会继承上面的配置,如果不是,那么继承的就是root日志器了。
Appender
1、Appender概述
Appender是用来指定输出目标的类,你可以叫它发送器。上面我们使用的ConsoleAppender就是用来向控制台输出的发送器。常用的发送器有:
l ConsoleAppender:向控制台输出日志;
l FileAppender:向文件输出日志
l DailyRollingFileAppender:向文件输出日志,每天一个日志文件;
l RollingFileAppender:向文件输出日志,当文件大小达到指定大小后,生成新文件;
2、ConsoleAppender
ConsoleAppender的目标是控制台!这也不多做解释
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
3、FileAppender
FileAppender的目标是磁盘文件
log4j.rootLogger=DEBUG,stdout
#指定stdout发送器的类型为FileAppender
log4j.appender.stdout=org.apache.log4j.FileAppender
#指定stdout发送器的目标文件为log.txt
log4j.appender.stdout.File=log.txt
#定追加方式为true,即不会覆盖原有日志信息。默认即为true,所以可以不给出这个配置
log4j.appender.stdout.Append=true
#指定发送器的格式化器为简单格式化器
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
4、RollingFileAppender
RollingFileAppender是FileAppender的子类,它的作用是当日志文件大小超出文件大小大限时,会把日志文件转换成备份文件,然后再生成一个新的日志文件。
例如日志文件名为log.txt,设置文件大小上限为1KB,当log.txt文件的大小超出了1KB后,把log.txt的名称转换成log.txt.1,然后再生成一个log.txt,新的日志会写入到新的log.txt文件中。
当log.txt的大小再次达到1KB时,把log.txt.1名称修改成log.txt.2,把log.txt修改成log.txt.1,然后再生成一个新的log.txt文件。
还可以设置文件的个数,当设置备份文件的个数为3时,表示最多可以有3个文件。当文件达到3后,再次达到1KB时,那么会删除最后一个文件。
例如当前已经存在log.txt、log.txt.1、log.txt.2,这时如果log.txt又达到了1KB时,那么删除log.txt.2,然后把log.txt.1修改成log.txt.2,再把log.txt修改成log.txt.1,然后再创建log.txt文件。
log4j.rootLogger=DEBUG,stdout
#指定stdout发送器的类型
log4j.appender.stdout=org.apache.log4j.RollingFileAppender
#指定stdout发送器的目标文件
log4j.appender.stdoutFILE.File=log.txt
#指定文件大小上限为1KB
log4j.appender.stdout.MaxFileSize=1KB
#指定多少个日志文件
log4j.appender.stdout.MaxBackupIndex=3
#指定格式化器类型
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5、DailyRollingFileAppender
DailyRollingFileAppender会根据设定的时间频率生成备份文件。
当时间频率为yyyy-MM:按月生成备份文件;
当时间频率为yyyy-ww:按周生成备份文件;
当时间频率为yyyy-MM-dd:按天生成备份文件;
当时间频率为yyyy-MM-dd-a:每天生成两次备份;
当时间频率为yyyy-MM-dd-HH:按小时生成备份文件;
当时间频率为yyyy-MM-dd-HH-mm:按分钟生成备份文件。
log4j.rootLogger=DEBUG,stdout
#指定stdout发送器的类型
log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
#指定stdout发送器的目标文件
log4j.appender.stdout.File=log.txt
#指定A1发送器的时间频率为每天生成一个备份文件。时间频率也是备份文件的后缀名,例如:log.txt.2013-05-06,如果没有给出’.’,那么就是log.txt2013-05-06
log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
Layout
1、Layout种类
我们需要给发送器指定格式化器,这样发送器就可以按照格式化器指定的格式来输出日志信息了。我们刚刚一直都在使用SimpleLayout格式化器,而我们常用的格式化器是PatternLayout!
2PatternLayout
可以为PatternLayout指定一个模板,发送器会按模板来输出日志信息。例如模板为:hello: %m,其中%m是一个模式字符,下面介绍一下模式字符:
%m:信息本身;
%c:日志器的名称;
%d:日期,还可以指定日期的格式,例如:%d{yyyy-MM-dd HH:mm:ss};
%p:日志级别;
%n:换行;
%t:当前线程;
%l:输出日志的Java类相关信息。
在web项目中的配置
log4j.rootLogger=INFO,c1, f1
log4j.appender.c1=org.apache.log4j.ConsoleAppender
log4j.appender.c1.layout=org.apache.log4j.PatternLayout
log4j.appender.c1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n
#定tomcat的logs目录存放日志文件,如果希望存放到项目目录下,可以使用绝对路径。
log4j.appender.f1.File=${catalina.home}/logs/myproject.txt
log4j.appender.f1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.f1.layout=org.apache.log4j.PatternLayout
log4j.appender.f1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n
- log4j
- log4j
- log4j
- log4j
- log4j
- log4j
- log4j
- Log4J
- Log4j
- log4j
- log4j
- Log4j
- Log4j
- log4j
- Log4J
- log4j
- Log4j
- Log4J
- 数据结构实验之二叉树的建立与遍历
- for...in和for...of循环以及forEach方法
- oracle数据库之初步(3)
- 小甲鱼数据结构教学视频(百度网盘)
- 递归求各种组合情况
- log4j
- eclipse rcp程序No application id has been found错误
- NOIP2016Day2T1组合数问题洛谷p2822解题报告
- 用微信小程序开店之五——小程序组件1:“视图容器”
- Nginx 功能展示实验
- 神经网络中epoch, iteration, batchsize相关理解和说明
- Native Hibernate与Hibernate JPA实现的区别及其分析
- leetcode--Merge Intervals
- python面向对象