コンソールに表示されるJava)でログメッセージを作成する方法を知っています。
Java.util.logging.Logger.getLogger(<CLASSNAME>.class.getName())
.log(Level.INFO, "LOG MESSAGE");
ただし、現在、(netbeans IDEの)Webアプリに取り組んでいます。 Webアプリでは、残念ながらロガーをコンソールに出力することはできません。
したがって、出力をファイルに転送したいと思います。
私が試したいくつかのことはうまくいきませんでした。たとえば、私は次のことを試しました。
...そして他の多くの人が、何も機能していないようです。
出力をテキストファイルに送るのがどうしてそんなに難しいのでしょうか? Javaデフォルトのロガーをファイルに直接出力する方法を知っている人はいますか?
これを試して。プロジェクトフォルダにテキストファイルを作成します。
ファイルを表示するには、必ず更新を行ってください。
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
}
}
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;
}
}
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");
プロジェクトディレクトリのクラスパスに独自のログファイルを提供できます
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