整理介绍log4j在javaSE、javaEE中的使用 (不涉及slf4j)

引用 https://blog.csdn.net/u013870094/article/details/79518028

目录

一:javaSE使用log4j。也是入门案例

二:介绍log4j.properties文件

三、javaEE使用Log4j。——不使用Spring框架

四、javaEE使用Log4j。——   使用Spring框架


日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录。在apache网站:jakarta.apache.org/log4j 可以免费下载到Log4j最新版本的软件包。

这里将分别介绍javaSE、javaEE、javaEE(使用spring框架)的项目怎么使用log4j。注:这里不涉猎slf4j这个抽象层的日志类库,怎么使用slf4j+log4j看这篇

一:javaSE使用log4j。也是入门案例

1.新建一个JAva工程,导入包log4j-1.2.17.jar,整个工程最终目录如下

2、src同级创建并设置log4j.properties。  这样log4j.properties的文件位置就在D:\tools_workcatalog\eclipse_workSpacess\DemoJavaProject\src下、一编译,就会处在D:\tools_workcatalog\eclipse_workSpacess\DemoJavaProject\bin下

 

### 设置###  指定日志级别为debug、指定多个输出目的地stdout和D和E。stdout是语义化的输出目的地名称,和D和E一样,你也可以使用C代替。
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.java类使用

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) {  
 
        // 记录debug级别的信息  
        logger.debug("This is debug message.");  
        // 记录info级别的信息  
        logger.info("This is info message.");  
        // 记录error级别的信息  
        logger.error("This is error message.");  
    }  
 
}


/*
这里很牛逼,能默认加载了log4j.properties文件。你像jdbc.properties文件就得手动加载,手动读取并使用信息。如下:
		// 获取src路径下的文件的方式--->ClassLoader 类加载器
		ClassLoader classLoader = TestLog.class.getClassLoader();
		URL res = classLoader.getResource("jdbc.properties");
		System.out.println("URL==" + res);
		String path = res.getPath();
		System.out.println("path==" + path);
		// 2. 加载文件
		pro.load(new FileReader(path));
		System.out.println(pro.get("username"));
*/

4、输出结果

(1)首先是控制台的信息

[DEBUG] 2020-12-17 21:00:38,301 method:com.amarsoft.myTest.TestLog.main(TestLog.java:31)
This is debug message.
[INFO ] 2020-12-17 21:00:38,303 method:com.amarsoft.myTest.TestLog.main(TestLog.java:33)
This is info message.
[ERROR] 2020-12-17 21:00:38,304 method:com.amarsoft.myTest.TestLog.main(TestLog.java:35)
This is error message.

(2)再来看输出的文件

    error.log文件里内容如下:内容如下:

2020-12-17 21:00:38  [ main:3 ] - [ ERROR ]  This is error message.

   log.log文件里内容如下:

2020-12-17 21:00:38  [ main:0 ] - [ DEBUG ]  This is debug message.
2020-12-17 21:00:38  [ main:2 ] - [ INFO ]  This is info message.
2020-12-17 21:00:38  [ main:3 ] - [ ERROR ]  This is error message.

  第二天再运行一遍测试类,再来看输出的文件:17号生成的会给你标明。

二:介绍log4j.properties文件

其实您也可以完全不使用配置文件,而是在代码中配置Log4j环境。ps:没试过。

但是,使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)(即.properties文件)。下面我们介绍怎么配置log4j.properties

1、配置根Logger,其语法为:其中,level 是日志记录的级别、appenderName是日志信息输出目的地名字。

log4j.rootLogger = level  , appenderName, appenderName, …

(1)level

每个Loggeri日志控制器都有一个总控制日志级别(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。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。

(2)appenderName

随便取名,一般使用stdout表示目的地为控制台、其他目的地喜欢用D和E表示

 

2、配置输出目的地的详细信息。其语法为:

log4j.appender.appenderName =appenderNameValue    # 日志信息输出目的地名称=目的地的值
log4j.appender.appenderName.option1 = value1      # 目的地的参数1=值1
log4j.appender.appenderName.option2 = value2
log4j.appender.appenderName.option3 = value3
…  
log4j.appender.appenderName.optionN = valueN

其中,Log4j提供的appenderNameValue值有以下几种:

log4j.appender.D =org.apache.log4j.ConsoleAppender(控制台),  
#log4j.appender.D =org.apache.log4j.FileAppender(文件),  
#log4j.appender.D =org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  
#log4j.appender.D =org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  
#log4j.appender.D =org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Log4j提供的参数有一个叫layout ,表示输出到目的地的输出格式是什么。log4j提供下面的这些值供你选用。

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#log4j.appender.stdout.layout = org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
#log4j.appender.stdout.layout = org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
#log4j.appender.stdout.layout = org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

layout参数选值为PatternLayout自由布局的时候,需要自己布局,如

log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n


下面是讲解:
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息。

%m 输出代码中指定的消息log信息耗费的毫秒数  
%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)

 

三、javaEE使用Log4j。——不使用Spring框架

在J2EE应用使用Log4j,必须在启动服务时就加载Log4j的配置文件进行初始化。

1、新建一个servlet,这个servlet在init函数中为log4j执行配置,一般就是读入配置文件。在web.xml中配置这个servlet,同时设定load-on-startup为1。

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

  • 文件位置在web.xml中配置servlet时配置一个param即可,路径一般是相对于web的root目录
  • 文件类型一般有两种,一个是Java的property文件,另一种是xml文件。一般都是使用.properties文件。
     

项目结构如下:

 

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>  

 
    <servlet-mapping>  
        <servlet-name>Log4JTestServlet</servlet-name>  
        <url-pattern>/test</url-pattern>  
    </servlet-mapping>  
 
 
    <!--用来启动 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>  

</web-app>

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;  
 
 
@WebServlet("/Log4JInitServlet")  
public class Log4JInitServlet extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
 
    
    public Log4JInitServlet() {  
        super();  
    }  
 
    
    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);  
    }  
 
  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
 
    }  
 
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
 
    }  
 
}

测试用的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;  


public class Log4JTestServlet extends HttpServlet {  
    private static final long serialVersionUID = 1L;  
    private static Logger logger = Logger.getLogger(Log4JTestServlet.class);    

    
    public Log4JTestServlet() {  
        super();  

    }  

   
    public void init(ServletConfig config) throws ServletException {  

    }  

   
    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.");    
    }  

  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        doGet(request,response);  
    }  

}

最后,启动此web项目、使用浏览器访问.../test。观察控制台和日志文件。

四、javaEE使用Log4j。——使用Spring框架

(1)接上面的工程,再导入Spring的包

(2)web.xml的整个内容如下,这里Log4JInitServlet.java就相当于没用到了。这样日志就跟随Spring窗口启动而启动了

<?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>

最终测试即可。


版权声明:本文为weixin_44900158原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。