1、简介

apache的一个开放源代码项目。

精确控制日志的输出,包括输出的格式,输出的目的地,输出的过滤(不同级别日志的输出)等。

配置简单,不需要在代码中配置环境,支持两种配置文件格式,XML和Java特性文件(键=值,常见的.properties),常用后者如 log4j.properties




2、核心组件

Log4j中有三个主要的组件,它们分别是 Logger、Appender和Layout。

Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。

Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。

Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。

Log4j中将要输出的Log信息定义了5种级别,依次为DEBUG、INFO、WARN、ERROR和FATAL,当输出时,只有级别高过配置中规定的级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码。

2.1 Logger

公共类Logger, 负责处理日志记录的大部分操作。

日志记录器(Logger)将只输出那些级别高于或等于它的级别的信息。如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。

例如在包com.foo.bar中创建一个日志记录器(Logger)并且没有设置级别,那它将会继承在包com.foo中创建的日志记录器(Logger)的级别。如果在com.foo中没有创建日志记录器(Logger)的话,那么在com.foo.bar中创建的日志记录器(Logger)将继承root日志记录器(Logger)的级别。

可以为日志指定不同的级别,级别从低到高支持以下几种:
ALL     打开所有日志
DEBUG     细粒度信息事件,对调试应用程序是非常有帮助的    
INFO     粗粒度信息事件,突出强调应用程序的运行过程    
WARN     可能出现潜在错误的情形    
ERROR     虽然发生错误事件,但仍然不影响系统的继续运行    
FATAL     指出每个严重的错误事件将会导致应用程序的退出
OFF     关闭所有日志

比较常用的Logger创建方法,就是根据类名实例化一个静态的全局日志记录器:
static Logger logger = Logger.getLogger(test.class);  
1
 
1
static Logger logger = Logger.getLogger(test.class);  

日志记录器都可以用下面方法设置级别: 
logger.setLevel((Level)Level.WARN); 
1
 
1
logger.setLevel((Level)Level.WARN); 

当然,这是代码设置的方式。我们刚才提到过,可以使用配置文件的方式进行配置,那么我们后面会提到。

2.2 Appender

公共接口Appender,负责控制日志记录操作的输出。

下面是API中提供的输出方式(常用的见红字),也可以自己实现Appender接口,创建以自己的方式进行日志输出的Appender:
ConsoleAppender 使用用户指定的布局(layout)输出日志事件到System.out或者 System.err。默认的目标是System.out
FileAppender 把日志事件写入一个文件
DailyRollingFileAppender 扩展FileAppender,因此多个日志文件可以以一个用户选定的频率进行循环日志记录
RollingFileAppender 扩展FileAppender,备份容量达到一定大小的日志文件
WriterAppender 根据用户的选择把日志事件写入到Writer或者OutputStream
SMTPAppender 当特定的日志事件发生时,一般是指发生错误或者重大错误时,发送一封邮件
SocketAppender 给远程日志服务器(通常是网络套接字节点)发送日志事件(LoggingEvent)对象
SocketHubAppender 给远程日志服务器群组(通常是网络套接字节点)发送日志事件(LoggingEvent)对象
SyslogAppender 给远程异步日志记录的后台精灵程序(daemon)发送消息
TelnetAppender 一个专用于向只读网络套接字发送消息的log4j appender

2.3 Layout

公共抽象类,负责格式化Appender的输出。

Appender必须使用一个与之相关联的 Layout,这样它才能知道怎样格式化它的输出。

log4j常见的三种类型的Layout:
HTMLLayout 格式化日志输出为HTML表格
PatternLayout 根据指定的转换模式格式化日志输出,或者如果没有指定任何转换模式,就使用默认的转换模式
SimpleLayout 以一种非常简单的方式格式化日志输出,它打印级别 Level,然后跟着一个破折号“-“ ,最后才是日志消息
 


3、配置文件的设置

3.1 根 Logger

log4j.rootLogger = [ level ] , appenderName, appenderName, ... 
1
 
1
log4j.rootLogger = [ level ] , appenderName, appenderName, ... 
  • level  优先级,ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
  • appenderName  指定日志信息输出到哪个地方。您可以同时指定多个输出目的地

3.2 某个包或类的 Logger

之前我们提到过,日志记录器(Logger)将只输出那些级别高于或等于它的级别的信息,如果没有设置日志记录器(Logger)的级别,那么它将会继承最近的祖先的级别。

假如你在配置文件中没有针对有些包或者类进行单独的级别设置,那么它会直接继承最近祖先的级别,依次往上如果都没有那么最终会继承 RootLogger 根日志记录器的级别。

配置语法如下:
log4j.logger.xxx.xxx.xxx=level
1
 
1
log4j.logger.xxx.xxx.xxx=level

这里的xxx.xxx可以是包,比如com.greejoy;也可以是具体的类,比如com.greejoy.action.LoginAction

示例:
log4j.rootLogger=WARN,A
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
6
 
1
log4j.rootLogger=WARN,A
2
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG
3

4
log4j.appender.A=org.apache.log4j.ConsoleAppender
5
log4j.appender.A.layout=org.apache.log4j.PatternLayout
6
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n

假如现在有类indiv.dulk.wechat.InitWechatServlet,此处没有配置level,默认继承到了根Logger的level,即WARN。此时如果类中有log输出语句如下:
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
1
 
1
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());

最终在控制台是不会输出的,因为INFO的等级比WARN等级低,不会输出。如果我们改下配置文件:
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk=DEBUG
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
7
 
1
log4j.rootLogger=WARN,A
2
log4j.logger.indiv.dulk=DEBUG
3
log4j.logger.com.opensymphony.xwork2.interceptor.TimerInterceptor=DEBUG
4

5
log4j.appender.A=org.apache.log4j.ConsoleAppender
6
log4j.appender.A.layout=org.apache.log4j.PatternLayout
7
log4j.appender.A.layout.ConversionPattern==%-d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n

定义了indiv.dulk包level为DEBUG,indiv.dulk.wechat.InitWechatServlet没有单独设置level,往上找最终继承indiv.dulk的level,即DEBUG,此时刚才的log输出语句就会输出在控制台上。因为INFO的等级比DEBUG的等级高。

回顾下等级大小:
ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF

需要注意的是:单独配置的类或包,都是受全局管理的,意思就是说,除了满足单独配置Logger要求的日志会输出,同时满足根配置Logger的日志也会输出。

这就给我们带来了麻烦,假如都设置在控制台输出,只是单独配置的Logger格式设定不一样,那么在控制台你会看到内容相仿的两条日志输出。

也就是说,假如我们有如下配置文件,最终会出现如下的情况:
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk.wechat=DEBUG,wechat log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n log4j.appender.wechat=org.apache.log4j.ConsoleAppender
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n
10
 
1
log4j.rootLogger=WARN,A
2
log4j.logger.indiv.dulk.wechat=DEBUG,wechat
3

4
log4j.appender.A=org.apache.log4j.ConsoleAppender
5
log4j.appender.A.layout=org.apache.log4j.PatternLayout
6
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
7

8
log4j.appender.wechat=org.apache.log4j.ConsoleAppender
9
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
10
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n
 
这显然不是我们想要的,所以需要改下配置,让指定的包不受全局管理:
log4j.rootLogger=WARN,A
log4j.logger.indiv.dulk.wechat=DEBUG,wechat #不受全局管理
log4j.additivity.indiv.dulk.wechat=false log4j.appender.A=org.apache.log4j.ConsoleAppender
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n log4j.appender.wechat=org.apache.log4j.ConsoleAppender
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n
13
 
1
log4j.rootLogger=WARN,A
2
log4j.logger.indiv.dulk.wechat=DEBUG,wechat
3

4
#不受全局管理
5
log4j.additivity.indiv.dulk.wechat=false
6

7
log4j.appender.A=org.apache.log4j.ConsoleAppender
8
log4j.appender.A.layout=org.apache.log4j.PatternLayout
9
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]-[%c] %m%n
10

11
log4j.appender.wechat=org.apache.log4j.ConsoleAppender
12
log4j.appender.wechat.layout=org.apache.log4j.PatternLayout
13
log4j.appender.wechat.layout.ConversionPattern=[%p]-[%c] %m%n
 
这样,就得到了我们想要的结果。

3.3 日志输出地址 Appender

log4j.appender.appenderName = fully.qualified.name.of.appender.class  (有资格的appender类的全名)
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.option = valueN
3
 
1
log4j.appender.appenderName = fully.qualified.name.of.appender.class  (有资格的appender类的全名)
2
log4j.appender.appenderName.option1 = value1  
3
log4j.appender.appenderName.option = valueN 

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

3.4 日志输出格式 Layout

log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.option = valueN
3
 
1
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class  
2
log4j.appender.appenderName.layout.option1 = value1  
3
log4j.appender.appenderName.layout.option = valueN  

Log4j提供的layout有以下几种:
  • org.apache.log4j.HTMLLayout(以HTML表格形式布局)
  • org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印的参数设置示例:
log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ] %m%n  
1
 
1
log4j.appender.log.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t ] %m%n  
  • %m   输出代码中指定的消息
  • %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  • %r   输出自应用启动到输出该log信息耗费的毫秒数
  • %c   输出所属的类目,通常就是所在类的全名
  • %t   输出产生该日志事件的线程名
  • %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
  • %d   输出日志时间点的日期或时间。默认格式为ISO8601,也可以在其后指定格式。比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22:10:28, 921
  • %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
 

3.5 配置示例

示例1:
### 设置###
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/error.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
24
 
1
### 设置###
2
log4j.rootLogger = debug,stdout,D,E
3

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

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

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

注意:例如 log4j.appender.log.Threshold = ERROR 表示在总控开关的前提,觉得精确,只有达到这个级别的日志才被记录到这个文件中

示例2:
#指定目录下包下的日志信息都存放到数据库
log4j.logger.database=DEBUG,oracledb log4j.appender.oracledb=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.oracledb.Driver=oracle.jdbc.driver.OracleDriver
log4j.appender.oracledb.URL=jdbc:oracle:thin:@192.168.20.92:1521:chshsid(切忌此处为sid而不是数据库名)
log4j.appender.oracledb.user=scott
log4j.appender.oracledb.password=tiger
#log4j.appender.encoding=utf-8
log4j.appender.oracledb.sql=INSERT INTO enter_ora_log4j VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m')
log4j.appender.oracledb.layout=org.apache.log4j.PatternLayout
11
 
1
#指定目录下包下的日志信息都存放到数据库 
2
log4j.logger.database=DEBUG,oracledb 
3

4
log4j.appender.oracledb=org.apache.log4j.jdbc.JDBCAppender 
5
log4j.appender.oracledb.Driver=oracle.jdbc.driver.OracleDriver 
6
log4j.appender.oracledb.URL=jdbc:oracle:thin:@192.168.20.92:1521:chshsid(切忌此处为sid而不是数据库名) 
7
log4j.appender.oracledb.user=scott 
8
log4j.appender.oracledb.password=tiger 
9
#log4j.appender.encoding=utf-8 
10
log4j.appender.oracledb.sql=INSERT INTO enter_ora_log4j VALUES ('%d{yyyy-MM-dd HH:mm:ss}', '%t', '%p', '%l', '%m') 
11
log4j.appender.oracledb.layout=org.apache.log4j.PatternLayout 

示例3:
#指定目录下的java类的日志信息都存放到该目录下
log4j.logger.com.cuigq.TestError=DEBUG,R2 log4j.appender.R2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R2.File=d:/loginfo/html.html
#log4j.appender.R2.MaxFileSize=500KB
#log4j.appender.R2.MaxBackupIndex=1
log4j.appender.R2.layout=org.apache.log4j.HTMLLayout
#log4j.appender.R2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
9
 
1
#指定目录下的java类的日志信息都存放到该目录下 
2
log4j.logger.com.cuigq.TestError=DEBUG,R2 
3

4
log4j.appender.R2=org.apache.log4j.DailyRollingFileAppender 
5
log4j.appender.R2.File=d:/loginfo/html.html 
6
#log4j.appender.R2.MaxFileSize=500KB 
7
#log4j.appender.R2.MaxBackupIndex=1 
8
log4j.appender.R2.layout=org.apache.log4j.HTMLLayout 
9
#log4j.appender.R2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 

示例4:
#指定目录下包下的日志信息都存放到该目录下
log4j.logger.cn.com.cuigq.Theard=DEBUG,R1 log4j.appender.R1=org.apache.log4j.RollingFileAppender
log4j.appender.R1.File=d:/loginfo/iamSystem1.log
log4j.appender.R1.MaxFileSize=500KB
log4j.appender.R1.MaxBackupIndex=1
log4j.appender.R1.layout=org.apache.log4j.PatternLayout
log4j.appender.R1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
9
 
1
#指定目录下包下的日志信息都存放到该目录下 
2
log4j.logger.cn.com.cuigq.Theard=DEBUG,R1 
3

4
log4j.appender.R1=org.apache.log4j.RollingFileAppender 
5
log4j.appender.R1.File=d:/loginfo/iamSystem1.log 
6
log4j.appender.R1.MaxFileSize=500KB 
7
log4j.appender.R1.MaxBackupIndex=1 
8
log4j.appender.R1.layout=org.apache.log4j.PatternLayout 
9
log4j.appender.R1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n 



4、基本使用 和 Web下的使用

4.1 基本步骤流程

4.1.1 得到日志记录器Logger

使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
public static Logger getLogger( String name)
1
 
1
public static Logger getLogger( String name)

通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName ())
1
 
1
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName ())

4.1.2 读取配置文件

当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境
PropertyConfigurator.configure (String configFilename) :读取使用Java的特性文件编写的配置文件
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件
3
 
1
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境
2
PropertyConfigurator.configure (String configFilename) :读取使用Java的特性文件编写的配置文件
3
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件

4.1.3 插入记录信息

当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
4
 
1
Logger.debug ( Object message ) ;  
2
Logger.info ( Object message ) ;  
3
Logger.warn ( Object message ) ;  
4
Logger.error ( Object message ) ;

4.2 入门使用

不详细展开描述,详见参考:

4.3 Web使用

web应用的log4j使用基本上都采用:新建一个servlet,这个servlet在init函数中为log4j执行配置,一般就是读入配置文件。

1、在web.xml中配置servlet,同时设定load-on-startup为0。配置文件位置在web.xml中配置一个param即可,路径一般是相对于web的root目录。

<servlet>
<servlet-name>InitLog4jServlet</servlet-name>
<servlet-class>indiv.dulk.wechat.init.InitLog4jServlet</servlet-class>
<init-param>
<param-name>propertiesLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
9
 
1
<servlet>
2
    <servlet-name>InitLog4jServlet</servlet-name>
3
    <servlet-class>indiv.dulk.wechat.init.InitLog4jServlet</servlet-class>
4
    <init-param>
5
        <param-name>propertiesLocation</param-name>
6
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
7
    </init-param>
8
    <load-on-startup>0</load-on-startup>
9
</servlet>

2、这个servlet配置log4j就是读出配置文件,然后调用configure函数。这里有两个问题:一、需要知道文件在哪里;二、需要正确的文件类型(文件类型一般有两种,一个是Java的property文件,另一种是xml文件)

public class InitLog4jServlet extends HttpServlet{

    /**
* Servlet初始化的执行方法,用以加载log4j配置文件
*
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println("*** Log4jInitServlet正在初始化log4j日志设置信息 ***");
String log4jLocation = getInitParameter("propertiesLocation"); if (log4jLocation == null) {
System.err.println("*** 没有找到log4j的properties配置文件,使用缺省log4j环境初始化 ***");
BasicConfigurator.configure();
} else {
String webAppPath = getServletContext().getRealPath("/");
String log4jRealLocation = webAppPath + log4jLocation;
File log4jFile = new File(log4jRealLocation);
if (log4jFile.exists()) {
System.out.println("*** 使用" + log4jRealLocation + "进行log4j环境初始化 ***");
PropertyConfigurator.configure(log4jRealLocation);
} else {
System.err.println("*** " + log4jRealLocation + "文件未找到,使用缺省log4j环境初始化 ***");
BasicConfigurator.configure();
}
}
}
}
29
 
1
public class InitLog4jServlet extends HttpServlet{
2

3
    /**
4
     * Servlet初始化的执行方法,用以加载log4j配置文件
5
     *
6
     * @throws ServletException
7
     */
8
    @Override
9
    public void init() throws ServletException {
10
        System.out.println("*** Log4jInitServlet正在初始化log4j日志设置信息 ***");
11
        String log4jLocation = getInitParameter("propertiesLocation");
12

13
        if (log4jLocation == null) {
14
            System.err.println("*** 没有找到log4j的properties配置文件,使用缺省log4j环境初始化 ***");
15
            BasicConfigurator.configure();
16
        } else {
17
            String webAppPath = getServletContext().getRealPath("/");
18
            String log4jRealLocation = webAppPath + log4jLocation;
19
            File log4jFile = new File(log4jRealLocation);
20
            if (log4jFile.exists()) {
21
                System.out.println("*** 使用" + log4jRealLocation + "进行log4j环境初始化 ***");
22
                PropertyConfigurator.configure(log4jRealLocation);
23
            } else {
24
                System.err.println("*** " + log4jRealLocation + "文件未找到,使用缺省log4j环境初始化 ***");
25
                BasicConfigurator.configure();
26
            }
27
        }
28
    }
29
}

3、完成设置后在其他类中就可以获取Logger来进行日志打印
public class InitWechatServlet extends HttpServlet{
private static Logger log = Logger.getLogger(InitWechatServlet.class); /**
* 刷新的间隔时间(单位:毫秒),默认为1h,可以在web.xml自定义配置
*/
private long period = 3600000; /**
* 时间间隔时需要执行的任务内容
*/
private TimerTask timerTask = new TimerTask() {
@Override
public void run() {
//获取最新的access_token并设定到WeChatAPI类中的静态属性中去
WechatAPI.setAccessToken(WechatUtil.getNewAccessToken());
log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
}
};
}
x
 
1
public class InitWechatServlet extends HttpServlet{
2
    private static Logger log = Logger.getLogger(InitWechatServlet.class);
3

4
    /**
5
     * 刷新的间隔时间(单位:毫秒),默认为1h,可以在web.xml自定义配置
6
     */
7
    private long period = 3600000;
8

9
    /**
10
     * 时间间隔时需要执行的任务内容
11
     */
12
    private TimerTask timerTask = new TimerTask() {
13
        @Override
14
        public void run() {
15
            //获取最新的access_token并设定到WeChatAPI类中的静态属性中去
16
            WechatAPI.setAccessToken(WechatUtil.getNewAccessToken());
17
            log.info("微信accessToken刷新 " + WechatAPI.getAccessToken());
18
        }
19
    };
20
}



5、参考链接



log4j的基本使用和参数设定的更多相关文章

  1. 编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]

    前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...

  2. I.MX6 bootargs 内核参数设定

    /******************************************************************** * I.MX6 bootargs 内核参数设定 * 说明: ...

  3. 解决JDeveloper运行慢的设置/BPM/SOA Server JVM参数设定

    最近在使用 Jdeveloper 10.1.3.3 版本时发现速度奇慢无比,后经Google,发现如下解决方案:在 jdev.conf 文件的末尾加上如下两行,速度即可得到显着的提高, jdev.co ...

  4. jmeter压测参数设定(转)

    jmeter压测参数设定 一.基本公式 线程数 = QPS * time: 注:QPS--每秒完成请求的个数:time--每个请求响应完成平均需要时间: 故QPS * time就是所有请求完成响应所需 ...

  5. Unity3d之树木创建的参数设定

    Unity3d之树木创建的参数设定 通常Unity3d创建树木经常会创建出很多奇葩的种类=_=,以下是创建出比较正常树木的基本参数 1:> 基本树干形状建立: 选择根建立分枝干设置分支干Di ...

  6. 编写高质量代码改善C#程序的157个建议——建议34:为泛型参数设定约束

    建议34:为泛型参数设定约束 “约束”这个词可能会引起歧义,有些人肯能认为对泛型参数设定约束是限制参数的使用,实际情况正好相反.没有“约束”的泛型参数作用很有限,倒是“约束”让泛型参数具有了更多的行为 ...

  7. haproxy代理配置段参数设定

    代理配置段:有四个配置段 default:设定默认参数, frontenf:前端服务器的设定 backend:后端服务器的设定 listening:是设定前端和后端一一对应的设定 参数: 1bind: ...

  8. ANdroid手机屏幕反横向等参数设定

    经过我一番百度和看Android文档,我才发现,Android对旋转屏,特别是只有横屏或者竖屏虽重力旋转的支持是到Android4.3.1才有完美支持的 unspecified - 默认值,由系统选择 ...

  9. log4j 文档

    log4j中文文档  中文详细教程 log4j中文文档   这篇文章描述了Log4j的API.独一无二的特色和设计原理.Log4j是一个聚集了许多作者劳动成果的开源软件项目.它允许开发人眼以任意的粒度 ...

随机推荐

  1. visual studio code 调试nodejs 配置简单HTTP服务器

    介绍 Visual Studio Code是一个轻量级的Web集成开发环境on Linux,Mac and Windows,特别是作为前端人员来了, 多了一个可供选择的生产力工具IDE,调试js代码简 ...

  2. canvas自适应圆形时钟绘制

    前面的话 前面介绍过canvas粒子时钟的绘制,本文将详细介绍canvas自适应圆形时钟绘制 效果演示 最终自适应圆形时钟的效果如下所示 功能分析 下面来分析一下该圆形时钟的功能 [1]静态背景 对于 ...

  3. 再起航,我的学习笔记之JavaScript设计模式14(桥接模式)

    桥接模式 桥接模式(Bridge): 在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦 从定义上看桥接模式的定义十分难以理解,那么我们来通过示例来演示什么是桥接模式. 现在我们需要做一个导航 ...

  4. 在fetch方法中添加header后遇到的预检请求问题

    今天在使用fetch方法 fetch('xxx.com',{header:{bbbbbbb:111}}) 浏览器返回的请求信息中,header变成了 :authority:koss.nocorp.me ...

  5. 线性代数-矩阵-【1】矩阵汇总 C和C++的实现

    矩阵的知识点之多足以写成一本线性代数. 在C++中,我们把矩阵封装成类.. 程序清单: Matrix.h//未完待续 #ifndef _MATRIX_H #define _MATRIX_H #incl ...

  6. Java的常用操作符

    操作符用于接受一个或多个参数,并生成一个新的值.加号和一元的正号(+).减号和一元的负号(一).乘号(*).除号(/)以及赋值号(=)的用法和大多数编程语言都类似. 操作符作用于操作数,生成一个新值. ...

  7. K/3 WISE V14.3官方原版云盘下载地址及培训PPT

    电梯直达 楼主    发表于 15 分钟前 | 只看该作者    查看 : 10|回复 : 0 金蝶K/3 WISE打造企业"智造力",为企业财务管理决策提供全方位信息,产.供.销 ...

  8. SQL Server 的锁定和阻塞

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  9. FTP的主动和被动模式详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp25 主动模式FTP与被动模式FTP该如何选择 一.主动模式的实现与特点. ...

  10. 算法学习:Pac-Man的简单对抗

    Pacman项目是加州大学伯克利分校提供的一个可视化的AI学习平台.其主体利用python完成.该项目提供了丰富的说明文档,以及预先实现了一些简单的算法供参考各接口的使用. http://ai.ber ...