<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->

<configuration debug="false" scan="true">
  <!-- Shutdown hook ensures that async appender flushes -->
  <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>

  <!-- Status listener is used to wrap stdout/stderr and tee to log file -->
  <statusListener class="org.apache.cassandra.LogbackStatusListener" />

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

    <file>./build/test/logs/${cassandra.testtag}/TEST-${suitename}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>./build/test/logs/${cassandra.testtag}/TEST-${suitename}.log.%i.gz</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>20</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>20MB</maxFileSize>
    </triggeringPolicy>

    <encoder>
      <pattern>%-5level [%thread] %date{ISO8601} %msg%n</pattern>
      <immediateFlush>false</immediateFlush>
    </encoder>
  </appender>
  
  <appender name="STDOUT" target="System.out" class="org.apache.cassandra.ConsoleAppender">
    <encoder>
      <pattern>%-5level %date{HH:mm:ss,SSS} %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
  </appender>

  <appender name="TEE" class="org.apache.cassandra.TeeingAppender">
      <appender-ref ref="FILE"/>
      <appender-ref ref="STDOUT"/>
  </appender>

  <logger name="org.apache.hadoop" level="WARN"/>

  <!-- Do not change the name of this appender. LogbackStatusListener uses the thread name
       tied to the appender name to know when to write to real stdout/stderr vs forwarding to logback -->
  <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
      <discardingThreshold>0</discardingThreshold>
      <maxFlushTime>0</maxFlushTime>
      <queueSize>1024</queueSize>
      <appender-ref ref="TEE"/>
  </appender>

  <root level="INFO">
    <appender-ref ref="ASYNC" />
  </root>
</configuration>
