当前位置: 首页 > 知识库问答 >
问题:

如何将Java默认记录器输出获取到文件?

逄宁
2023-03-14

我知道如何在控制台中用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默认记录器直接输出到文件中吗?

  • 共有3个答案

    杜浩壤
    2023-03-14

    您应该强烈考虑使用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");
    
    丌官晨
    2023-03-14

    我希望能够在我的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;
        }
    }
    
    丁震博
    2023-03-14

    试试这个。它将在项目文件夹中创建一个文本文件。

    请确保进行刷新以查看文件。

    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 控制台输出为: 但是该测试的“ 捕获输出