我希望能够在我的 Java Netbeans 应用程序中执行与普通应用程序相同的操作:将打印语句写入控制台或某些文件以进行调试。
我使用 Netbeans 对此进行了测试,创建了一个运行 Tomcat 8 和新 servlet 的全新 Web 项目。我修改了 servlet 以包括:
Logger.getLogger("foo").info("This is a test message.");
并且结果默认打印到Tomcat控制台,Tomcat没有变化,项目没有变化,项目中也没有logger.properties。
在 Web 应用程序中,很遗憾无法将记录器输出到控制台。
您应该在 Netbeans 底部有多个选项卡。一种是运行编译器并启动 Tomcat 的 Netbeans ANT 任务的控制台输出。然后,您应该有另一个选项卡,它是 Tomcat 实例的输出。在该选项卡下,您应该会看到记录器消息。 logging in Tomcat 指出 System.err/out 被重新映射到文件:
在 unix 上运行 Tomcat 时,控制台输出通常重定向到名为 catalina.out 的文件。在 Windows 上作为服务运行时,控制台输出也会被捕获并重定向,但文件名不同。
默认位置位于名为 logs 的文件夹下的 Tomcat 或域主目录中。由于安装的控制台处理程序和 System.err 被重新映射到文件,默认配置应该已经将记录器输出写入文件。它可能不是您想要的位置。
即使System.err/out 被重新映射,您也可以通过创建自己的custom handler 写入java.io.FileDescriptor 来写入JVM 控制台。
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.util.logging.LogRecord;
import java.util.logging.SimpleFormatter;
import java.util.logging.StreamHandler;
public class FileDescriptorHandler extends StreamHandler {
public FileDescriptorHandler() {
super(new FileOutputStream(FileDescriptor.out), new SimpleFormatter());
}
@Override
public synchronized void publish(LogRecord record) {
super.publish(record);
super.flush();
}
@Override
public void close() {
flush();
}
}
默认情况下,Netbeans 将捕获并显示此控制台输出。如果您只是编写打印到console 的代码,情况也是如此。
直接输出到文本文件怎么会这么难?
有人知道如何将 java 默认记录器直接输出到文件吗?
Tomcat documentation 也涵盖了这一点:
servlet-examples web 应用程序的示例 logging.properties 放置在 web 应用程序内的 WEB-INF/classes 中:
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
.handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = ${classloader.webappName}.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
请注意,与标准 LogManager 不同,对于 Tomcat,您必须使用 declare the handlers that can be used。
如果您无法使日志配置文件正常工作,则将 servlet 上下文侦听器添加到您的项目并手动安装文件处理程序。
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;
import javax.servlet.ServletContextEvent;
import javax.servlet.annotation.WebListener;
import javax.servlet.ServletContextListener;
@WebListener
public class HandlerInstaller implements ServletContextListener {
private static final Logger logger = Logger.getLogger("");
private Handler target;
@Override
public synchronized void contextInitialized(ServletContextEvent sce) {
try {
target = new FileHandler();
logger.addHandler(target);
} catch (IOException | RuntimeException ex) {
sce.getServletContext().log(sce.toString(), ex);
}
}
@Override
public synchronized void contextDestroyed(ServletContextEvent sce) {
logger.removeHandler(target);
target.close();
target = null;
}
}