无法使用 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 使用起来很麻烦。我在集群环境中遇到问题,切换到文件配置解决了我所有的问题。
我在 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 使用起来很麻烦。我在集群环境中遇到问题,切换到文件配置解决了我所有的问题。