[slf4j-user] Does slf4j have a conflict with Spring Boot or Java Process Runtime, because it stops logging after a while
Navin Ipe
navin.ipe at searchlighthealth.com
Tue Jun 28 05:45:18 UTC 2016
Bingo. Disabling the console appender made it work.
I want to understand this properly though. Even if the logs get accumulated
in the output stream, why would the program hang? I'd have assumed the
OutputStream is on a separate thread.
Is there any way to flush it either during runtime or to place a
configuration parameter that forces auto-flushes? Already googled, but
didn't find anything that worked.
On Mon, Jun 27, 2016 at 4:59 PM, Chetan Mehrotra <chetan.mehrotra at gmail.com>
wrote:
> What happens if you try to disable the ConsoleAppender for outputter.
> Probably logs are getting accumulated in the output stream. But the
> java code is not draining it out so once it reaches the bugger limit
> it gets blocked.
> Chetan Mehrotra
>
>
> On Mon, Jun 27, 2016 at 4:22 PM, Navin Ipe
> <navin.ipe at searchlighthealth.com> wrote:
> > Confirmed. There is a problem. Even without Spring Boot. Just using
> logback
> > and slf4j. A very very simple program. It outputs upto i=1146 and then
> the
> > program hangs.
> > Why does this happen?
> >
> > You could try it yourself. The program is given below. You'll be able to
> > build and run the project without gradle too. Just use your favourite
> build
> > tool like Ant or Maven.
> >
> > First project:
> > package com.slh;
> > import java.util.concurrent.TimeUnit;
> > import org.slf4j.Logger;
> > import org.slf4j.LoggerFactory;
> >
> > public class outputter {
> >
> > private static final Logger logger =
> > LoggerFactory.getLogger(outputter.class);
> >
> > public static void main(String[] args) throws InterruptedException,
> > SQLException {
> > logger.info("Outputter started");
> > Integer i = 0;
> >
> > while(true) {
> > logger.info("i = {}", i++);
> > TimeUnit.MILLISECONDS.sleep(100);
> > }
> >
> > }
> > }
> >
> > Gradle build of first project:
> > apply plugin: 'java'
> >
> > sourceCompatibility = '1.8'
> > [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
> >
> > jar {
> > from {
> > (configurations.runtime).collect {
> > it.isDirectory() ? it : zipTree(it)
> > }
> > }
> > manifest {
> > attributes 'Main-Class': 'com.slh.outputter'
> > }
> > }
> >
> > if (!hasProperty('mainClass')) {
> > ext.mainClass = 'com.slh.outputter'
> > }
> >
> > repositories {
> > mavenCentral()
> > }
> >
> > dependencies {
> > compile "ch.qos.logback:logback-classic:1.1.3"
> > compile "ch.qos.logback:logback-core:1.1.3"
> > compile "org.slf4j:slf4j-api:1.7.12"
> > testCompile group: 'junit', name: 'junit', version: '4.10'
> > }
> >
> >
> > Second project:
> > package com.slh;
> > import java.io.IOException;
> > import org.slf4j.Logger;
> > import org.slf4j.LoggerFactory;
> >
> > public class outputtercaller {
> >
> > private static final Logger logger =
> > LoggerFactory.getLogger(outputtercaller.class);
> >
> > public static void main(String[] args) throws IOException,
> > InterruptedException {
> > Process ps;
> > logger.info("Running outputter.jar. See the log file");
> > ps = Runtime.getRuntime().exec("java -jar outputter.jar ");
> > ps.waitFor();
> > logger.info("finished running outputter.jar");
> > }
> > }
> >
> > Second project's gradle build file:
> > apply plugin: 'java'
> >
> > sourceCompatibility = '1.8'
> > [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
> >
> > jar {
> > from {
> > (configurations.runtime).collect {
> > it.isDirectory() ? it : zipTree(it)
> > }
> > }
> > manifest {
> > attributes 'Main-Class': 'com.slh.outputtercaller'
> > }
> > }
> >
> > if (!hasProperty('mainClass')) {
> > ext.mainClass = 'com.slh.outputtercaller'
> > }
> >
> > repositories {
> > mavenCentral()
> > }
> >
> > dependencies {
> > compile "ch.qos.logback:logback-classic:1.1.3"
> > compile "ch.qos.logback:logback-core:1.1.3"
> > compile "org.slf4j:slf4j-api:1.7.12"
> >
> > testCompile group: 'junit', name: 'junit', version: '4.10'
> > }
> >
> >
> > Both programs have their own logback.xml files which look like this:
> >
> > <configuration>
> > <!-- always a good activate OnConsoleStatusListener -->
> > <statusListener
> class="ch.qos.logback.core.status.OnConsoleStatusListener"
> > />
> >
> > <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
> > <!-- encoders are assigned the type
> > ch.qos.logback.classic.encoder.PatternLayoutEncoder by default
> -->
> > <encoder>
> > <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
> > %msg%n</pattern>
> > </encoder>
> > </appender>
> >
> > <appender name="FILE"
> > class="ch.qos.logback.core.rolling.RollingFileAppender">
> > <file>outputter.log</file>
> > <rollingPolicy
> > class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
> > <fileNamePattern>crystal.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
> > <maxHistory>10000</maxHistory>
> > </rollingPolicy>
> >
> > <encoder>
> > <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
> > %msg%n</pattern>
> > </encoder>
> > </appender>
> >
> > <logger name="com.slh" level="INFO"/>
> >
> >
> > <root level="debug">
> > <appender-ref ref="FILE" />
> > <appender-ref ref="STDOUT" />
> > </root>
> >
> > </configuration>
> >
> >
> >
> >
> > On Mon, Jun 27, 2016 at 10:32 AM, Navin Ipe
> > <navin.ipe at searchlighthealth.com> wrote:
> >>
> >> Hi,
> >>
> >> I'm using...
> >>
> >> import org.slf4j.Logger;
> >> import org.slf4j.LoggerFactory;
> >> static Logger logger = LoggerFactory.getLogger(MyClass.class);
> >> Process ps;
> >> ps = Runtime.getRuntime().exec("java -jar myclass.jar");
> >> ps.waitFor();
> >>
> >> MyClass is part of a Spring Boot project which uses these dependencies:
> >> dependencies {
> >> compile "ch.qos.logback:logback-classic:1.1.3"
> >> compile "ch.qos.logback:logback-core:1.1.3"
> >> compile "org.slf4j:slf4j-api:1.7.12"
> >>
> >> Problem is...
> >> myclass.jar runs fine for a while and I can see the outputs of the
> logger
> >> in myclass.log, but after a few hundred lines, there are no more log
> outputs
> >> visible. Moreover, the program itself doesn't seem to function anymore
> (the
> >> program is supposed to be writing to MySQL) but the program does not
> quit
> >> either. It just appears to hang. I left it for 14 hours like that, and
> >> nothing proceeded. There's no while loop after ps.waitFor(), and the
> code is
> >> itself not in an infinite loop. As long as the logs are written to the
> file,
> >> the program also writes to MySQL.
> >>
> >> On the other hand, if I switch off logging, the program works fine from
> >> start to end, writes to MySQL and completes running in 6 hours and exits
> >> fine.
> >>
> >> I'm considering writing a small sample program to test it out
> separately,
> >> but considered asking here in case this is a known issue.
> >>
> >>
> >> --
> >> Regards,
> >> Navin
> >
> >
> >
> >
> > --
> > Regards,
> > Navin
> >
> > _______________________________________________
> > slf4j-user mailing list
> > slf4j-user at qos.ch
> > http://mailman.qos.ch/mailman/listinfo/slf4j-user
> _______________________________________________
> slf4j-user mailing list
> slf4j-user at qos.ch
> http://mailman.qos.ch/mailman/listinfo/slf4j-user
--
Regards,
Navin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.qos.ch/pipermail/slf4j-user/attachments/20160628/be004dfb/attachment.html>
More information about the slf4j-user
mailing list