【问题标题】:How to get the Java default logger output to a file?如何将 Java 默认记录器输出到文件?
【发布时间】:2017-11-26 06:44:36
【问题描述】:

我知道如何用 Java 创建出现在控制台中的日志消息:

java.util.logging.Logger.getLogger(<CLASSNAME>.class.getName())
 .log(Level.INFO, "LOG MESSAGE");

但是,我目前正在开发一个网络应用程序(在 netbeans IDE 中)。在 Web 应用程序中,很遗憾无法将记录器输出到控制台。

因此,我想将输出定向到文件。

我尝试了一些方法,但没有成功。例如,我尝试了以下方法:

...还有很多其他的,但似乎没有任何效果。

直接输出到文本文件怎么会这么难?有人知道如何将 java 默认记录器直接输出到文件吗?

【问题讨论】:

  • Web 应用程序在 Tomcat 或 Glassfish 等 Web 服务器上运行。您还需要配置他们的日志记录,而不是单独配置您的应用程序。请参阅此处作为示例:stackoverflow.com/questions/24990515/… 某些 3rd 方日志记录框架(例如 log4j)可能会有所帮助
  • 已经尝试过 log4j ...也没有用 ...您也可以将 log4j 应用于单个应用程序 btw ...您不必为整个 tomcat 配置它
  • already tried log4j ... didn't work either 我确定您使用它的方式错误或缺少一些配置。可以参考this教程
  • 使用您的实际属性文件、属性文件相对于项目根目录的位置、Tomcat 和 Netbeans 的版本更新您的问题。您是否在调试器中运行了代码以确保调用了 logger.log

标签: java logging java.util.logging


【解决方案1】:

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

请确保刷新以查看文件。

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
    }   
    }

【讨论】:

    【解决方案2】:

    我希望能够在我的 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;
        }
    }
    

    【讨论】:

    • 你可能有一个观点,但它就在我头上......我已经阅读了你提到的 Tomcat 文档,我什至创建了一个属性文件......它没有工作...这个 FileDescriptorHandler 将如何提供帮助?我必须在哪里初始化它?是否必须将其传递给另一个对象(例如记录器?)
    【解决方案3】:

    您应该强烈考虑使用 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");
    

    【讨论】:

      【解决方案4】:

      您可以在项目目录的类路径中提供自己的日志记录文件

      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
      

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 2015-07-26
        • 1970-01-01
        相关资源
        最近更新 更多