#region Copyright notice and license // Copyright 2015 gRPC authors. // // 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. #endregion using System; using System.Collections.Generic; using System.Globalization; using System.IO; using Grpc.Core.Utils; namespace Grpc.Core.Logging { /// Logger that filters out messages below certain log level. public class LogLevelFilterLogger : ILogger { // Verbosity environment variable used by C core. private const string CoreVerbosityEnvVarName = "GRPC_VERBOSITY"; readonly ILogger innerLogger; readonly LogLevel logLevel; /// /// Creates and instance of LogLevelFilter. /// public LogLevelFilterLogger(ILogger logger, LogLevel logLevel) { this.innerLogger = GrpcPreconditions.CheckNotNull(logger); this.logLevel = logLevel; } /// /// Creates and instance of LogLevelFilter. /// The fromEnvironmentVariable parameter allows looking up "GRPC_VERBOSITY" setting provided by C-core /// and uses the same log level for C# logs. Using this setting is recommended as it can prevent unintentionally hiding /// C core logs requested by "GRPC_VERBOSITY" environment variable (which could happen if C# logger's log level was set to a more restrictive value). /// /// the logger to forward filtered logs to. /// the default log level, unless overriden by env variable. /// if true, override log level with setting from environment variable. public LogLevelFilterLogger(ILogger logger, LogLevel defaultLogLevel, bool fromEnvironmentVariable) : this(logger, GetLogLevelFromEnvironment(defaultLogLevel, fromEnvironmentVariable)) { } /// /// Returns a logger associated with the specified type. /// public virtual ILogger ForType() { var newInnerLogger = innerLogger.ForType(); if (object.ReferenceEquals(this.innerLogger, newInnerLogger)) { return this; } return new LogLevelFilterLogger(newInnerLogger, logLevel); } /// Logs a message with severity Debug. public void Debug(string message) { if (logLevel <= LogLevel.Debug) { innerLogger.Debug(message); } } /// Logs a formatted message with severity Debug. public void Debug(string format, params object[] formatArgs) { if (logLevel <= LogLevel.Debug) { innerLogger.Debug(format, formatArgs); } } /// Logs a message with severity Info. public void Info(string message) { if (logLevel <= LogLevel.Info) { innerLogger.Info(message); } } /// Logs a formatted message with severity Info. public void Info(string format, params object[] formatArgs) { if (logLevel <= LogLevel.Info) { innerLogger.Info(format, formatArgs); } } /// Logs a message with severity Warning. public void Warning(string message) { if (logLevel <= LogLevel.Warning) { innerLogger.Warning(message); } } /// Logs a formatted message with severity Warning. public void Warning(string format, params object[] formatArgs) { if (logLevel <= LogLevel.Warning) { innerLogger.Warning(format, formatArgs); } } /// Logs a message and an associated exception with severity Warning. public void Warning(Exception exception, string message) { if (logLevel <= LogLevel.Warning) { innerLogger.Warning(exception, message); } } /// Logs a message with severity Error. public void Error(string message) { if (logLevel <= LogLevel.Error) { innerLogger.Error(message); } } /// Logs a formatted message with severity Error. public void Error(string format, params object[] formatArgs) { if (logLevel <= LogLevel.Error) { innerLogger.Error(format, formatArgs); } } /// Logs a message and an associated exception with severity Error. public void Error(Exception exception, string message) { if (logLevel <= LogLevel.Error) { innerLogger.Error(exception, message); } } /// Get log level based on a default and lookup of GRPC_VERBOSITY environment variable. private static LogLevel GetLogLevelFromEnvironment(LogLevel defaultLogLevel, bool fromEnvironmentVariable) { if (!fromEnvironmentVariable) { return defaultLogLevel; } var verbosityString = System.Environment.GetEnvironmentVariable(CoreVerbosityEnvVarName); if (verbosityString == null) { return defaultLogLevel; } // NOTE: C core doesn't have "WARNING" log level switch (verbosityString.ToUpperInvariant()) { case "DEBUG": return LogLevel.Debug; case "INFO": return LogLevel.Info; case "ERROR": return LogLevel.Error; default: return defaultLogLevel; } } } }