引用 https://blog.csdn.net/u013870094/article/details/79518028
目录
日志是应用软件中不可缺少的部分,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>
最终测试即可。