/*
 * 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.
 */
package org.apache.logging.log4j.kotlin

import org.apache.logging.log4j.Level
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger
import org.apache.logging.log4j.Marker
import org.apache.logging.log4j.message.EntryMessage
import org.apache.logging.log4j.message.Message
import org.apache.logging.log4j.spi.ExtendedLogger
import org.apache.logging.log4j.util.MessageSupplier
import org.apache.logging.log4j.util.Supplier
import kotlin.reflect.full.companionObject

/**
 * An adapter supporting cleaner syntax when calling a logger via Kotlin. A Kotlin lambda can
 * easily be passed to Log4j2 as a `Supplier` via Kotlin's automatic conversion from lambda's to
 * SAM types. However, the compiler selects the incorrect overload of the method unless the lambda
 * type is specified explicitly as `Supplier`, resulting in the lambda itself being logged rather than
 * its evaluation.
 *
 * To avoid this, this delegate provides logging methods that take a native Kotlin Lambda as argument, and
 * then delegate to the underlying Log4j2 method taking a `Supplier`. Just as the Supplier-methods in
 * Log4j2, this does not evaluate the lambda, if the logging level is not enabled.
 *
 * Therefore, one can use Kotlin's String interpolation for logging without the performance impact of
 * evaluating the parameters if the level is not enabled e.g.:
 *
 * ```
 * log.debug { "Value a = $a" }
 * ```
 *
 * In addition, the overloads provide methods in which the lambda is the *last* parameter rather than
 * the first as in the regular Log4j2 API. This means one can use Kotlin's last parameter lambda
 * outside of parentheses syntax e.g.:
 *
 * ```
 * log.error(exc) { "Unexpected exception evaluating $whatever." }
 * ```
 *
 * Finally, the adapter also provides a `runInTrace` utility that avoids having to call traceEnter and traceExit
 * and catch manually. Rather, simply call the `trace` method, passing in an [EntryMessage] and the block to
 * execute within trace enter/exit/catch calls. Location-awareness is currently broken for trace logging with this
 * method as the ExtendedLogger does not expose the enter/exit/catch calls with the FQCN parameter.
 *
 * An implementation note: while Kotlin's delegation capabilities would normally allow this implementation to be
 * significantly less verbose by automatically delegating most methods to the ExtendedLogger delegate, this
 * would break location-awareness, since the ExtendedLogger delegate assumes its own FQCN is the root of the
 * logging stack. We therefore explicitly delegate to the ExtendedLogger.logIfEnabled method, passing in our own
 * FQCN for appropriate location awareness.
 *
 * TODO: The ExtendedLogger interface does not yet have support for trace entry and exit with FQCN specification.
 * Therefore, until the Log4j2 API is updated and then this code is updated to match, location awareness will not
 * work for these calls.
 */
@Suppress("UNUSED", "MemberVisibilityCanBePrivate")
class KotlinLogger(private val delegate: ExtendedLogger): Logger by delegate {
  companion object {
    val FQCN: String = KotlinLogger::class.java.name
    fun <T: Any?> (() -> T).asLog4jSupplier(): Supplier<T> = Supplier { invoke() }
    fun <T: Any?> (Array<out () -> T>).asLog4jSuppliers(): Array<Supplier<T>> = map { it.asLog4jSupplier() }.toTypedArray()
  }

  override fun log(level: Level, marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, null)
  }

  override fun log(level: Level, marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, t)
  }

  override fun log(level: Level, marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, null)
  }

  override fun log(level: Level, marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, t)
  }

  override fun log(level: Level, marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, null)
  }

  override fun log(level: Level, marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, null as Throwable?)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, *params)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, t)
  }

  override fun log(level: Level, msg: Message?) {
    delegate.logIfEnabled(FQCN, level, null, msg, null)
  }

  override fun log(level: Level, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, null, msg, t)
  }

  override fun log(level: Level, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, level, null, msg, null)
  }

  override fun log(level: Level, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, null, msg, t)
  }

  override fun log(level: Level, msg: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, null)
  }

  override fun log(level: Level, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, null, msg, t)
  }

  override fun log(level: Level, msg: String?) {
    delegate.logIfEnabled(FQCN, level, null, msg, null as Throwable?)
  }

  override fun log(level: Level, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, *params)
  }

  override fun log(level: Level, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, null, msg, t)
  }

  override fun log(level: Level, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, level, null, msgSupplier, null)
  }

  fun log(level: Level, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, level, null, supplier.asLog4jSupplier(), null)
  }

  override fun log(level: Level, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, null, msgSupplier, t)
  }

  fun log(level: Level, t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, level, null, supplier.asLog4jSupplier(), t)
  }

  override fun log(level: Level, marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, level, marker, msgSupplier, null)
  }

  fun log(level: Level, marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, level, marker, supplier.asLog4jSupplier(), null)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, *paramSuppliers)
  }

  fun log(level: Level, marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun log(level: Level, marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, marker, msgSupplier, t)
  }

  fun log(level: Level, marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, level, marker, supplier.asLog4jSupplier(), t)
  }

  override fun log(level: Level, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, level, null, msg, *paramSuppliers)
  }

  fun log(level: Level, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(Marker, () -> Any?>)"))
  override fun log(level: Level, marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, level, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(Marker, Throwable, () -> Any?>)"))
  override fun log(level: Level, marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(() -> Any?>)"))
  override fun log(level: Level, messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, level, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(Throwable, () -> Any?>)"))
  override fun log(level: Level, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, null, msgSupplier, t)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p2, p2)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun log(level: Level, marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun log(level: Level, marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, level, marker, msg, t)
  }

  override fun log(level: Level, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3, p4)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun log(level: Level, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, level, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun trace(marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, null)
  }

  override fun trace(marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, t)
  }

  override fun trace(marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, null)
  }

  override fun trace(marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, t)
  }

  override fun trace(marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, null)
  }

  override fun trace(marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, null as Throwable?)
  }

  override fun trace(marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, *params)
  }

  override fun trace(marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, t)
  }

  override fun trace(msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, null)
  }

  override fun trace(msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, t)
  }

  override fun trace(msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, null)
  }

  override fun trace(msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, t)
  }

  override fun trace(msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, null)
  }

  override fun trace(msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, t)
  }

  override fun trace(msg: String?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, null as Throwable?)
  }

  override fun trace(msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, *params)
  }

  override fun trace(msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, t)
  }

  override fun trace(msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, null)
  }

  fun trace(supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, supplier.asLog4jSupplier(), null)
  }

  override fun trace(msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, t)
  }

  fun trace(t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, supplier.asLog4jSupplier(), t)
  }

  override fun trace(marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, null)
  }

  fun trace(marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, supplier.asLog4jSupplier(), null)
  }

  override fun trace(marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, *paramSuppliers)
  }

  fun trace(marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun trace(marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, t)
  }

  fun trace(marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, supplier.asLog4jSupplier(), t)
  }

  override fun trace(msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, *paramSuppliers)
  }

  fun trace(msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(Marker, () -> Any?>)"))
  override fun trace(marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(Marker, Throwable, () -> Any?>)"))
  override fun trace(marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(() -> Any?>)"))
  override fun trace(messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.trace(Throwable, () -> Any?>)"))
  override fun trace(msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msgSupplier, t)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p2, p2)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun trace(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun trace(marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, marker, msg, t)
  }

  override fun trace(msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3, p4)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun trace(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.TRACE, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  // TODO entry with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceEntry(): EntryMessage {
    return delegate.traceEntry()
  }

  // TODO entry with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceEntry(format: String?, vararg params: Any?): EntryMessage {
    return delegate.traceEntry(format, *params)
  }

  // TODO entry with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceEntry(vararg paramSuppliers: Supplier<*>?): EntryMessage {
    return delegate.traceEntry(*paramSuppliers)
  }

  fun traceEntry(vararg paramSuppliers: () -> Any?): EntryMessage {
    return delegate.traceEntry(*paramSuppliers.asLog4jSuppliers())
  }

  // TODO entry with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceEntry(format: String?, vararg paramSuppliers: Supplier<*>?): EntryMessage {
    return delegate.traceEntry(format, *paramSuppliers)
  }

  fun traceEntry(format: String?, vararg paramSuppliers: () -> Any?): EntryMessage {
    return delegate.traceEntry(format, *paramSuppliers.asLog4jSuppliers())
  }

  // TODO entry with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceEntry(message: Message?): EntryMessage {
    return delegate.traceEntry(message)
  }

  // TODO exit with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceExit() {
    delegate.traceExit()
  }

  // TODO exit with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun <R : Any?> traceExit(format: String?, result: R): R {
    return delegate.traceExit(format, result)
  }

  // TODO exit with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun <R : Any?> traceExit(message: Message?, result: R): R {
    return delegate.traceExit(message, result)
  }

  // TODO exit with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun traceExit(message: EntryMessage?) {
    delegate.traceExit(message)
  }

  // TODO exit with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun <R : Any?> traceExit(result: R): R {
    return delegate.traceExit(result)
  }

  // TODO exit with fqcn is not part of the ExtendedLogger interface, location-awareness will be broken
  override fun <R : Any?> traceExit(message: EntryMessage?, result: R): R {
    return delegate.traceExit(message, result)
  }

  fun <R : Any?> runInTrace(block: () -> R): R {
    return runInTrace(traceEntry(), block)
  }

  fun <R : Any?> runInTrace(entryMessage: EntryMessage, block: () -> R): R {
    return try {
      val result = block()
      when(result) {
        Unit -> traceExit(entryMessage)
        else -> traceExit(entryMessage, result)
      }
      result
    } catch (e: Throwable) {
      catching(e)
      throw e
    }
  }

  override fun debug(marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, null)
  }

  override fun debug(marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, t)
  }

  override fun debug(marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, null)
  }

  override fun debug(marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, t)
  }

  override fun debug(marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, null)
  }

  override fun debug(marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, null as Throwable?)
  }

  override fun debug(marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, *params)
  }

  override fun debug(marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, t)
  }

  override fun debug(msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, null)
  }

  override fun debug(msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, t)
  }

  override fun debug(msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, null)
  }

  override fun debug(msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, t)
  }

  override fun debug(msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, null)
  }

  override fun debug(msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, t)
  }

  override fun debug(msg: String?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, null as Throwable?)
  }

  override fun debug(msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, *params)
  }

  override fun debug(msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, t)
  }

  override fun debug(msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, null)
  }

  fun debug(supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, supplier.asLog4jSupplier(), null)
  }

  override fun debug(msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, t)
  }

  fun debug(t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, supplier.asLog4jSupplier(), t)
  }

  override fun debug(marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, null)
  }

  fun debug(marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, supplier.asLog4jSupplier(), null)
  }

  override fun debug(marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, *paramSuppliers)
  }

  fun debug(marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun debug(marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, t)
  }

  fun debug(marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, supplier.asLog4jSupplier(), t)
  }

  override fun debug(msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, *paramSuppliers)
  }

  fun debug(msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.debug(Marker, () -> Any?>)"))
  override fun debug(marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.debug(Marker, Throwable, () -> Any?>)"))
  override fun debug(marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.debug(() -> Any?>)"))
  override fun debug(messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.debug(Throwable, () -> Any?>)"))
  override fun debug(msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msgSupplier, t)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p2, p2)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun debug(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun debug(marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, marker, msg, t)
  }

  override fun debug(msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3, p4)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun debug(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.DEBUG, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun info(marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, null)
  }

  override fun info(marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, t)
  }

  override fun info(marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, null)
  }

  override fun info(marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, t)
  }

  override fun info(marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, null)
  }

  override fun info(marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, null as Throwable?)
  }

  override fun info(marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, *params)
  }

  override fun info(marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, t)
  }

  override fun info(msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, null)
  }

  override fun info(msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, t)
  }

  override fun info(msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, null)
  }

  override fun info(msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, t)
  }

  override fun info(msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, null)
  }

  override fun info(msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, t)
  }

  override fun info(msg: String?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, null as Throwable?)
  }

  override fun info(msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, *params)
  }

  override fun info(msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, t)
  }

  override fun info(msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msgSupplier, null)
  }

  fun info(supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, supplier.asLog4jSupplier(), null)
  }

  override fun info(msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msgSupplier, t)
  }

  fun info(t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, supplier.asLog4jSupplier(), t)
  }

  override fun info(marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, null)
  }

  fun info(marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, supplier.asLog4jSupplier(), null)
  }

  override fun info(marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, *paramSuppliers)
  }

  fun info(marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun info(marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, t)
  }

  fun info(marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, supplier.asLog4jSupplier(), t)
  }

  override fun info(msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, *paramSuppliers)
  }

  fun info(msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.info(Marker, () -> Any?>)"))
  override fun info(marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.info(Marker, Throwable, () -> Any?>)"))
  override fun info(marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.info(() -> Any?>)"))
  override fun info(messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.info(Throwable, () -> Any?>)"))
  override fun info(msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msgSupplier, t)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p2, p2)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun info(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun info(marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.INFO, marker, msg, t)
  }

  override fun info(msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3, p4)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun info(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.INFO, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun warn(marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, null)
  }

  override fun warn(marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, t)
  }

  override fun warn(marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, null)
  }

  override fun warn(marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, t)
  }

  override fun warn(marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, null)
  }

  override fun warn(marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, null as Throwable?)
  }

  override fun warn(marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, *params)
  }

  override fun warn(marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, t)
  }

  override fun warn(msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, null)
  }

  override fun warn(msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, t)
  }

  override fun warn(msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, null)
  }

  override fun warn(msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, t)
  }

  override fun warn(msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, null)
  }

  override fun warn(msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, t)
  }

  override fun warn(msg: String?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, null as Throwable?)
  }

  override fun warn(msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, *params)
  }

  override fun warn(msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, t)
  }

  override fun warn(msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msgSupplier, null)
  }

  fun warn(supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, supplier.asLog4jSupplier(), null)
  }

  override fun warn(msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msgSupplier, t)
  }

  fun warn(t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, supplier.asLog4jSupplier(), t)
  }

  override fun warn(marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, null)
  }

  fun warn(marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, supplier.asLog4jSupplier(), null)
  }

  override fun warn(marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, *paramSuppliers)
  }

  fun warn(marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun warn(marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, t)
  }

  fun warn(marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, supplier.asLog4jSupplier(), t)
  }

  override fun warn(msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, *paramSuppliers)
  }

  fun warn(msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.warn(Marker, () -> Any?>)"))
  override fun warn(marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.warn(Marker, Throwable, () -> Any?>)"))
  override fun warn(marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.warn(() -> Any?>)"))
  override fun warn(messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.warn(Throwable, () -> Any?>)"))
  override fun warn(msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msgSupplier, t)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p2, p2)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun warn(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun warn(marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.WARN, marker, msg, t)
  }

  override fun warn(msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3, p4)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun warn(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.WARN, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun error(marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, null)
  }

  override fun error(marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, t)
  }

  override fun error(marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, null)
  }

  override fun error(marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, t)
  }

  override fun error(marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, null)
  }

  override fun error(marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, null as Throwable?)
  }

  override fun error(marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, *params)
  }

  override fun error(marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, t)
  }

  override fun error(msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, null)
  }

  override fun error(msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, t)
  }

  override fun error(msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, null)
  }

  override fun error(msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, t)
  }

  override fun error(msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, null)
  }

  override fun error(msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, t)
  }

  override fun error(msg: String?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, null as Throwable?)
  }

  override fun error(msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, *params)
  }

  override fun error(msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, t)
  }

  override fun error(msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, null)
  }

  fun error(supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, supplier.asLog4jSupplier(), null)
  }

  override fun error(msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, t)
  }

  fun error(t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, supplier.asLog4jSupplier(), t)
  }

  override fun error(marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, null)
  }

  fun error(marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, supplier.asLog4jSupplier(), null)
  }

  override fun error(marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, *paramSuppliers)
  }

  fun error(marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun error(marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, t)
  }

  fun error(marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, supplier.asLog4jSupplier(), t)
  }

  override fun error(msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, *paramSuppliers)
  }

  fun error(msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.error(Marker, () -> Any?>)"))
  override fun error(marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.error(Marker, Throwable, () -> Any?>)"))
  override fun error(marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.error(() -> Any?>)"))
  override fun error(messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.error(Throwable, () -> Any?>)"))
  override fun error(msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msgSupplier, t)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p2, p2)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun error(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun error(marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, marker, msg, t)
  }

  override fun error(msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3, p4)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun error(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.ERROR, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun fatal(marker: Marker?, msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, null)
  }

  override fun fatal(marker: Marker?, msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, t)
  }

  override fun fatal(marker: Marker?, msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, null)
  }

  override fun fatal(marker: Marker?, msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, t)
  }

  override fun fatal(marker: Marker?, msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, null)
  }

  override fun fatal(marker: Marker?, msg: String?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, null as Throwable?)
  }

  override fun fatal(marker: Marker?, msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, *params)
  }

  override fun fatal(marker: Marker?, msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, t)
  }

  override fun fatal(msg: Message?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, null)
  }

  override fun fatal(msg: Message?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, t)
  }

  override fun fatal(msg: CharSequence?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, null)
  }

  override fun fatal(msg: CharSequence?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, t)
  }

  override fun fatal(msg: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, null)
  }

  override fun fatal(msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, t)
  }

  override fun fatal(msg: String?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, null as Throwable?)
  }

  override fun fatal(msg: String?, vararg params: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, *params)
  }

  override fun fatal(msg: String?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, t)
  }

  override fun fatal(msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, null)
  }

  fun fatal(supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, supplier.asLog4jSupplier(), null)
  }

  override fun fatal(msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, t)
  }

  fun fatal(t: Throwable, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, supplier.asLog4jSupplier(), t)
  }

  override fun fatal(marker: Marker?, msgSupplier: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, null)
  }

  fun fatal(marker: Marker?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, supplier.asLog4jSupplier(), null)
  }

  override fun fatal(marker: Marker?, msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, *paramSuppliers)
  }

  fun fatal(marker: Marker?, msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, *paramSuppliers.asLog4jSuppliers())
  }

  override fun fatal(marker: Marker?, msgSupplier: Supplier<*>?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, t)
  }

  fun fatal(marker: Marker?, t: Throwable?, supplier: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, supplier.asLog4jSupplier(), t)
  }

  override fun fatal(msg: String?, vararg paramSuppliers: Supplier<*>?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, *paramSuppliers)
  }

  fun fatal(msg: String?, vararg paramSuppliers: () -> Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, *paramSuppliers.asLog4jSuppliers())
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.fatal(Marker, () -> Any?>)"))
  override fun fatal(marker: Marker?, msgSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.fatal(Marker, Throwable, () -> Any?>)"))
  override fun fatal(marker: Marker?, msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msgSupplier, t)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.fatal(() -> Any?>)"))
  override fun fatal(messageSupplier: MessageSupplier?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, messageSupplier, null)
  }

  @Deprecated("Use lambda methods.", ReplaceWith("delegate.fatal(Throwable, () -> Any?>)"))
  override fun fatal(msgSupplier: MessageSupplier?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msgSupplier, t)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p2, p2)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3, p4)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun fatal(marker: Marker?, msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }

  override fun fatal(marker: Marker?, msg: Any?, t: Throwable?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, marker, msg, t)
  }

  override fun fatal(msg: String?, p0: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3, p4)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3, p4, p5)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3, p4, p5, p6)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3, p4, p5, p6, p7)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8)
  }

  override fun fatal(msg: String?, p0: Any?, p1: Any?, p2: Any?, p3: Any?, p4: Any?, p5: Any?, p6: Any?, p7: Any?, p8: Any?, p9: Any?) {
    delegate.logIfEnabled(FQCN, Level.FATAL, null, msg, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)
  }
}
