// SPDX-FileCopyrightText: © 2021 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
//
// SPDX-License-Identifier: LGPL-3.0-or-later

package eu.mulk.quarkus.googlecloud.jsonlogging.logmanager;

import eu.mulk.quarkus.googlecloud.jsonlogging.Formatter;
import java.io.InputStream;
import java.util.Collections;
import org.jboss.logmanager.handlers.ConsoleHandler;

/**
 * A {@link ConsoleHandler} preconfigured with {@link Formatter}.
 *
 * <p>Useful as a handler for {@link java.util.logging}.
 *
 * <p>If you have a {@code logging.properties} file (see {@link
 * java.util.logging.LogManager#readConfiguration(InputStream)}), you can use this handler by
 * setting the following properties:
 *
 * <pre>{@code
 * handlers = eu.mulk.quarkus.googlecloud.jsonlogging.logmanager.ConsoleHandler
 * }</pre>
 *
 * <p><strong>Note:</strong> You can use {@code org.slf4j.bridge.SLF4JBridgeHandler} from {@code
 * org.slf4j:jul-to-slf4j} instead if you also have {@code org.jboss.slf4j:slf4j-jboss-logmanager}
 * on the class path. In comparison to this class, which relies on the relatively efficient {@link
 * org.jboss.logmanager.ExtLogRecord#wrap}, routing through SLF4J incurs additional overhead because
 * of the necessary conversions between SLF4J's log entry structure and {@link
 * java.util.logging.LogRecord}.
 *
 * <h2>Usage with Spring Boot</h2>
 *
 * <p>In case you are using Spring Boot, note that in addition to ensuring that {@code
 * org.springframework.boot.logging.java.JavaLoggingSystem} is the logging system in use (see
 * below), you need to accompany this with an entry in {@code application.properties} that points to
 * your {@code logging.properties} file:
 *
 * <pre>{@code
 * logging.config = classpath:logging.properties
 * }</pre>
 *
 * <p>In order to ensure that Spring Boot chooses {@code JavaLoggingSystem} over other
 * implementations, make sure that no other logging backends are present on the class path. A simple
 * way of doing this is by relying on {@code spring-boot-starter-logging} while excluding Logback:
 *
 * <pre>{@code
 * <dependency>
 *   <groupId>org.springframework.boot</groupId>
 *   <artifactId>spring-boot-starter</artifactId>
 *   <exclusions>
 *     <exclusion>
 *       <groupId>ch.qos.logback</groupId>
 *       <artifactId>logback-classic</artifactId>
 *     </exclusion>
 *   </exclusions>
 * </dependency>
 * }</pre>
 *
 * <p>You will probably want to include at least {@code org.jboss.slf4j:slf4j-jboss-logmanager} as
 * well. In addition, {@code org.slf4j:jcl-over-slf4j}, {@code
 * org.jboss.logmanager:log4j-jboss-logmanager}, and {@code
 * org.jboss.logmanager:log4j2-jboss-logmanager} may be useful, but are not required.
 */
@SuppressWarnings("java:S110")
public final class DefaultConsoleHandler extends ConsoleHandler {

  /** Constructs console handler with a formatter created by {@link Formatter#load}. */
  public DefaultConsoleHandler() {
    super(Formatter.load(Collections.emptyList(), Collections.emptyList()));
  }
}
