我知道如何在控制台中用Java创建日志消息:
java.util.logging.Logger.getLogger(<CLASSNAME>.class.getName())
.log(Level.INFO, "LOG MESSAGE");
但是,我目前正在开发一个Web应用程序(在netbeans IDE中)。遗憾的是,在 Web 应用中,无法将记录器输出到控制台。
因此,我想直接输出到一个文件。
我试过一些方法,但没用。例如,我尝试了以下方法:
>
使用 java.util.logging.Logger 时如何在文本文件中写入日志
https://examples.javacodegeeks.com/core-java/util/logging/java-util-logging-example/
...和许多其他方法,但似乎都不起作用。
将输出定向到文本文件怎么会如此困难?有人知道如何将java默认记录器直接输出到文件中吗?
您应该强烈考虑使用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");
我希望能够在我的Java Netbeans应用程序中执行与普通应用程序相同的操作:将打印语句写入控制台或某些文件以进行调试。
我使用Netbean测试了这一点,创建了一个使用新servlet运行Tomcat 8的全新Web项目。我修改了servlet以包括:
Logger.getLogger("foo").info("This is a test message.");
默认情况下,结果将打印到Tomcat控制台,不更改Tomcat,不更改项目,项目中也没有logger.properties。
不幸的是,在web应用程序中,不可能将记录器输出到控制台。
在Netbeans的底部应该有多个选项卡。一个是运行编译器并启动Tomcat的Netbeans ANT任务的控制台输出。然后,您应该有另一个选项卡,它是Tomcat实例的输出。在该选项卡下,您应该会看到日志记录器消息。Tomcat中的日志指出< code>System.err/out被重新映射到文件:
在Unix上运行Tomcat时,控制台输出通常重定向到名为catalina.out的文件。在Windows上作为服务运行时,控制台输出也会被捕获并重定向,但文件名不同。
默认位置位于 Tomcat 或域主目录下名为 logs
的文件夹下。默认配置应该已经将记录器输出写入文件,因为已安装的控制台处理程序和 System.err 被重新映射到文件。它可能不是您想要的位置。
即使< code>System.err/out被重新映射,您也可以通过创建自己的自定义处理程序写入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 将捕获并显示此控制台输出。如果您只编写打印到控制台的代码,情况也是如此。
直接输出到文本文件怎么会如此困难?有人知道如何将java默认记录器直接输出到文件吗?
这也包含在Tomcat留档中:
将servlet示例Web应用程序放置在Web应用程序内部的WEB-INF/类中的示例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,您必须声明可以使用的处理程序,这与标准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;
}
}
试试这个。它将在项目文件夹中创建一个文本文件。
请确保进行刷新以查看文件。
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
}
}
问题内容: Netbeans仔细地将Logger.getLogger(this.getClass()。getName())。log(Level。[…]语句撒到catch块中。现在,我想将它们全部指向一个文件(并指向控制台)。 每个日志教程(只有我这样)都告诉我如何获取特定的日志记录器以输出到文件中,但是我认为有比修复每个自动生成的日志记录语句更好的方法了?为某种类型的根记录程序设置处理程序? 问题
问题内容: 当您运行Keras神经网络模型时,您可能会在控制台中看到以下内容: 随着时间的流逝,损失有望改善。我想将这些损失随时间记录到文件中,以便我可以从中学习。我试过了: 但这不起作用。我不确定在这种情况下我需要什么级别的日志记录。 我也尝试过使用如下回调: 但这显然不是在写文件。无论采用哪种方法,通过回调或日志记录模块或其他任何方法,我都想听听您的解决方案,用于将keras神经网络丢失记录到
问题内容: 我对jdk日志记录配置有疑问。我有一个使用JDK Logging输出消息的EJB(已部署到glassfish中)。因此,我使用具有以下代码的命名记录器: 我知道可以通过将以下行添加到Glassfish的logging.properties文件中来为记录器配置日志级别: 但是,如何为记录器指定输出文件?我想将来自名为“ org.imixs.workflow”的记录器的所有消息放入单独的文
这可能吗?我知道我可以以类似的方式将stdout定向到文件(请参见:将打印重定向到日志文件)
这是我的密码 我的输出: 有没有办法让我从4s车开始,从另一个方向开始?这样地:
问题内容: 我正在使用PyDev进行Python应用程序的开发和单元测试。至于单元测试,除了没有内容记录到日志记录框架这一事实之外,一切都可以正常工作。记录器未被PyDev的“捕获的输出”捕获。 我已经将记录的所有内容转发到标准输出,如下所示: 但是,“捕获的输出”不会显示记录到记录器的内容。 这是一个示例unittest-script: test.py 控制台输出为: 但是该测试的“ 捕获输出