[英]How to log to a file in Java?
如何使用java Logger创建写入磁盘(即文件)的日志(错误,信息日志和基准测试)? 我想将每个日志记录都放在一行上。
先感谢您。
在下面找到一个简单的示例,说明如何使用Java核心java.util.logging.Logger。 如果没有强制性的理由使用它,我建议您研究一下其中一种Java日志记录框架(大多数情况下它们更容易配置)。
package sub.optimal.logger;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class CustomFormatter extends Formatter {
private static final String format = "%1tH:%<tM:%<tS %2$-7s %3$s (%4$s) %5$s%6$s%n";
private static final Date date = new Date();
@Override
public String format(LogRecord record) {
date.setTime(record.getMillis());
String source = "";
if (record.getSourceClassName() != null) {
source = record.getSourceClassName();
if (record.getSourceMethodName() != null) {
source += " " + record.getSourceMethodName();
}
}
String message = formatMessage(record);
String throwable = "";
if (record.getThrown() != null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println();
record.getThrown().printStackTrace(pw);
pw.close();
throwable = sw.toString();
}
return String.format(format,
date,
record.getLevel().getName(),
record.getLoggerName(),
source,
message,
throwable);
}
}
。
package sub.optimal.logger;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author SubOptimal
*/
public class Main {
public static void main(String[] args) throws Exception {
new Main().loggerDemo();
}
private void loggerDemo() throws IOException, SecurityException {
Logger logger = Logger.getLogger("MyLogger");
// don't forward any logging to this logger to his parent
logger.setUseParentHandlers(false);
// log messages of all level
logger.setLevel(Level.ALL);
// define the logfile
FileHandler fh = new FileHandler("my_log_file.log");
logger.addHandler(fh);
// a Formatter with a custom format
CustomFormatter formatter = new CustomFormatter();
fh.setFormatter(formatter);
// few logging examples
logger.config("message as logger.config");
logger.fine("message as logger.fine");
logger.finer("message as logger.finer");
logger.finest("message as logger.finest");
logger.info("message as logger.info");
logger.severe("message as logger.severe");
logger.warning("message as logger.warning");
}
}
Java世界提供了多种框架选择来帮助完成日志工作。
日志记录可能会变得很复杂。 您可能要禁用或启用各种严重级别的日志消息。 您可能需要在开发过程中配置日志记录以连接到IDE中的控制台,同时对测试进行不同的配置,而对生产进行不同的配置。 您可能希望日志记录转到文本文件, 消息队列 ,数据库,触发电子邮件或SMS文本消息,设置警报灯(谁知道)。 灵活的日志记录框架可以为您提供所有帮助。
其中一个与Java 4及更高版本捆绑在一起,位于java.util.logging包中。 此其他答案涵盖此选项。 讨论这里甲骨文网站上。 虽然有用,但许多人认为这并非最佳选择。
也许最著名的是log4j 。 该框架是最早发明的健壮的灵活日志记录框架之一。 该产品最初由IBM发布 ,后来捐赠给Apache基金会。
log4j的主要发明者之一CekiGülcü将从他从该项目中学到的知识从头开始。 结果是一对产品。 slf4j是用于记录的接口,用作独立实现之前的外观 。 实际上,slf4j包含一个非常简单的实现,恰当地命名为SimpleLogger ,但是您可能需要在生产中使用另一个支持实现。
Gülcü发起的另一个项目是Logback 。 该产品直接实现slf4j接口。 Logback功能齐全且功能强大。 可以将其视为下一代log4j,但可以重新构建。 Gülcü串联构建了slf4j和Logback,两者相互影响,意在成为一个很好的组合。
但是,您不是Logback的唯一选择。 那是创建slf4j的目的,以便在您的代码中仅使用slf4j调用的同时实现多种选择。 这样,您可以更改支持的实现,而无需对整个项目源代码中的所有日志记录调用进行任何更改。
slf4j的另一个直接实现是用Scala AVSL (一种非常简单的记录器)编写的。
适配器使您可以使用最初不是为slf4接口设计的其他日志记录框架。 至少有两个可用, 一个用于java.util.logging框架 , 另一个用于log4j 。
我强烈推荐slf4j。 接口与各种可能的后端分离的想法对我来说很有意义。 特别是考虑到日志记录意味着那么多行代码遍布您的所有代码。 能够在不干扰源代码的情况下交换后端是一种很棒的享受。 此外,slf4j是根据过去的经验创建的,并且本身已经使用多年了,因此它应该是可靠且值得信赖的选择。
如果您有使用log4j或java.util.logging的旧项目,则可以使用适配器安装slf4j来进行新的日志记录调用。 您可以选择用新的slf4j调用逐渐替换旧的日志记录调用,从而使您可以自由选择是否最终更改实现。
对于新项目,您可以使用slf4j并可能选择Logback作为支持实现。 知道如果Logback步履蹒跚,那么您可以轻松地入睡,可以轻松切换到另一个实现。
但是,有比我在这里描述的更多的选择。 因此,您可能想进一步货比三家。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.