当前位置: 首页 > 知识库问答 >
问题:

Java日志框架,不需要在每个类上声明记录器

贾烨
2023-03-14

我试过以下伐木工人

  • Java日志API
  • Log4j
  • slf4j

所有这些都需要类级别的记录器声明,如下面的声明

private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName());
private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class);
private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class);

这在我看来很可怕,java中是否有不需要此声明的logger框架?

我在寻找的是,我可以有一个全球宣言,比如

private final static Logger Logger = Logger.getLogger(MyApp.class);

但当我打电话给Logger时。日志(…)来自XXX类。类,则记录器应使用XXX。类名。

共有2个答案

郦良才
2023-03-14

您可以使用Lombok将这两者更改为类注释。

  • @Log4j
  • @Slf4j
邢洋
2023-03-14

您的问题很可能不是日志框架,而是布局。

so35592962/App。java

package so35592962;
import org.apache.logging.log4j.*;
import so35592962.sub.OtherClass;
public class App {
  public static final Logger logger = LogManager.getLogger();
  public static void main(String[] args) {
    logger.error("in App.main");
    OtherClass.act();
  }
}

so35592962/sub/其他lass.java

package so35592962.sub;
import static so35592962.App.logger;

public class OtherClass {
  public static void act() {
    logger.error("OtherClass.act");
  }
}

所以你可以看到这完全是你想要的:使用单个记录器的类。很好,Log4J2可以用于此。

现在我添加魔法文件log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

运行此操作将打印:

12:05:28.834 [main] ERROR so35592962.App - in App.main
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act

看,这里有不同的类名!然而,我使用了Log4J2。

注意patternayout标记中使用的图案:

%d{HH: mm: ss。SSS}[%t]%-5level%C{36}-%msg%n

标准示例和您通常在互联网上看到的都使用了模式。此模式用于显示记录器名称。但你说你不想要它。幸运的是,还有其他模式<代码>%C将显示类名,而不是记录器名称。这就是这里使用的模式。

根据PatternLayout留档,%C模式执行以下操作:

输出发出日志记录请求的调用者的完全限定类名。

文件中也提到了重要注意事项:

生成调用者的类名(位置信息)是一项昂贵的操作,可能会影响性能。谨慎使用。

 类似资料:
  • 问题内容: 是否有一个Logger可以轻松记录我的堆栈跟踪记录(我得到了什么 )?我搜索了log4j文档,但未发现有关记录堆栈跟踪的任何信息。 我可以自己做 但我不想到处重复这段代码。 如果log4j不会为我执行此操作,是否还有另一个日志记录程序包将为我记录stacktrace? 谢谢。 问题答案: 使用log4j可通过以下方式完成: 第一个参数是要显示的消息,第二个参数是记录堆栈跟踪的异常(可抛

  • 我正试图提出一种优化的架构,将事件日志消息存储在Elasticsearch上。 以下是我的规格/需求: 消息是只读的;输入后,仅查询报告 因此,执行最频繁的查询将是:获取给定的所有登录项、客户id和时间戳范围。 以下是登录项的外观: 我需要帮助索引我的数据。 我一直在读什么是elasticsearch索引?使用elasticsearch为客户提供事件服务,以获得良好索引架构的想法,但我需要专业人士

  • 问题内容: 我想使用Java util日志记录按照以下格式为每个请求创建日志文件。 有人请告诉我如何使用Java util日志记录来实现这一目标? 问题答案: 该文件处理器不支持通过生成的文件名的日期和时间从日志管理。 如果要在启动时生成文件名,则可以将FileHandler子类化,并创建一个静态方法来使用SimpleDateFormat生成文件名。该日志管理支持“配置”选项,也将让您安装自定义代

  • 我使用的是播放框架,其中日志是默认的记录器引擎。为了便于跟踪,我希望将两个不同的活动(和)记录在两个单独的文件中。为此,我有两个追加器和两个记录器。每个记录器都用特定的appender标记。 我希望通过事务记录器(如登录或注册相关活动(如 但不管用。有什么想法吗? 我所说的“不工作”是指相同的日志被附加到两个记录器中,而不是特定于特定的日志。例如。如果我从播放代码调用,事务和登录记录器都将用户X已

  • ,日志记录将进入一个文件; (路径)/service_name/service_name.log 我想用logback复制这种行为,但在logback.xml配置中获取“logger”名称时遇到了真正的困难。它可以在log encoder.pattern中看到,即“%d%-5level%logger{35}-%msg%n”。

  • 问题内容: 当我使用标准模块 logging 将日志写入文件时,是否将每个日志分别刷新到磁盘?例如,以下代码是否会将日志刷新10次? 如果是这样,它会变慢吗? 问题答案: 是的,它会在每次调用时刷新输出。您可以在的源代码中看到: 我真的不会介意日志记录的性能,至少在分析和发现它是瓶颈之前不会。无论如何,您始终可以创建一个在每次调用时都不会执行的子类(即使如果发生严重异常/解释器崩溃,也可能会丢失大