web-dev-qa-db-ja.com

Javaデフォルトのロガー出力をファイルに取得するにはどうすればよいですか?

コンソールに表示されるJava)でログメッセージを作成する方法を知っています。

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

ただし、現在、(netbeans IDEの)Webアプリに取り組んでいます。 Webアプリでは、残念ながらロガーをコンソールに出力することはできません。

したがって、出力をファイルに転送したいと思います。

私が試したいくつかのことはうまくいきませんでした。たとえば、私は次のことを試しました。

...そして他の多くの人が、何も機能していないようです。

出力をテキストファイルに送るのがどうしてそんなに難しいのでしょうか? Javaデフォルトのロガーをファイルに直接出力する方法を知っている人はいますか?

5
steady_progress

これを試して。プロジェクトフォルダにテキストファイルを作成します。

ファイルを表示するには、必ず更新を行ってください。

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

Java Netbeansアプリケーションでは、通常のアプリケーションと同じように、デバッグ目的でコンソールまたはファイルにprintステートメントを書き込むことができるようにしたいと考えています。

これをNetbeansでテストし、新しいサーブレットでTomcat8を実行する新しいWebプロジェクトを作成しました。サーブレットを変更して、次のものを含めました。

Logger.getLogger("foo").info("This is a test message.");

そして、結果はデフォルトでTomcatコンソールに出力され、Tomcatは変更されず、プロジェクトも変更されず、プロジェクトにlogger.propertiesもありません。

Webアプリでは、残念ながらロガーをコンソールに出力することはできません。

Netbeansの下部に複数のタブがあるはずです。 1つは、コンパイラを実行してTomcatを起動するNetbeansANTタスクからのコンソール出力です。次に、Tomcatインスタンスからの出力である別のタブが表示されます。そのタブの下に、ロガーメッセージが表示されます。 TomcatへのログインSystem.err/outはファイルに再マップされます:

UNIXでTomcatを実行する場合、コンソール出力は通常、catalina.outという名前のファイルにリダイレクトされます。 Windowsでサービスとして実行すると、コンソール出力もキャッチされてリダイレクトされますが、ファイル名は異なります。

デフォルトの場所は、Tomcatまたはドメインホームのlogsというフォルダーの下にあります。インストールされたコンソールハンドラーとSystem.errがファイルに再マップされるため、デフォルト構成では既にロガー出力がファイルに書き込まれているはずです。それはあなたが望む場所ではないかもしれません。

たとえ System.err/outが再マップされ、独自の カスタムハンドラー を作成してJVMコンソールに書き込むことができます。これは Java.io.FileDescriptor に書き込みます。

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ドキュメント でもカバーされています:

サーブレットのlogging.propertiesの例-Webアプリケーション内のWEB-INF/classesに配置されるWebアプリケーションの例:

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とは異なり、 使用できるハンドラーを宣言する 必要があることに注意してください。

ログ構成ファイルを機能させることができない場合は、サーブレットコンテキストリスナーをプロジェクトに追加し、ファイルハンドラーを手動でインストールします。

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
jmehrens

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

これはmacosでも動作します

Path path = Paths.get("/Users/",System.getProperty("user.name"),"myFiles", "logfile.log");
2
Towfik Alrazihi

プロジェクトディレクトリのクラスパスに独自のログファイルを提供できます

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
1
karthik006