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默认记录器到文件吗?
试试这个.它将在项目文件夹中创建一个文本文件.
请确保刷新以查看该文件.
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)
我希望能够在我的 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)
| 归档时间: |
|
| 查看次数: |
7616 次 |
| 最近记录: |