我正尝试按照一些教程在我的网络应用程序中配置 log4j2。我正在使用 glassfish 4.1.1 服务器和 servlet 3.1 版。我可以使用以下配置配置日志记录功能:
log4j.properties
# Root logger option
log4j.rootLogger=INFO, consoleAppender, fileAppender
# debug level logger
log4j.logger.kumar.suraj.college.administration.login=DEBUG
# Redirect log messages to console
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Target=System.out
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Redirect log messages to a log file, support file rolling.
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileAppender.File=E:\\DEVELOPMENT\\JAVA\\web-logs\\web-college-administration\\applicationLogs.log
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
属性文件放在src/main/resources文件夹中
网络.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>College Administration</display-name>
<!-- <context-param>
<param-name>log4jConfiguration</param-name>
<param-value>/log4j.properties</param-value>
</context-param>is it required
-->
<!--from where is this class referenced in dependency without web -->
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>kumar.suraj.college.administration.login.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
定义文件位置的上下文参数被注释掉了。可能 log4j 默认查找名称为 log4j.properties 的文件。但是只是想知道它是否是指定文件位置的正确方法。
我也不确定从哪个 jar 中引用了 org.apache.logging.log4j.web.Log4jServletContextListener。我搜索了所有 jar 文件,但找不到此类。
登录Servlet.java
package kumar.suraj.college.administration.login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import kumar.suraj.college.administration.adduser.AddUserServlet;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// final static Logger logger = LogManager.getLogger(LoginServlet.class);
final static Logger logger = Logger.getLogger(LoginServlet.class);
public LoginServlet() {
super();
}
@Override
protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
throws ServletException, IOException {
LoginServlet.logger.debug("debug level logging supported"); response.getWriter().append("Servedat:").append(request.getContextPath());
response.getWriter().append("Hello Suraj");
}
@Override
protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
LoginServlet.logger.debug("debug level logging supported");
this.doGet(request, response);
}
}
log4j 的 pom.xml 依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
所有这些工作正常,我在控制台和文件中都获得了日志。但是当我尝试根据以下链接更改配置时:
https://logging.apache.org/log4j/2.x/manual/webapp.html#Servlet-3.0 https://logging.apache.org/log4j/2.x/maven-artifacts.html
喜欢而不是之前指定的依赖我切换到
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.6.2</version>
</dependency>
log4j-api 和 log4j-core 添加为 log4j-web.jar 的传递依赖
我在 LoginServlet.java 中所做的其他更改是因为在切换到 log4j-web.jar 后出现编译时错误,如下所示:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
final static Logger logger = LogManager.getLogger(LoginServlet.class);
// final static Logger logger = Logger.getLogger(LoginServlet.class);
主要变化在logger变量的初始化和两个导入。其余所有配置保持原样。在这种情况下,我还能够在 log4j-web.jar 的 web.xml 中找到指定的监听器类。日志记录仍然不适用于此配置。
有人可以帮我解决这个问题,或者告诉我我做错了什么吗?
最佳答案
好的,经过更多研究和重新阅读我之前提到的链接后,我终于设法在我的 Web 应用程序中配置了 log4j2,现在我得到了预期的日志。现在想提一下我做错了什么。
如链接中所述https://logging.apache.org/log4j/2.x/manual/webapp.html
如果我使用的是 servlet 3.0 或更高版本,我不需要在我的部署描述符中注册 Log4jServletContextListener 类,它只需要在 servlet 2.5 及以下版本中注册。如果我遵守 log4j2 的命名约定,我也不需要提供文件位置。
现在我正在使用 log4j2.xml 而不是 log4j2.properties,因为 log4j2 中属性文件的格式与 log4j1 中使用的格式不同。感谢下面链接中给出的答案,这些答案帮助我解决了这个问题。 Log4j 2 doesn't support log4j.properties file anymore?
对于当前支持的格式,请引用链接 https://logging.apache.org/log4j/2.0/manual/configuration.html#Properties
下面是我的部署描述符和 log4j 配置文件现在的样子:
网络.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>College Administration</display-name>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>kumar.suraj.college.administration.login.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="E:\\DEVELOPMENT\\JAVA\\web-logs\\web-college-administration\\applicationLogs.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
关于java - 使用 log4j-web.jar 在 Web 应用程序中配置 Log4j2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38539736/