Log4j框架

一、Log4j基本使用方法

  Log4j由三个重要的组件构成:日志信息的优先级 Loggers,日志信息的输出目的地 Appenders,日志信息的输出格式 Layouts 。日志信息的优先级从高到低

RROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。

  1.1、定义配置文件

  其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)。下面我们介绍使用Java特性文件做为配置文件的方法:

  1.配置根Logger,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

  其中,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有以下几种:

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)

  1.2、在代码中使用Log4j

  1.得到记录器

    使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:

      public static Logger getLogger( String name)

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

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

  2.读取配置文件

    当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

      BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。

      PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。

      DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

  3.插入记录信息(格式化日志信息)

    当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:

      Logger.debug ( Object message ) ;

      Logger.info ( Object message ) ;

      Logger.warn ( Object message ) ;

      Logger.error ( Object message ) ;

  1.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)将不会被打印出来。

二、Java入门实例

  1.新建一个Java工程,导入包log4j-1.2.17.jar
  2、src同级创建并设置log4j.properties

### 设置###
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

  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.getLogger(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级别的信息
logger.error("This is error message.");
}

}

三、Web项目中使用Log4j实例

  1、web应用的log4j使用基本上都采用:新建一个servlet,这个servlet在init函数中为log4j执行配置。一般就是读入配置文件。所以需要在web.xml中为这个servlet配置,同时设定load-on-startup为1。

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

  3、配置文件位置在web.xml中配置一个param即可,路径一般是相对于web的root目录

  4、文件类型一般有两种,一个是Java的property文件,另一种是xml文件

    配置文件的大致内容:log4j可以指定输出的log级别的最低等级,以及log的输出配置格式,每个log可以指定多个输出方式

  (1)创建Web工程

  (2)web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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.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

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 = config.getInitParameter("log4j-properties-location");

ServletContext sc = config.getServletContext();

if (log4jLocation == null) {
System.err.println("*** 没有 log4j-properties-location 初始化的文件, 所以使用 BasicConfigurator初始化");
BasicConfigurator.configure();
} else {
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
File yoMamaYesThisSaysYoMama = new File(log4jProp);
if (yoMamaYesThisSaysYoMama.exists()) {
System.out.println("使用: " + log4jProp+"初始化日志设置信息");
PropertyConfigurator.configure(log4jProp);
} else {
System.err.println("*** " + log4jProp + " 文件没有找到, 所以使用 BasicConfigurator初始化");
BasicConfigurator.configure();
}
}
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
}

}

  (5)调用日志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.getLogger(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级别的信息
logger.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

  (1)导入Spring包和Log4j包

  (2)配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>  

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xmlns="http://java.sun.com/xml/ns/javaee"  

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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.springframework.web.context.ContextLoaderListener</listener-class>  

    </listener>  

    <context-param>  

        <param-name>contextConfigLocation</param-name>  

        <param-value>classpath:applicationContext.xml</param-value>  

    </context-param>   

    <!-- 设置根目录 -->  

    <context-param>    

        <param-name>webAppRootKey</param-name>    

        <param-value>webapp.root</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>   

</web-app>

  (2)配置applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  

    xmlns:aop="http://www.springframework.org/schema/aop"  

    xsi:schemaLocation="http://www.springframework.org/schema/beans

              http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

               http://www.springframework.org/schema/aop

                http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

                http://www.springframework.org/schema/context

                http://www.springframework.org/schema/context/spring-context-3.2.xsd">  

</beans>
 
时间: 2024-09-30 21:52:20

Log4j框架的相关文章

日志及log4j框架

日志分类 SQL日志.异常日志.业务日志 日志实现 1.jdk也提供日志记录功能 没有日志级别: 如果想写出到文件,需要自己使用IO流来实现 2.log4j是一个非常优秀的开源日志记录工具 a.控制日志的输出级别 b.控制日志信息输送的目的地是控制台.文件等 c.控制每一条日志的输出格式 3.slf4j slf4j 依赖 jdk日志实现.log4j日志框架,可以在这两者之间切换调用 hibernate默认的日志框架是slf4j.log4j 4.logback logback效率更高,是log4j

【spring-boot】spring-boot使用log4j框架时,提示警告-》log4j:WARN Please initialize the log4j system properly.

解决方法: 在resources文件夹下,创建一个配置文件:log4j.properties 内容如下: log4j.rootLogger=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p

log4j日志框架学习

初识Log4j: log4j有三个部分: 1.loggers 负责捕获日志信息. 2.appenders  负责输出信息到不同的目的地 3.layouts 负责使用不同的样式输出日志 log4j框架中有两种对象: 核心对象:框架的支撑对象,是框架必不可少的组成部分. 支撑对象:这些都是框架可选的对象,用于提供额外重要的工作. 核心对象包括下面几种类型: logger对象,是最高的层,负责通过不同的风格转化日志信息,他提供给appender对象发布前的信息.(这里的层是指所处的位置) layout

在android中配置 slf4j + log4j 日志记录框架

需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j 框架来实现.slf4j 是日志记录的一个facade,支持多种日志框架.log4j是个很优秀的日志记录框架. 实现: 下载类库: 先到各主站点下载类库 slf4j 网址 :http://www.slf4j.org/download.html log4j网址: http://logging.apach

Spring框架总结(一)

名词解释: 框架就是组件的集合.比如:Struts.Spring.Hibernate就是组件的集合 组件就是常用的功能包封装成工具类. 常用组件: Dom4j/Xpath.DBUtils.C3p0.BeanUtils.log4j 框架就是组件的集合.比如:Struts.Spring.Hibernate就是组件的集合 泛型:进行类型检查,较少类型转化,自己定义一个可以为任意类型的类,jdk1.5之后产生 快捷键使用Ctril + Shift + R 查看当前项目中的类Ctril + Shift +

开源框架(整理)

开源框架(整理) Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象.让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换. Math.NET http://www.mathdotnet.com/ Math.NET的目标是为提供

log4j教程 3、架构

Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. 支持对象: 框架和支持体核心对象,可选的对象执行另外重要的任务. 核心对象: Logger对象: 顶级层的Logger,它提供Logger对象.Logger对象负责捕获日志信息及它们存储在一个空间的层次结构. 布局对象: 该层提供其用于格式化不同风格的日志信息的对象.布局层提供支持Appender

log4j教程 2、安装

Log4j的API包使用Apache软件许可证,由开源倡议认证一个完全成熟的开源许可证下发布. 最新log4j的版本,包括完整的源代码,类文件和文档可以在这里找到 http://logging.apache.org/log4j/. 下载 apache-log4j-x.x.x.tar.gz 做到以下几点: 步骤1: 将下载的文件解压缩和解压在 /usr/local/ 目录,如下所示: $ gunzip apache-log4j-1.2.15.tar.gz $ tar -xvf apache-log

C# 开源框架(整理)

Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象.让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换. Math.NET http://www.mathdotnet.com/ Math.NET的目标是为提供一款自身包含清晰框