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

ste*_*ess 5 java logging java.util.logging

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

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

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

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

但是,无论我尝试什么,都没有用.

例如,我试过这个:

使用java.util.logging.Logger时如何在文本文件中写日志

并且:https: //examples.javacodegeeks.com/core-java/util/logging/java-util-logging-example/

...还有很多其他的东西,但没有工作!

如何将输出定向到文本文件是如此困难?

有人知道如何直接输出java默认记录器到文件吗?

Vis*_*hnu 7

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

请确保刷新以查看该文件.

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
    }   
    }
Run Code Online (Sandbox Code Playgroud)


jme*_*ens 2

我希望能够在我的 Java Netbeans 应用程序中执行与普通应用程序相同的操作:将打印语句写入控制台或某些文件以进行调试。

我使用 Netbeans 测试了这一点,创建了一个运行 Tomcat 8 和新 servlet 的全新 Web 项目。我修改了 servlet 以包括:

Logger.getLogger("foo").info("This is a test message.");
Run Code Online (Sandbox Code Playgroud)

并且结果默认打印到Tomcat控制台,Tomcat没有改动,项目没有改动,项目中没有logger.properties。

不幸的是,在网络应用程序中,不可能将记录器输出到控制台。

Netbeans 底部应该有多个选项卡。一种是运行编译器并启动 Tomcat 的 Netbeans ANT 任务的控制台输出。然后您应该有另一个选项卡,它是 Tomcat 实例的输出。在该选项卡下,您应该会看到记录器消息。Tomcat 中的日志记录指出已System.err/out重新映射到文件:

在 Unix 上运行 Tomcat 时,控制台输出通常会重定向到名为 catalina.out 的文件。当在 Windows 上作为服务运行时,控制台输出也会被捕获并重定向,但文件名不同。

默认位置位于 Tomcat 或域主目录中名为 的文件夹下logs。默认配置应该已经将记录器输出写入文件,因为已安装的控制台处理程序和 System.err 被重新映射到文件。它可能不是您想要的位置。

即使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();
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,Netbeans 将捕获并显示此控制台输出。如果您只编写打印到控制台的代码,情况也是如此。

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

Tomcat 文档中也对此进行了介绍:

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
Run Code Online (Sandbox Code Playgroud)

请注意,对于 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;
    }
}
Run Code Online (Sandbox Code Playgroud)