【问题标题】:Unable to get log4j to write to log files when using Tomcat 9使用 Tomcat 9 时无法让 log4j 写入日志文件
【发布时间】:2020-09-28 14:22:29
【问题描述】:

我正在设置一个在 Tomcat 9 上运行的 Web 应用程序。

为了匹配其他地方编写的代码,我们希望在 Web 应用程序中继续使用 log4j。

我在 build.gradle 中定义了以下内容

implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.3'
implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.3'
runtimeOnly group: 'org.apache.logging.log4j', name: 'log4j-web', version: '2.13.3'

log4j-api-2.13.3.jarlog4j-core-2.13.3.jarlog4j-web-2.13.3.jar 都存在于我的 webapp 文件夹下的 WEB-INF/libs 中。

我的 log4j 配置在WEB-INF/classes/log4j.properties

# Root logger option
log4j.rootLogger=DEBUG, file

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender

#Redirect to Tomcat logs folder
log4j.appender.file.File=${catalina.base}/logs/my-application.log

log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

在我的处理程序中,我创建了记录器并尝试记录一些信息,但它没有显示在任何地方。


@WebServlet(name = "MyServlet", urlPatterns = {"/test"}, loadOnStartup = 1)
public class MyServletextends HttpServlet {
    private static final Logger logger = LogManager.getLogger(MyServlet.class);

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        logger.info("Test");
        response.getWriter().print("Service is up and running!");
    }
}

localhost.2020-09-28.log 日志文件中,我收到一条消息

28-Sep-2020 11:38:18.391 FINE [main] org.apache.catalina.core.StandardContext.filterStart  Starting filter 'log4jServletFilter'

所以我假设 log4j 加载正确,至少我在任何日志文件中都没有发现任何错误。

为了能够使用 log4j 并将其输出到自己的文件中,我缺少什么配置?

【问题讨论】:

    标签: java tomcat log4j


    【解决方案1】:

    我发现问题在于我在设置属性时好像使用的是 log4j,但实际上我使用的是 log4j2。

    我通过在 Tomcat 服务的开头添加 -Dlog4j.debug 属性来启用 log4j 调试发现了这一点。

    这表明它正在寻找名称类似于 log4j2.properties 的属性文件。

    我还必须更改属性文件的内容才能与 log4j2 一起使用。我使用了来自this website 的示例来帮助我创建一个新的属性文件。

    【讨论】:

    • 你用-Dlog4j.debug的提示拯救了我的一天。
    【解决方案2】:

    在我的例子中,项目有 2 个 SLF4J 实现,“log4j”和“logback”。在应用程序部署 catalina.out 有此消息“SLF4J:类路径包含多个 SLF4J 绑定......”。通过 pom 中的依赖排除以及在该文件创建并由日志填充之后删除了 logback。

    查看此链接https://www.baeldung.com/slf4j-classpath-multiple-bindings

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多