繁体   English   中英

如何用Java登录到文件?

[英]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.util.logging

其中一个与Java 4及更高版本捆绑在一起,位于java.util.logging包中。 此其他答案涵盖此选项。 讨论这里甲骨文网站上。 虽然有用,但许多人认为这并非最佳选择。

log4j

也许最著名的是log4j 该框架是最早发明的健壮的灵活日志记录框架之一。 该产品最初由IBM发布 ,后来捐赠给Apache基金会。

slf4j和登录

log4j的主要发明者之一CekiGülcü将从他从该项目中学到的知识从头开始。 结果是一对产品。 slf4j是用于记录的接口,用作独立实现之前的外观 实际上,slf4j包含一个非常简单的实现,恰当地命名为SimpleLogger ,但是您可能需要在生产中使用另一个支持实现。

登陆回

Gülcü发起的另一个项目是Logback 该产品直接实现slf4j接口。 Logback功能齐全且功能强大。 可以将其视为下一代log4j,但可以重新构建。 Gülcü串联构建了slf4j和Logback,两者相互影响,意在成为一个很好的组合。

但是,您不是Logback的唯一选择。 那是创建slf4j的目的,以便在您的代码中仅使用slf4j调用的同时实现多种选择。 这样,您可以更改支持的实现,而无需对整个项目源代码中的所有日志记录调用进行任何更改。

AVSL

slf4j的另一个直接实现是用Scala AVSL (一种非常简单的记录器)编写的。

slf4j适配器

适配器使您可以使用最初不是为slf4接口设计的其他日志记录框架。 至少有两个可用, 一个用于java.util.logging框架另一个用于log4j

建议

我强烈推荐slf4j。 接口与各种可能的后端分离的想法对我来说很有意义。 特别是考虑到日志记录意味着那么多行代码遍布您的所有代码。 能够在不干扰源代码的情况下交换后端是一种很棒的享受。 此外,slf4j是根据过去的经验创建的,并且本身已经使用多年了,因此它应该是可靠且值得信赖的选择。

如果您有使用log4j或java.util.logging的旧项目,则可以使用适配器安装slf4j来进行新的日志记录调用。 您可以选择用新的slf4j调用逐渐替换旧的日志记录调用,从而使您可以自由选择是否最终更改实现。

对于新项目,您可以使用slf4j并可能选择Logback作为支持实现。 知道如果Logback步履蹒跚,那么您可以轻松地入睡,可以轻松切换到另一个实现。

但是,有比我在这里描述的更多的选择。 因此,您可能想进一步货比三家。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM