如何直接输出java默认记录器到文件?

时间:2017-06-22 20:20:58

标签: java logging java.util.logging

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

4 个答案:

答案 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默认记录器到文件吗?

Tomcat documentation

也涵盖了这一点
  

将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");