我希望能夠在我的Java Netbeans應用程序中執行與正常應用程序中相同的操作:將打印語句寫入控制檯或某些文件以進行調試。
我測試了這個與NetBeans創建一個全新的web項目運行Tomcat 8與新的servlet。我修改了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寫入到JVM控制檯來寫入java.io.FileDescriptor。
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:
例logging.properties爲servlet-示例web應用被放置在WEB-INF /類web應用內:
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
請注意,對於Tomcat,您必須declare the handlers that can be used與標準LogManager不同。
如果您無法獲取日誌配置文件,請將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;
}
}
的web應用程序如Tomcat或Glassfish的一個Web服務器上運行的工作。您還需要配置他們的日誌記錄,而不是單獨的應用程序。看到這裏作爲一個例子:https://stackoverflow.com/questions/24990515/how-to-redirect-log4j-logging-from-catalina-out-to-separate-file?rq=1一些第三方日誌框架,如log4j可能會有幫助 –
已經嘗試過log4j ...也沒有工作...你也可以將log4j應用到單個應用btw ...你不必爲整個tomcat配置它 –
'已經嘗試過log4j ... didn我也確定你是以錯誤的方式使用它,或者錯過了一些配置。你可以參考[這個](http://www.codejava.net/coding/how-to-initialize-log4j-for-java-web-application)教程 –