`
2277259257
  • 浏览: 498934 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Log4j-----application应用和web应用的操作

 
阅读更多

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以

控制日志信息输送的目的地控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;

控制每一条日志的输出格式

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程

最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

 

通过Log4j其他语言接口,您可以在CC++.NetPL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EEJINI甚至是SNMP应用中。

 

Log4j应用:

第一步

加入log4j-1.2.8.jar(可以选择log4j的更高版本)到lib下。

第二步

在CLASSPATH下建立log4j.properties内容如下(数字为行号):
1 log4j.rootCategory=INFO, stdout , R
2
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
6
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
8 log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
9 log4j.appender.R.layout=org.apache.log4j.PatternLayout
10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
11
12 log4j.logger.com.neusoft=DEBUG
13 log4j.logger.com.opensymphony.oscache=ERROR
14 log4j.logger.net.sf.navigator=ERROR
15 log4j.logger.org.apache.commons=ERROR
16 log4j.logger.org.apache.struts=WARN
17 log4j.logger.org.displaytag=ERROR
18 log4j.logger.org.springframework=DEBUG
19 log4j.logger.com.ibatis.db=WARN
20 log4j.logger.org.apache.velocity=FATAL
21
22 log4j.logger.com.canoo.webtest=WARN
23
24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
25 log4j.logger.org.hibernate=DEBUG
26 log4j.logger.org.logicalcobwebs=WARN

第三步

在要输出日志的类中加入相关语句:
1、导入所有需的commons-logging类:
     import org.apache.commons.logging.Log;
     import org.apache.commons.logging.LogFactory;
2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:
定义属性:static Logger logger = Logger.getLogger(LogDemo.class); //LogDemo为相关的类
                 或 private final Log log = LogFactory.getLog(getClass());
3、使用org.apache.commons.logging.Log类的成员方法输出日志信息:
     if (logger.isDebugEnabled()){  logger.debug(“111.”);}
     if (log.isInfoEnabled()){log.info("222");}
     if (log.isWarnEnabled()){log.warn("333");}
     if (log.isErrorEnabled()){log.error("444");}

     if (log.isFatalEnabled()){log.fatal("555");}

 第二步详解:

Log4j支持两种配置文件格式,一种是XML标准通用标记语言下的一个应用)格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法:

 

①、配置根Logger
Logger 负责处理日志记录的大部分操作。
其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
②、配置日志信息输出目的地 Appender
Appender 负责控制日志记录操作的输出。
其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN
这里的appenderName为在①里定义的,可任意起名。
其中,Log4j提供的appender有以下几种
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

 

③、配置日志信息的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息

格式化日志信息

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%M 输出打印该条日志的方法名
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”;
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;
%l 输出日志事件的发生位置,及在代码中的行数

 

 定义及获取不同层次的记录器:

1) 在配置文件中定义相应的记录器。

  定义根记录器的格式:log4j.rootLogger = [ level ], appendName1, appendName2, …appendNameN

  定义一个非根记录器的格式:log4j.logger.loggerName1 = [ level ], appendName1,…appendNameN

  可以定义任意个非根记录器

2) 在代码中调用Logger类的取得记录器方法取得相应的记录器对象

  取得根记录器对象可通过Logger.getRootLogger()函数,要取得非根记录器可通过Logger.getLogger()函数

 

例子:

package TestLog4j;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Priority;
import TestLog4j.TestLog4j2.TestLog4j2;
public class TestLog4j {
static Logger logger = Logger.getLogger(TestLog4j.class.getName()); 
public TestLog4j(){}
public static void main(String[] args) {
//同时输出到控制台和一个文件的实例并实现了Logger的继承
PropertyConfigurator.configure("F:\\nepalon\\log4j2.properties");
logger.debug("Start of the main() in TestLog4j");
logger.info("Just testing a log message with priority set to INFO");
logger.warn("Just testing a log message with priority set to WARN");
logger.error("Just testing a log message with priority set to ERROR");
logger.fatal("Just testing a log message with priority set to FATAL");
logger.log(Priority.WARN, "Testing a log message use a alternate form");
logger.debug(TestLog4j.class.getName());
TestLog4j2 testLog4j2 = new TestLog4j2(); //(1)
testLog4j2.testLog();
}
}
在类TestLog4j中我们调用了另一个类TestLog4j2,下面看一下类TestLog4j2的代码。
例4-b:
package TestLog4j.TestLog4j2;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Priority;
public class TestLog4j2 {
static Logger logger = Logger.getLogger(TestLog4j2.class.getName()); //(1)
public TestLog4j2(){}
public void testLog() {
//同时输出到控制台和一个文件的实例
PropertyConfigurator.configure("F:\\nepalon\\log4j2.properties");
logger.debug("2Start of the main()");
logger.info("2Just testing a log message with priority set to INFO");
logger.warn("2Just testing a log message with priority set to WARN");
logger.error("2Just testing a log message with priority set to ERROR");
logger.fatal("2Just testing a log message with priority set to FATAL");
logger.log(Priority.DEBUG, "Testing a log message use a alternate form");
logger.debug("2End of the main()");
}
}
配置文件log4j2.properties:
#1区
#### Use two appenders, one to log to console, another to log to a file
log4j.rootLogger = debug, stdout,R
#2区
#Print only messages of priority WARN or higher for your category
log4j.logger.TestLog4j= , R
log4j.logger.TestLog4j.TestLog4j2=WARN
#3区
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#4区
#### Second appender writes to a file
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=F:\\nepalon\\classes\\TestLog4j\\example.log
# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
运行结果:
在控制台中的结果为:
DEBUG [main] (?:?) - Start of the main() in TestLog4j
INFO [main] (?:?) - Just testing a log message with priority set to INFO
WARN [main] (?:?) - Just testing a log message with priority set to WARN
ERROR [main] (?:?) - Just testing a log message with priority set to ERROR
FATAL [main] (?:?) - Just testing a log message with priority set to FATAL
WARN [main] (?:?) - Testing a log message use a alternate form
DEBUG [main] (?:?) - TestLog4j.TestLog4j
WARN [main] (?:?) - 2Just testing a log message with priority set to WARN
ERROR [main] (?:?) - 2Just testing a log message with priority set to ERROR
FATAL [main] (?:?) - 2Just testing a log message with priority set to FATAL
输出文件的结果为:
2003-12-19 04:19:44:DEBUG main TestLog4j.TestLog4j - Start of the main() in TestLog4j
2003-12-19 04:19:44:INFO main TestLog4j.TestLog4j - Just testing a log message with priority set to INFO
2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j - Just testing a log message with priority set to WARN
2003-12-19 04:19:44:ERROR main TestLog4j.TestLog4j - Just testing a log message with priority set to ERROR
2003-12-19 04:19:44:FATAL main TestLog4j.TestLog4j - Just testing a log message with priority set to FATAL
2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j - Testing a log message use a alternate form
2003-12-19 04:19:44:DEBUG main TestLog4j.TestLog4j - TestLog4j.TestLog4j
2003-12-19 04:19:44:WARN main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to WARN
2003-12-19 04:19:44:ERROR main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to ERROR
2003-12-19 04:19:44:FATAL main TestLog4j.TestLog4j2.TestLog4j2 - 2Just testing a log message with priority set to FATAL
1) 在1区中定义了一个根记录器。这个根记录器具有DEBUG级别并有一个名称为stdout的输出端appender。
2) 2区中的内容是这一节的重点,也是应用到记录器层次的地方,但其实也只有两句,充分体现了log4j的简单性。在这里,我们定义了两个名称分别为TestLog4j和TestLog4j.TestLog4j2设计器。
? 在定义TestLog4j记录器时没有指定级别,所以它的级别继承自它的父记录器,即根记录器,所以它的级别也为DEBUG。在定义TestLog4j记录器时又定义了一个名称为R的输出端,所以它的输出端有两个,一个从根记录器继承而来的名为stdout的输出端,另一个为在此定义的名为R的输出端。在此需要注意的是,在定义记录器时必须先定义记录器的级别,然后才是记录器的输出端。如果只想定义输出端而不定义级别,则虽然级别可以为空,但逗号分隔符不能省略。如定义TestLog4j记录器的做法。
? 在定义TestLog4j.TestLog4j2记录器时又指定了它的级别,由于一个记录器的级别只能有一个,所以新指定的级别将覆写掉它的父记录器的级别(这就象Java中的多态)。我们没有定义TestLog4j.TestLog4j2记录器的输出端,所以它的输出端将从它的父记录器中继承而来。它的父记录器为estLog4j记录器,所以它和estLog4j记录器一样具有两个名称分别为 stdout和R的输出端。
3) 剩下的3区和4区分别设置了两个输出端的参数值。
接下来,回到我们的代码,看一下是如何取得记录器,在取记录器时又发生了什么。
1) 例4-a中的代码(2)中,语句Logger.getLogger()中的参数TestLog4j.class.getName()的值为 TestLog4j. TestLog4j,所以此语句的结果是取得一个名为TestLog4j. TestLog4j的记录器的对象。但在配置文件中并没有定义这样的记录器,所以最终将返回与所需的名称TestLog4j. TestLog4j最接近的记录器对象,即名为TestLog4j的记录器的对象。
2) 例4-b中的代码(1)的原理与例4-a中的代码(2)相似,期望取得的是名为TestLog4j.TestLog4j2. TestLog4j2的记录器对象,但最终返回的是TestLog4j.TestLog4j2记录器的对象

 

Log4j的web应用:

 

Web application与在application中应用log4j不同之处就是要在所有应用log4j的代码之前对log4j进行初始化。所以,我们在web application中就要把log4j的初始化工作独立出来,把它放在Servlet中

 

例子:

第一步:定义Servlet类进行初始化Log4j配置文件
import org.apache.log4j.PropertyConfigurator;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* log4j.jar的初始化类,参考web.xml
*/
public class Log4jInit extends HttpServlet{
  public void init(){
    //通过web.xml来动态取得配置文件
    String prefix = getServletContext().getRealPath("/");
    String file = getInitParameter("log4j-init-file");
    // 如果没有给出相应的配置文件,则不进行初始化
    if(file != null){
      PropertyConfigurator.configure(prefix+file); //(1)
    }
  }

  public void doGet(HttpServletRequest req, HttpServletResponse res){}
}
第二步:web.xml中配置servlet类
<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>TestLog4j.Log4jInit</servlet-class>
<init-param>
<param-name>log4j-init-file</param-name>
<param-value>sort.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
因为log4j的初始化要在所有的log4j调用之前完成,所以在web.xml文件中,我们一定要把对应的Servlet定义的load-on-startup应设为1,以便在Web容器启动时即装入该Servlet。

 

第三步:可以像以上的application应用中操作的那样运用Log4j

import org.apache.log4j.Logger;
public class InfoForm{
static Logger logger = Logger.getLogger(InfoForm.class);
protected String title;
protected String content;

public InfoForm() {}

public void setTitle(Object value){
logger.debug("nepalon:title = " + title);
title = value;
}
public String getTitle(){
logger.debug("nepalon:title = " + title);
return title;
}
public void setContent(String value){
content = value;
logger.debug("nepalon: content() = " + content);
}
public String getContent(){
logger.debug("nepalon: content = \n" + content);
return content;
}
}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    WebApplication-Project-RoyestaLab:默认Web应用程序项目

    RoyestaLab的Web应用程序项目 使用Spring Web MVC,Spring Security,JPA / Hibernate + MySQL,Thymeleaf,... Slf4j / Log4j 1.7.5 朱尼特4.11 Spring测试4.0.5.RELEASE(Spring MVC测试框架) Mockito 1.9.5

    响应引导站点:这是一个使用Spring MVC和JSP构建的Web应用程序。 它使用诸如Spring,Apache Tiles,Bootstrap,JQuery,Log4j等库。还有一个Maven Tomcat插件,可让您轻松运行该应用程序

    Log4j 要求 版本8+ 如何运行应用程序 在Windows上 # # Build application from base directory using Maven Wrapper mvnw.cmd clean install # # Run tomcat7 server and deploy the application mvnw.cmd tomcat7:...

    WebApplication-Project-Skeleton:使用 Spring Web MVC、Spring Security、JPAHibernate + MySQL、Thymeleaf、Bootstrap、Gradle 开发 Web 应用程序

    标准 Web 应用程序项目骨架 使用 Spring Web MVC、Spring Security、JPA/Hibernate + MySQL、Thymeleaf、Bootstrap、... Slf4j/Log4j 1.7.5 Junit 4.11 spring-test 4.0.5.RELEASE(Spring MVC 测试框架) Mockito

    XP开发模式:第一个最简单的Web Servlet应用演示例子

    为完成这个例子,需要把log4j.jar文档拷贝到Tomcat 6.0的lib目录下。同时,在使用Ant打包时,需要在打成.war档之后,手动调整jsp文档的位置,也就是需要向压缩档添加 jsp目录,该目录在压缩档与WEB-INF目录同级,...

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

    webapplication

    标准Web应用程序项目框架 使用Spring Web MVC,Spring Security,JPA / Hibernate + MySQL,... Slf4j / Log4j 1.7.5 朱尼特4.11 Spring测试4.0.5.RELEASE(Spring MVC测试框架) Mockito 1.9.5 已配置以下内容:

    基于EXT SSI的简单树实现

    -- web应用启动时初始化applicationContext --&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; &lt;context-param&gt; &lt;description&gt;spring初始配置 &lt;param-name&gt;...

    .net log4的详细用法

    本人开始接触.net 日志,如有不对之处还请多多指教! lLog4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方...l配置Log4Net环境•新建一个WebApplication,添加一个“应用程序配置文件”(App.config

    bank_web_application:Java,Spring MVC,Oracle

    bank_web_application Java,Spring MVC,Oracle技术领域Tomcat 8.0.21 Web... Log4j 1.2.17,用于记录系统中的所有操作Sitemesh 3.0-alpha-2用于将视图(jsp页面)拆分为多个组件。对于客户: 对于员工: 对于管理员:

    spring4.3.9相关jar包

    外部依赖Commons Logging, (Log4J)。 spring-beans.jar(必须):这 个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection(IoC/DI)操作...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    &lt;artifactId&gt;log4j-slf4j-impl Redis二次封装的这个项目主要实现了自动延期的功能,可以在配置的时候设置某些缓存是否需要自动延期&lt;默认为ture&gt;,自动延期的将会在获取的时候重置 过期时间来达到自动延期功能。...

    ssh(structs,spring,hibernate)框架中的上传下载

    可以确定的一点是:BlobByteArrayType不可能逾越Blob天生的操作方式,原来是BlobByteArrayType数据类型本身具体数据访问的功能,它通过LobHandler将两次数据访问的动作隐藏起来,使Blob字段的操作在表现上和其他一般...

    example-spring-boot-embedded-felix:测试如何将Apache Felix嵌入到Spring Boot应用程序中

    将Spring默认日志记录配置为在资源中使用log4j2.xml 为Felix框架添加一种在内部环境中使用Spring引导属性的方法 费利克斯 创建FelixService作为Spring Service Component和ApplicationReadyEvent事件侦听器以对其...

    SpringBoot新手学习手册

    6.1使用log4j记录日志 30 6.2使用AOP统一处理Web请求日志 32 6.3Spring Boot集成lombok让代码更简洁 33 七、 缓存支持 35 7.1注解配置与EhCache使用 35 7.2使用Redis集成缓存 37 八、 热部署 37 8.1 什么是热...

    JVM参数设置详细说明

    从所有gc消耗系统时间看,系统使用率还是满高的,但是不论是young gc还是old gc,application thread pause的时间比较长,不合适 web 应用。我们也调小New Generation的,但是这样会使full gc时间加长。 后来我们就...

    Maven权威指南 很精典的学习教程,比ANT更好用

    创建这个简单的Web应用 5.4. 配置Jetty插件 5.5. 添加一个简单的Servlet 5.6. 添加J2EE依赖 5.7. 小结 6. 一个多模块项目 6.1. 简介 6.1.1. 下载本章样例 6.2. simple-parent 项目 6.3. simple-...

    springboot参考指南

    开发Web应用 i. 26.1. Spring Web MVC框架 i. 26.1.1. Spring MVC自动配置 ii. 26.1.2. HttpMessageConverters Spring Boot参考指南 3 iii. 26.1.3. MessageCodesResolver iv. 26.1.4. 静态内容 v. 26.1.5. 模板...

    大学文献检索资料 DOC

    信息: 应用文字、数据和信号形式通过一定的传递和处理,来表现各种相互联系的客观事物在运动变化中所具有特征性的内容的总称。 知识: 人们通过实践对客观事物极其运动过成和规律的认识。是人脑对客观事物传来的...

    整理后java开发全套达内学习笔记(含练习)

    应用,应用程序 [,æpli'keiʃәn]' (application crash 程序崩溃) arbitrary a.任意的 ['ɑ:bitrәri] argument n.参数;争论,论据 ['ɑ:gjumәnt]'(缩写 args) assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后...

Global site tag (gtag.js) - Google Analytics