| // Copyright (C) 2020 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.google.gerrit.util.logging; |
| |
| import com.google.common.flogger.AbstractLogger; |
| import com.google.common.flogger.LogContext; |
| import com.google.common.flogger.LoggingApi; |
| import com.google.common.flogger.backend.LoggerBackend; |
| import com.google.common.flogger.backend.Platform; |
| import com.google.common.flogger.parser.DefaultPrintfMessageParser; |
| import com.google.common.flogger.parser.MessageParser; |
| import java.util.logging.Level; |
| |
| /** |
| * FluentLogger.forEnclosingClass() searches for caller class name and passes it as String to |
| * constructor FluentLogger.FluentLogger(LoggerBackend) (which is package protected). |
| * |
| * <p>This allows to create NamedFluentLogger with given name so that dedicated configuration can be |
| * specified by a custom appender in the log4j.properties file. An example of this is the logger |
| * used by the replication queue in the replication plugin, and gerrit's Garbage Collection log. |
| */ |
| public class NamedFluentLogger extends AbstractLogger<NamedFluentLogger.Api> { |
| /** Copied from FluentLogger */ |
| public interface Api extends LoggingApi<Api> {} |
| |
| /** Copied from FluentLogger */ |
| private static final class NoOp extends LoggingApi.NoOp<Api> implements Api {} |
| |
| private static final NoOp NO_OP = new NoOp(); |
| |
| public static NamedFluentLogger forName(String name) { |
| return new NamedFluentLogger(Platform.getBackend(name)); |
| } |
| |
| private NamedFluentLogger(LoggerBackend backend) { |
| super(backend); |
| } |
| |
| @Override |
| public Api at(Level level) { |
| boolean isLoggable = isLoggable(level); |
| boolean isForced = Platform.shouldForceLogging(getName(), level, isLoggable); |
| return (isLoggable || isForced) ? new Context(level, isForced) : NO_OP; |
| } |
| |
| /** Copied from FluentLogger */ |
| private final class Context extends LogContext<NamedFluentLogger, Api> implements Api { |
| private Context(Level level, boolean isForced) { |
| super(level, isForced); |
| } |
| |
| @Override |
| protected NamedFluentLogger getLogger() { |
| return NamedFluentLogger.this; |
| } |
| |
| @Override |
| protected Api api() { |
| return this; |
| } |
| |
| @Override |
| protected Api noOp() { |
| return NO_OP; |
| } |
| |
| @Override |
| protected MessageParser getMessageParser() { |
| return DefaultPrintfMessageParser.getInstance(); |
| } |
| } |
| } |