Javalog4j详细教程
⼀:Log4j⼊门简介学习
Log4j是Apache的⼀个开放源代码项⽬,通过使⽤Log4j,我们可以控制⽇志信息输送的⽬的地是控制台、⽂件、GUI组件、甚⾄是套接⼝服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每⼀条⽇志的输出格式;通过定义每⼀条⽇志信息的级别,我们能够更加细致地控制⽇志的⽣成过程。最令⼈感兴趣的就是,这些可以通过⼀个配置⽂件来灵活地进⾏配置,⽽不需要修改应⽤的代码。
此外,通过Log4j其他语⾔接⼝,您可以在C、C++、.Net、PL/SQL程序中使⽤Log4j,其语法和⽤法与在Java程序中⼀样,使得多语⾔分布式系统得到⼀个统⼀⼀致的⽇志组件模块。⽽且,通过使⽤各种第三⽅扩展,您可以很⽅便地将Log4j集成到J2EE、JINI甚⾄是SNMP应⽤中。
⼆、⼊门实例
1.新建⼀个JAva⼯程,导⼊包log4j-1.
2.17.jar,整个⼯程最终⽬录如下
2、src同级创建并设置log4j.properties
### 设置###
### 输出信息到控制抬 ###
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
3、设置⽇志内容
package com.mucfc;
import org.apache.log4j.Logger;
/**
*@author linbingwen
*@2015年5⽉18⽇9:14:21
*/
public class Test {
private static Logger logger = Logger(Test.class);
/**
* @param args
*/
public static void main(String[] args) {
// System.out.println("This is println message.");
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
/
/ 记录error级别的信息
<("This is error message.");
}
}
4、输出结果
(1)⾸先是控制台的信息
(2)再来看输出的⽂件
内容如下,发现已按照要求输出到对应的⽂档中去了。
三、Log4j基本使⽤⽅法
Log4j由三个重要的组件构成:⽇志信息的优先级,⽇志信息的输出⽬的地,⽇志信息的输出格式。⽇志信息的优先级从⾼到低有ERROR、WARN、 INFO、DEBUG,分别⽤来指定这条⽇志信息的重要
程度;⽇志信息的输出⽬的地指定了⽇志将打印到控制台还是⽂件中;⽽输出格式则控制了⽇志信息的显⽰内容。
2.1、定义配置⽂件
其实您也可以完全不使⽤配置⽂件,⽽是在代码中配置Log4j环境。但是,使⽤配置⽂件将使您的应⽤程序更加灵活。Log4j⽀持两种配置⽂件格式,⼀种是XML格式的⽂件,⼀种是Java特性⽂件(键=值)。下⾯我们介绍使⽤Java特性⽂件做为配置⽂件的⽅法:
1.配置根Logger,其语法为:
其中,level 是⽇志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使⽤四个级别,优先级从⾼到低分别是ERROR、WARN、INFO、DEBUG。通过在这⾥定义的级别,您可以控制到应⽤程序中相应级别的⽇志信息的开关。⽐如在这⾥定义了INFO级别,则应⽤程序中所有DEBUG级别的⽇志信息将不被打印出来。 appenderName就是指B⽇志信息输出到哪个地⽅。您可以同时指定多个输出⽬的地。
2.配置⽇志信息输出⽬的地Appender,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
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.配置⽇志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以e⼏种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含⽇志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含⽇志产⽣的时间、线程、类别等等信息)
Log4J采⽤类似C语⾔中的printf函数的打印格式格式化⽇志信息,打印参数如下: %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)
2.2、在代码中使⽤Log4j
1.得到记录器
使⽤Log4j,第⼀步就是获取⽇志记录器,这个记录器将负责控制⽇志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器,如果必要的话,则为这个名字创建⼀个新的记录器。Name⼀般取本类的名字,⽐如:
static Logger logger = Logger ( Name () )
2.读取配置⽂件
当获得了⽇志记录器之后,第⼆步将配置Log4j环境,其语法为:
3.插⼊记录信息(格式化⽇志信息)
当上两个必要步骤执⾏完毕,您就可以轻松地使⽤不同优先级别的⽇志记录语句插⼊到您想记录⽇志的任何地⽅,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
< ( Object message ) ;
2.3、⽇志级别
每个Logger都被了⼀个⽇志级别(log level),⽤来控制⽇志信息的输出。⽇志级别从⾼到低分为:
A:off 最⾼等级,⽤于关闭所有⽇志记录。
B:fatal 指出每个严重的错误事件将会导致应⽤程序的退出。
C:error 指出虽然发⽣错误事件,但仍然不影响系统的继续运⾏。
D:warm 表明会出现潜在的错误情形。
E:info ⼀般和在粗粒度级别上,强调应⽤程序的运⾏全程。
F:debug ⼀般⽤于细粒度级别上,对调试应⽤程序⾮常有帮助。
G:all 最低等级,⽤于打开所有⽇志记录。
上⾯这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使⽤4个级别,优先级从⾼到低分别是error,warn,info和debug。通过使⽤⽇志级别,可以控制应⽤程序中相应级别⽇志信息的输出。例如,如果使⽤b了info级别,则应⽤程序中所有低于info级别的⽇志信息(如debug)将不会被打印出来。
四、Web项⽬中使⽤Log4j实例
上⾯代码描述了Log4j的简单应⽤,其实使⽤Log4j也就是这样简单⽅便。当然除了上⾯的配置⽅法,还有其它,⽐如做⼀个J2EE应⽤,在J2EE应⽤使⽤Log4j,必须先在启动服务时加载Log4j的配置⽂件进⾏初始化,可以在l中进⾏。
1、web应⽤的log4j使⽤基本上都采⽤:新建⼀个servlet,这个servlet在init函数中为log4j执⾏配置。⼀般就是读⼊配置⽂件。所以需要在l中为这个servlet配置,同时设定load-on-startup为1。
2、这个servlet配置log4j就是读出配置⽂件,然后调⽤configure函数。这⾥有两个问题:⼀、需要知道⽂件在哪⾥;⼆、需要正确的⽂件类型
3、配置⽂件位置在l中配置⼀个param即可,路径⼀般是相对于web的root⽬录
4、⽂件类型⼀般有两种,⼀个是Java的property⽂件,另⼀种是xml⽂件
配置⽂件的⼤致内容:log4j可以指定输出的log级别的最低等级,以及log的输出配置格式,每个log可以指定多个输出⽅式
(1)创建Web⼯程,整个⼯程最后⽬录如下
(2)l配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="java.sun/xml/ns/javaee"
xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>LogLearning</display-name>
<servlet>
<servlet-name>Log4JTestServlet</servlet-name>
<servlet-class>com.mucfc.Log4JTestServlet</servlet-class>
</servlet>
<!--⽤来启动 log4jConfigLocation的servlet -->
<servlet>
<servlet-name>Log4JInitServlet</servlet-name>
<servlet-class>com.mucfc.Log4JInitServlet</servlet-class>
<init-param>
<param-name>log4j-properties-location</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Log4JTestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
(3)配置⽂件log4j.properties
### set log levels ###
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
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = F://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
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =F://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
(4)web容器⼀来就初始化的servlet
Log4JInitServlet.java
package com.mucfc;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
/**
* Servlet implementation class Log4JInitServlet
*/
@WebServlet("/Log4JInitServlet")
public class Log4JInitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Log4JInitServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("Log4JInitServlet 正在初始化 log4j⽇志设置信息");
String log4jLocation = InitParameter("log4j-properties-location");
ServletContext sc = ServletContext();
if (log4jLocation == null) {
} else {
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
File yoMamaYesThisSaysYoMama = new File(log4jProp);
if (ists()) {
System.out.println("使⽤: " + log4jProp+"初始化⽇志设置信息");
} else {简单的java游戏代码
}
}
super.init(config);
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub
}
}
调⽤⽇志Log4JTestServlet,java
package com.mucfc;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
/**
* Servlet implementation class Log4JTestServlet
*/
@WebServlet("/Log4JTestServlet")
public class Log4JTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger(Log4JTestServlet.class);
/**
* @see HttpServlet#HttpServlet()
*/
public Log4JTestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
<("This is error message.");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response);
}
}
接下来就是运⾏了,来看看结果:
输出结果:
五、Spring中使⽤Log4j
这⾥要实现web项⽬中利⽤Spring来使⽤Log4j
(1)接上⾯的⼯程,然后再导⼊Spring的包
(2)l增加
<!-- 设置根⽬录 -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value&</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<!-- 3000表⽰开⼀条watchdog线程每60秒扫描⼀下配置⽂件的变化;这样便于⽇志存放位置的改变 -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>3000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
整个内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="java.sun/xml/ns/javaee"
xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>LogLearning</display-name>
<servlet>
<servlet-name>Log4JTestServlet</servlet-name>
<servlet-class>com.mucfc.Log4JTestServlet</servlet-class>
</servlet>
<!--⽤来启动 log4jConfigLocation的servlet -->
<!-- <servlet>
<servlet-name>Log4JInitServlet</servlet-name>
<servlet-class>com.mucfc.Log4JInitServlet</servlet-class>
<init-param>
<param-name>log4j-properties-location</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>-->
<servlet-mapping>
<servlet-name>Log4JTestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<!-- Spring 容器加载 -->
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>l</param-value>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论