无法使用 log4j2 将日志发送到 Splunk Enterprise 本地

Unable to send the logs to Splunk Enterprise local using log4j2

我在 java 中使用 log4j2 和 splunk 将日志发送到我的 Splunk Enterprise HEC(HTTP 事件收集器)Splunk Enterprise 运行 在我的本地计算机中。

我正在以编程方式进行所有 log4j2 配置。 (我知道这不是正确的方法,但我仍然出于学习目的这样做)。

我尝试使用相同的 URL 和令牌将日志直接从邮递员发送到 Splunk Enterprise 并且它工作正常,但是当我尝试使用 log4j2 从 java 发送日志时我没有在 splunk 中获取任何内容。

我的代码是=>

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilder;
import org.apache.logging.log4j.core.config.builder.api.ConfigurationBuilderFactory;
import org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration;
import org.apache.logging.log4j.core.layout.PatternLayout;
import com.splunk.logging.*;

public class Main {
private static final Logger log;

static {
  configureLog4J();
  log = LogManager.getLogger(Main.class);
}
public static void configureLog4J() {
      ConfigurationBuilder<BuiltConfiguration> builder =
              ConfigurationBuilderFactory.newConfigurationBuilder();

      // configure a splunk appender
      builder.add(
          builder.newAppender("splunkH", "SplunkHttp")
              .add(
                  builder.newLayout(PatternLayout.class.getSimpleName())
                      .addAttribute(
                          "pattern",
                          "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"
                      )
              )
              .addAttribute("sourcetype", "log4j2")
              .addAttribute("index", "main")
              .addAttribute("url", "http://localhost:8088/services/collector") //I tried this url in postman and its working fine there
              .addAttribute("token", "xxx")
              .addAttribute("disableCertificateValidation", "true")
              
              
      );

      // configure the root logger
      builder.add(
          builder.newRootLogger(Level.INFO)
              .add(builder.newAppenderRef("splunkH"))
      );

      // apply the configuration
      Configurator.initialize(builder.build());

    }//end of configureLog4J

public static void main(String ar[]) {
    log.log(Level.INFO, "Hello from log4j2");
    
    log.log(Level.ERROR, "Error from log4j2");

}//end of main method
}//end of class

我的 POM 文件

<dependencies>
    <dependency>
        <groupId>com.splunk.logging</groupId>
        <artifactId>splunk-library-javalogging</artifactId>
        <version>1.11.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.2</version>
    </dependency>


    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.11.2</version>
    </dependency>
    <dependency>
        <groupId>com.splunk</groupId>
        <artifactId>splunk</artifactId>
        <version>1.6.5.0</version>
    </dependency>

</dependencies>

<repositories>
    <repository>
        <id>splunk-artifactory</id>
        <name>Splunk Releases</name>
        <url>https://splunk.jfrog.io/splunk/ext-releases-local</url>
    </repository>
</repositories>

我在 splunk 中看不到任何日志。我错过了什么吗?

添加 .addAttribute("batch_size_count", "1") 或循环生成 10 条日志消息,因为这是 batch_size_count 的默认值。这已在 splunk 文档 "Configure Log4j 2" section.

中进行了解释

顺便说一句,我认为 services/collector 端点应该与 JSON 消息一起使用(例如 .add(builder.newLayout("JSONLayout")))。此外,您使用的是具有 Log4Shell (CVE-2021-44228) 漏洞的 log4j2 版本。它已在 2.15.0 中修复,切换到该版本和最新版本 2.17.2 之间的任何版本。

最后,我分享了问题 How to configure log4j 2.x purely programmatically? 的答案的感受,即以编程方式配置 log4j2 使用起来很麻烦。我在集群环境中遇到问题,切换到文件配置解决了我所有的问题。