// Copyright (C) 2017 The Android Open Source Project
//
// Licensed 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 com.ericsson.gerrit.plugins.highavailability.peers.jgroups;

import org.jgroups.logging.CustomLogFactory;
import org.jgroups.logging.Log;
import org.slf4j.LoggerFactory;

/**
 * A custom log factory which takes care to provide instances of {@link SLF4JLog}. If this factory
 * is used jgroups will use the SLF4J API to emit logging and tracing. This can be helpful when
 * gerrit is running in a runtime environment which supports SLF4J logging.
 *
 * <p>To configure jgroups to use this log factory make sure the following system property is set
 * when gerrit is started:
 *
 * <p>{@code
 * -Djgroups.logging.log_factory_class=com.ericsson.gerrit.plugins.highavailability.peers.jgroups.SLF4JLogFactory}
 */
public class SLF4JLogFactory implements CustomLogFactory {

  @Override
  public Log getLog(@SuppressWarnings("rawtypes") Class clazz) {
    return new SLF4JLog(LoggerFactory.getLogger(clazz));
  }

  @Override
  public Log getLog(String category) {
    return new SLF4JLog(LoggerFactory.getLogger(category));
  }
}
