Log4j教程
欢迎使用log4j教程。
Log4j是Java应用程序中最常用的日志记录框架。
在本log4j教程中,我们将介绍log4j的基础知识,它的配置,然后在Java独立应用程序中然后在Java Web应用程序中查看它的运行情况。
Log4j教程
在开始使用log4j示例之前,第一步是获取log4j jar。
有多种下载log4j jar的方法。
我最喜欢的是通过Maven获取所有依赖项。
您可以在pom.xml文件中添加以下依赖项以获取log4j jar。如果您使用gradle,则将依赖项添加为:
'log4j:log4j:1.2.17'
如果不使用任何构建工具,则可以从Apache Log4j Official页面下载log4j jar,并将其包含在项目类路径中。
Log4j配置
Log4j支持基于属性和基于XML的配置。
其中我将使用基于XML的配置,您可以在链接的文章中看到基于log4j属性的配置。
log4j.xml
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
log4j配置文件的最重要部分是:
Appenders:这里我们定义日志记录策略,例如使用哪种类型的appender类,例如" org.apache.log4j.ConsoleAppender"或者" org.apache.log4j.RollingFileAppender"。
org.apache.log4j.PatternLayout用于定义日志记录模式。%d%d {Z} [%t]%-5p(%F:%L)-%m%n
将附加时间,线程,日志记录级别,带有行号的类名。
我们可以在log4j配置文件中定义任意数量的附加程序。logger:用于在带有附加程序的Java包/类和日志记录级别之间提供映射。
如您所见,单个记录器可以使用多个追加器。
如果多个记录器与java类包匹配,则使用更具体的记录器。root:当没有为Java包定义记录器时使用。
例如,如果com.theitroad.beans包中包含某些类,则它将与任何记录器都不匹配。
因此,根记录器将用于记录配置。
准备好log4j配置文件后,我们必须在代码中对其进行配置,然后才能真正开始记录日志。
下面是这样做的方法。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/" debug="false"> <!-- console appender --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{1} - %m%n" </layout> </appender> <!-- rolling file appender --> <appender name="file" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/main.log" <param name="Append" value="true" <param name="ImmediateFlush" value="true" <param name="MaxFileSize" value="10MB" <param name="MaxBackupIndex" value="5" <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" </layout> </appender> <logger name="com.theitroad.log4j" additivity="false"> <level value="DEBUG" <appender-ref ref="file" <appender-ref ref="console" </logger> <logger name="com.theitroad.log4j.logic" additivity="false"> <level value="INFO" <appender-ref ref="file" </logger> <root> <priority value="DEBUG" <appender-ref ref="file" <appender-ref ref="console" </root> </log4j:configuration>
注意,如果我们的log4j配置文件名是log4j.xml
或者log4j.properties
,那么我们可以跳过此步骤,因为log4j会尝试自动从类路径中加载这些文件。
Java Log4j用法
现在,让我们看看如何在代码中使用它们。
我们为上面定义的记录器创建了两个类。
//for XML based configuration DOMConfigurator.configure("log4j.xml"); //for properties based configuration PropertyConfigurator.configure("log4j.properties");
我们可以一次创建一个最终的Logger实例,然后在整个类中重复使用它。
注意,我正在用init()
方法配置log4j,该方法是在静态块中加载类时调用的。
package com.theitroad.log4j.main; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import com.theitroad.log4j.logic.MathUtils; public class Log4jExample { static{ init(); } private final static Logger logger = Logger.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("My Debug Log"); logger.info("My Info Log"); logger.warn("My Warn Log"); logger.error("My error log"); logger.fatal("My fatal log"); MathUtils.add(4,5); MathUtils.add(40,50); MathUtils.add(1,5); } /** * method to init log4j configurations */ private static void init() { DOMConfigurator.configure("log4j.xml"); } }
现在,当我们在main方法之上运行时,我们将在main.log文件中获得以下日志。
package com.theitroad.log4j.logic; import org.apache.log4j.Logger; public class MathUtils { private static final Logger logger = Logger.getLogger(MathUtils.class); public static int add(int x, int y){ logger.debug("inputs are:"+x+", "+y); return x+y; } }
您还将看到日志打印到控制台。
2015-05-12 21:22:44,610 +0530 [main] DEBUG (Log4jExample.java:18) - My Debug Log 2015-05-12 21:22:44,611 +0530 [main] INFO (Log4jExample.java:19) - My Info Log 2015-05-12 21:22:44,611 +0530 [main] WARN (Log4jExample.java:20) - My Warn Log 2015-05-12 21:22:44,612 +0530 [main] ERROR (Log4jExample.java:21) - My error log 2015-05-12 21:22:44,612 +0530 [main] FATAL (Log4jExample.java:22) - My fatal log
请注意,MathUtils类没有打印任何日志,这是因为它的记录器级别是INFO,高于DEBUG。
只需将其日志记录级别更改为DEBUG,如下所示。
DEBUG Log4jExample - My Debug Log INFO Log4jExample - My Info Log WARN Log4jExample - My Warn Log ERROR Log4jExample - My error log FATAL Log4jExample - My fatal log
现在,当您再次运行该程序时,main.log文件也将具有以下日志。
<logger name="com.theitroad.log4j.logic" additivity="false"> <level value="DEBUG" <appender-ref ref="file" </logger>
这就是在Java独立应用程序中使用log4j的过程。
Log4j Java Web应用程序
现在,让我们看看如何在Java Web应用程序中使用log4j。
创建一个"动态Web项目",然后将其转换为Maven。
下图显示了该项目的最终结构。
下面是log4j配置文件。
my-log4j.xml
2015-05-12 21:23:56,151 +0530 [main] DEBUG (MathUtils.java:10) - inputs are:4, 5 2015-05-12 21:23:56,151 +0530 [main] DEBUG (MathUtils.java:10) - inputs are:40, 50 2015-05-12 21:23:56,153 +0530 [main] DEBUG (MathUtils.java:10) - inputs are:1, 5
它与早期配置的相似之处更多,除了我们要注入" catalina.home"变量以将日志文件生成到tomcat日志目录中。
由于必须在使用log4j之前对其进行配置,因此我们可以通过定义如下的" ServletContextListener"来加载它。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/" debug="false"> <!-- console appender --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %c{1} - %m%n" </layout> </appender> <!-- rolling file appender --> <appender name="file" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="${catalina.home}/logs/main.log" <param name="Append" value="true" <param name="ImmediateFlush" value="true" <param name="MaxFileSize" value="10MB" <param name="MaxBackupIndex" value="5" <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" </layout> </appender> <logger name="com.theitroad.log4j" additivity="false"> <level value="DEBUG" <appender-ref ref="file" <appender-ref ref="console" </logger> <root> <priority value="DEBUG" <appender-ref ref="file" <appender-ref ref="console" </root> </log4j:configuration>
注意,使用ServletContext来获取log4j配置文件的完整路径。
这是我们必须做的其他事情,因为我们在运行时不知道log4j文件的完整路径,也不想对其进行硬编码。
以下是使用Logger记录一些消息的简单Servlet类。
package com.theitroad.log4j.servlet; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import org.apache.log4j.xml.DOMConfigurator; @WebListener public final class Log4jInitListener implements ServletContextListener { public Log4jInitListener() { } public void contextDestroyed(ServletContextEvent paramServletContextEvent) { } public void contextInitialized(ServletContextEvent servletContext) { String webAppPath = servletContext.getServletContext().getRealPath("/"); String log4jFilePath = webAppPath + "WEB-INF/classes/my-log4j.xml"; DOMConfigurator.configure(log4jFilePath); System.out.println("initialized log4j configuration from file:"+log4jFilePath); } }
只需将项目导出为WAR文件,然后部署到Tomcat服务器,下图显示了当我们在浏览器中调用servlet时的图像。
您将在tomcat日志目录main.log文件中获得以下日志类型。
package com.theitroad.log4j.servlet; import java.io.IOException; import java.io.PrintWriter; 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; @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(MyServlet.class); public MyServlet() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); logger.info("Name parameter value = "+name); PrintWriter out = response.getWriter(); out.append("Served at: ").append(request.getContextPath()); out.append("\n\nHello "+name); out.flush(); } }
由于我们还在登录到catalina.out文件的控制台,因此您将在catalina日志文件中找到以下日志。
hyman:logs hyman$tail -f main.log 2015-05-12 21:46:33,038 +0530 [http-nio-8080-exec-2] INFO (MyServlet.java:29) - Name parameter value = hyman