<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <font face="Helvetica, Arial, sans-serif">David<br>
      <br>
      Thanks for your consideration. You seem to imply this shouldn't be
      happening. If so, that's great. The below initAppenders() function
      is called on startup of the server. Perhaps the way the appenders
      are being initialized and started</font><font face="Helvetica,
      Arial, sans-serif"><font face="Helvetica, Arial, sans-serif"> is
        causing the behavior. </font>Is there an alternative?<br>
      <br>
      private void initAppenders() {<br>
      <br>
            RollOverAppenderSettings debugAppender =
      AppendersFactory.getAppenderSettings(APPENDER.DEBUG);<br>
            assert debugAppender != null;<br>
            debugAppender.setLoggerName(application.getLoggerName());<br>
            debugAppender.setLogFile(getDebugLogFile());<br>
            LogUtil.addAppender(debugAppender);<br>
            <br>
            RollOverAppenderSettings auditAppender =
      AppendersFactory.getAppenderSettings(APPENDER.AUDIT);<br>
            assert auditAppender != null;<br>
            auditAppender.setLoggerName("audit-" +
      application.getLoggerName());<br>
            auditAppender.setLogFile(getAuditLogFile());<br>
            LogUtil.addAppender(auditAppender);<br>
            LogUtil.applyLogLevel("audit-" +
      application.getLoggerName(), "info");<br>
            <br>
            RollOverAppenderSettings trashAppender =
      AppendersFactory.getAppenderSettings(APPENDER.TRASH);<br>
            assert trashAppender != null;<br>
            trashAppender.setLoggerName("trash-" +
      application.getLoggerName());<br>
            trashAppender.setLogFile(getTrashLogFile());<br>
            LogUtil.addAppender(trashAppender);<br>
            LogUtil.applyLogLevel("trash-" +
      application.getLoggerName(), "info");<br>
      }<br>
      <br>
      Where the following methods are defined in LogUtil:<br>
      <br>
      public static void addAppender(RollOverAppenderSettings appender)
      {<br>
         LoggerContext loggerContext = (LoggerContext)
      LoggerFactory.getILoggerFactory();<br>
         <br>
         File logFile = appender.getLogFile();<br>
         <br>
          RollingFileAppender<ILoggingEvent> rfAppender = new
      RollingFileAppender<>();<br>
          rfAppender.setName(appender.getLoggerName());<br>
          rfAppender.setContext(loggerContext);<br>
          rfAppender.setFile(logFile.getPath());<br>
          <br>
          RollingPolicy rollingPolicy = appender.getRollingPolicy();<br>
          rollingPolicy.setParent(rfAppender);<br>
          rollingPolicy.start();<br>
          <br>
          TriggeringPolicy<ILoggingEvent> triggeringPolicy =
      appender.getTriggeringPolicy();<br>
          triggeringPolicy.start();<br>
      <br>
          PatternLayoutEncoder encoder = new PatternLayoutEncoder();<br>
          encoder.setContext(loggerContext);<br>
          encoder.setPattern(appender.getLogEntryPattern());<br>
          encoder.start();<br>
      <br>
          rfAppender.setEncoder(encoder);<br>
          rfAppender.setRollingPolicy(rollingPolicy);<br>
          rfAppender.setTriggeringPolicy(triggeringPolicy);<br>
          rfAppender.start();<br>
      <br>
          AsyncAppender asyncAppender = new AsyncAppender();<br>
         asyncAppender.setName(appender.getLoggerName());<br>
         asyncAppender.setContext(loggerContext);<br>
          asyncAppender.setQueueSize(1024);<br>
          asyncAppender.addAppender(rfAppender);<br>
          asyncAppender.start();<br>
      <br>
             ch.qos.logback.classic.Logger logbackLogger =
      loggerContext.getLogger(appender.getLoggerName());<br>
             logbackLogger.setAdditive(false);<br>
          logbackLogger.addAppender(asyncAppender);<br>
          <br>
          if (System.getProperty("stdout") != null) {<br>
              ConsoleAppender<ILoggingEvent> consoleAppender = new
      ConsoleAppender<>();<br>
              PatternLayoutEncoder stdoutEncoder = new
      PatternLayoutEncoder();<br>
              stdoutEncoder.setContext(loggerContext);<br>
              stdoutEncoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} %c{1}
      [%p] %m%n");<br>
              stdoutEncoder.start();<br>
              consoleAppender.setEncoder(stdoutEncoder);<br>
              consoleAppender.start();<br>
              logbackLogger.addAppender(consoleAppender);<br>
          }<br>
          <br>
          StatusPrinter.print(loggerContext);<br>
         logger = LoggerFactory.getLogger(appender.getLoggerName());<br>
      }<br>
      <br>
      public static void applyLogLevel(String loggerName, String
      logLevel) {<br>
         Logger log = LoggerFactory.getLogger(loggerName);<br>
         if (!(log instanceof ch.qos.logback.classic.Logger)) {<br>
            logger.debug("cannot set log level. not using logback");<br>
            return;<br>
         }<br>
         ch.qos.logback.classic.Logger logger =
      (ch.qos.logback.classic.Logger)
      LoggerFactory.getLogger(loggerName);<br>
         Level level = Level.INFO;<br>
         try {<br>
            level = Level.valueOf(logLevel.toUpperCase(Locale.ENGLISH));<br>
         } catch (Exception e) {<br>
            logger.error("invalid new log level value {level='" +
      logLevel+ "'}");<br>
         }<br>
         logger.setLevel(level);<br>
      }</font><br>
    <div class="moz-cite-prefix">On 2017/12/15 00:04, David Roussel
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:F2744C1B-E438-46B6-B88D-CB3FBC239717@diroussel.xsmail.com">
      <pre wrap="">Hi Jamie,

It’s not clear how your “multi-tennent” approach affects the loading of logback.  I guess somehow you are creating new instances of logback?

Each instance of AsyncAppender is blocking, and thus requires one thread per per AsyncAppender. 

Dave 

</pre>
      <blockquote type="cite">
        <pre wrap="">On 14 Dec 2017, at 21:28, Jamie <a class="moz-txt-link-rfc2396E" href="mailto:jamie@stimulussoft.com"><jamie@stimulussoft.com></a> wrote:

Hi

I'd appreciate guidance on  how to get Logback to use less resources in our multitenant app. It seems every time we add a new tenant, log back creates a few more async appender threads. This affects the scalability of our software. In our app, each tenant has an audit and a debug log. Async apppender is being used to write to each log respectively. Our problem is that whenever a new tenant is added, many more threads get created. it seems a new  worker thread is assigned to each appender.  Is there a way to get Logback to rather use a shared thread pool?

Stacks at 2017-12-14 10:33:57 PM (uptime 22m 24s)

AsyncAppender-Worker-audit-template [WAITING] [DAEMON]
sun.misc.Unsafe.park(boolean, long) Unsafe.java (native)
java.util.concurrent.locks.LockSupport.park(Object) LockSupport.java:175
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() AbstractQueuedSynchronizer.java:2039
java.util.concurrent.ArrayBlockingQueue.take() ArrayBlockingQueue.java:403
ch.qos.logback.core.AsyncAppenderBase$Worker.run() AsyncAppenderBase.java:289

Thanks in advance

Jamie



_______________________________________________
logback-user mailing list
<a class="moz-txt-link-abbreviated" href="mailto:logback-user@qos.ch">logback-user@qos.ch</a>
<a class="moz-txt-link-freetext" href="http://mailman.qos.ch/mailman/listinfo/logback-user">http://mailman.qos.ch/mailman/listinfo/logback-user</a>
</pre>
      </blockquote>
      <pre wrap="">
_______________________________________________
logback-user mailing list
<a class="moz-txt-link-abbreviated" href="mailto:logback-user@qos.ch">logback-user@qos.ch</a>
<a class="moz-txt-link-freetext" href="http://mailman.qos.ch/mailman/listinfo/logback-user">http://mailman.qos.ch/mailman/listinfo/logback-user</a></pre>
    </blockquote>
    <br>
    <div class="moz-signature">-- <br>
      <br>
      <img alt="Stimulus Software"
        src="cid:part1.48076E25.D83ED932@stimulussoft.com"><br>
      <p style="font-family: Helvetica, Arial, sans-serif; font-size:
        10px;"><br>
        <span style="" class="txt signature_mobilephone-input sig-hide"></span>
        <span style="font-weight: bold; display: inline;" class="txt
          signature_companyname-input sig-hide">Stimulus Software</span>
        <span style="display: inline;" class="company-sep break"><br>
        </span> <span style="display: inline;" class="txt office-sep
          sep">Office: </span> <span style="display: inline;"
          class="txt signature_officephone-input sig-hide">+1-713-343-8824</span>
        <span style="display: inline;" class="txt fax-sep sep">/ Fax: </span>
        <span style="display: inline;" class="txt signature_fax-input
          sig-hide">+1 713 357 6647</span> <span style="display:
          inline;" class="address-sep break"><br>
        </span> <span style="" class="txt signature_address-input
          sig-hide"></span> <span class="website-sep break"></span> <a
          class="link signature_website-input sig-hide"
          href="http://www.stimulussoft.com" style="text-decoration:
          none; display: inline;">http://www.stimulussoft.com</a></p>
    </div>
  </body>
</html>