gpt4 book ai didi

java - 使用 java.util.logging API 将不同级别的日志记录到单独的文件

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:24 25 4
gpt4 key购买 nike

我想知道如何使用 java.util.logging api,以便根据使用的级别将日志消息写入不同的日志文件。如果级别是 INFO 那么我想将消息写入/log/info.log 等等。定义的 3 个级别是严重、警告和信息。

最佳答案

您使用自定义 Handlers写入日志记录。

这是一个简单但完整的示例,您可以在此基础上构建。

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class LevelBasedFileHandler extends FileHandler
{
public LevelBasedFileHandler(final Level level) throws IOException, SecurityException
{
super();
super.setLevel(level);
}

public LevelBasedFileHandler(final String s, final Level level) throws IOException, SecurityException
{
super(s);
super.setLevel(level);
}

public LevelBasedFileHandler(final String s, final boolean b, final Level level) throws IOException, SecurityException
{
super(s, b);
super.setLevel(level);
}

public LevelBasedFileHandler(final String s, final int i, final int i1, final Level level) throws IOException, SecurityException
{
super(s, i, i1);
super.setLevel(level);
}

public LevelBasedFileHandler(final String s, final int i, final int i1, final boolean b, final Level level) throws IOException, SecurityException
{
super(s, i, i1, b);
super.setLevel(level);
}

@Override
public void setLevel() { throw new UnsupportedOperationException("Can't change after construction!"); }

// This is the important part that makes it work
// it also breaks the contract in the JavaDoc for FileHandler.setLevel()
@Override
public void publish(final LogRecord logRecord)
{
if (logRecord.getLevel().equals(super.getLevel())
{
super.publish(logRecord);
}
}
}

下面是使用方法

try
{
// I use the Anonymous logger here, but any named logger will work as well
final Logger l = Logger.getAnonymousLogger();
l.addHandler(new LevelBasedFileHandler("/tmp/info.log", Level.INFO));
l.addHandler(new LevelBasedFileHandler("/tmp/warn.log", Level.WARNING));
l.addHandler(new LevelBasedFileHandler("/tmp/server.log", Level.SEVERE));

l.info("This is an INFO message");
l.warning("This is a WARNING message");
l.severe("This is a SEVERE message");
}
catch (final IOException e)
{
// ignore this for this example, you should never do this in real code
}

您将在 /tmp 中获得三个文件,每个文件仅包含每个特定日志级别的消息。

请注意,我喜欢在构造函数中要求 Level 的依赖注入(inject)样式方法,因此您在使用它时不会“忘记”调用 .setLevel()子类。我还禁用了 .setLevel() 因为调用它并更改会破坏子类的语义”

为了完整起见,您可以使用 java.util.logging.Filter 来完成同样的事情。它不是封装的,但它是另一种选择。它的代码更多、更冗长,因此更容易出错。

final FileHandler infoFileHandler = new FileHandler("/tmp/info.log");
infoFileHandler.setFilter(new Filter()
{
public boolean isLoggable(final LogRecord logRecord)
{
return logRecord.getLevel().equals(Level.INFO);
}
});

就我个人而言,我仍然更喜欢子类方法,它更不容易出错,而且更能 self 记录其目的和意图。

关于java - 使用 java.util.logging API 将不同级别的日志记录到单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7925674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com