我知道如何在java中创建出现在控制台中的日志消息:
java.util.logging.Logger.getLogger(<CLASSNAME>.class.getName()).log(Level.INFO, "LOG MESSAGE");
但是,我目前正在开发一个Web应用程序(在netbeans IDE中)。在Web应用程序中,遗憾的是无法将记录器输出到控制台。
因此,我想将输出定向到文件。
然而,无论我怎么做,都没有用。
例如,我试过这个:
How to write logs in text file when using java.util.logging.Logger
并且: https://examples.javacodegeeks.com/core-java/util/logging/java-util-logging-example/
......以及许多其他事情,但没有工作!
将输出定向到文本文件怎么这么难?
有人知道如何将java默认记录器直接输出到文件吗?
答案 0 :(得分:6)
试试这个。它将在项目文件夹中创建一个文本文件。
请务必刷新以查看该文件。
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class Test {
static Handler fileHandler = null;
private static final Logger LOGGER = Logger.getLogger(Test.class
.getClass().getName());
public static void setup() {
try {
fileHandler = new FileHandler("./logfile.log");//file
SimpleFormatter simple = new SimpleFormatter();
fileHandler.setFormatter(simple);
LOGGER.addHandler(fileHandler);//adding Handler for file
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
public static void main(String[] args) {
setup();//calling to the file content
LOGGER.info("------------------START--------------------");
//here the Information or Contents that in file
}
}
答案 1 :(得分:2)
我希望能够在Java Netbeans应用程序中执行与普通应用程序相同的操作:将print语句写入控制台或将某些文件写入调试目的。
我使用Netbeans测试了这个,创建了一个运行Tomcat 8和新servlet的全新Web项目。我修改了servlet以包含:
Logger.getLogger("foo").info("This is a test message.");
默认情况下,结果将打印到Tomcat控制台,不会更改Tomcat,也不会更改项目,也不会在项目中使用logger.properties。
在网络应用程序中,遗憾的是无法将记录器输出到控制台。
Netbeans底部应该有多个标签。一个是Netbeans ANT任务的控制台输出,它运行编译器并启动Tomcat。然后,您应该有另一个选项卡,它是Tomcat实例的输出。在该选项卡下,您应该看到记录器消息。 logging in Tomcat指出System.err/out
已重新映射到文件:
在unix上运行Tomcat时,控制台输出通常会重定向到名为catalina.out的文件。在Windows上作为服务运行时,控制台输出也会被捕获并重定向,但文件名不同。
默认位置位于名为logs
的文件夹下的Tomcat或域主目录中。默认配置应该已经将logger输出写入文件,因为已安装的控制台处理程序和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默认记录器到文件吗?
将servlet-examples Web应用程序放在Web应用程序内的WEB-INF / classes中的logging.properties示例:
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;
}
}
答案 2 :(得分:1)
您可以在项目目录的类路径中提供自己的日志文件
Netbeans logging : http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/logging.html
Java Util logging with logging properties file sample : http://www.javapractices.com/topic/TopicAction.do?Id=143
答案 3 :(得分:1)
你应该强烈考虑使用java.nio.file.Path;
这对我有用;把文件放在任何你想要的地方!
final Logger LOGGER = Logger.getLogger(logIntextfile.class
.getClass().getName());
public void WriteToLog() {
Path path = Paths.get("c:", "myFiles", "logfile.log");
try {
FileHandler file = new FileHandler(path.toString());
SimpleFormatter simple = new SimpleFormatter();
file.setFormatter(simple);
LOGGER.addHandler(file);
} catch (IOException e) {
System.err.println ("Try another day");
}
这也适用于mac os
Path path = Paths.get("/Users/",System.getProperty("user.name"),"myFiles", "logfile.log");