We followed the steps in below documentation for "Enable logging to HTTP Event Collector in your Java project".
http://dev.splunk.com/view/splunk-logging-java/SP-CAAAE7M
In our testing, we are seeing that Splunk logger appender is not terminating. Our java program keeps running with no exit code.
Steps to reproduce:
- Import attached code to IntelliJ IDE
- Change http collect token and url in logback.xml
- Run the main java
Unfortunately, I cannot attach files here due to fewer karma points.
here are the files:
test.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.splunk.logging.*;
public class test {
public static void main( String[] args ) {
System.out.println("This is first");
Logger logger = LoggerFactory.getLogger("splunk");
logger.info("This is a test event for Logback test");
logger.error("This is a test error for Logback test");
System.out.println("This is second");
}
}
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<Appender name="http" class="com.splunk.logging.HttpEventCollectorLogbackAppender">
<url>http://splunkheavyforwarder.dev.aws.away.black:8088</url>
<token>640D5ED1-4D44-484A-8576-F8BA16746954</token>
<disableCertificateValidation>true</disableCertificateValidation>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</Appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<logger name ="http" level="debug">
<appender-ref ref="http" />
</logger>
<root level="INFO">
<appender-ref ref="http"/>
</root>
</configuration>
Let me know in case you need additional information.
I found the answer.
The non-exiting nature of Splunk logging libraries is intentional. So it is expected behavior.
So the workaround is to create a custom middleware class like HttpEventCollectorResendMiddleware.java, in which your completed() method can check that statusCode==200 once all events have been sent. This way you can safely exit your application.
This is a known bug, which affects all of the mechanisms implemented by the splunk-library-javalogging, not just logback. Here, for example, is the Github issue for a log4j2 part. Fixes, such as this one are offered for the HttpEventCollectorResendMiddleware.java, which would fix all logging methods at once too.
No idea, why this still is not in the released JAR 😞
I found the answer.
The non-exiting nature of Splunk logging libraries is intentional. So it is expected behavior.
So the workaround is to create a custom middleware class like HttpEventCollectorResendMiddleware.java, in which your completed() method can check that statusCode==200 once all events have been sent. This way you can safely exit your application.
I'm not sure if I understand why the Splunk logging libraries don't exit. My work has been completed -- how is it supposed to shut down gracefully?
How do you check if all events have been sent? Can you please add you code for HttpEventCollectorResendMiddleware?