#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 logs to an arbitrary System.IO.TextWriter. public class TextWriterLogger : ILogger { // Format similar enough to C core log format except nanosecond precision is not supported. const string DateTimeFormatString = "MMdd HH:mm:ss.ffffff"; readonly Func textWriterProvider; readonly Type forType; readonly string forTypeString; /// /// Creates a console logger not associated to any specific type and writes to given System.IO.TextWriter. /// User is responsible for providing an instance of TextWriter that is thread-safe. /// public TextWriterLogger(TextWriter textWriter) : this(() => textWriter) { GrpcPreconditions.CheckNotNull(textWriter); } /// /// Creates a console logger not associated to any specific type and writes to a System.IO.TextWriter obtained from given provider. /// User is responsible for providing an instance of TextWriter that is thread-safe. /// public TextWriterLogger(Func textWriterProvider) : this(textWriterProvider, null) { } /// Creates a console logger that logs messsage specific for given type. protected TextWriterLogger(Func textWriterProvider, Type forType) { this.textWriterProvider = GrpcPreconditions.CheckNotNull(textWriterProvider); this.forType = forType; if (forType != null) { var namespaceStr = forType.Namespace ?? ""; if (namespaceStr.Length > 0) { namespaceStr += "."; } this.forTypeString = namespaceStr + forType.Name + " "; } else { this.forTypeString = ""; } } /// /// Returns a logger associated with the specified type. /// public virtual ILogger ForType() { if (typeof(T) == forType) { return this; } return new TextWriterLogger(this.textWriterProvider, typeof(T)); } /// Logs a message with severity Debug. public void Debug(string message) { Log("D", message); } /// Logs a formatted message with severity Debug. public void Debug(string format, params object[] formatArgs) { Debug(string.Format(format, formatArgs)); } /// Logs a message with severity Info. public void Info(string message) { Log("I", message); } /// Logs a formatted message with severity Info. public void Info(string format, params object[] formatArgs) { Info(string.Format(format, formatArgs)); } /// Logs a message with severity Warning. public void Warning(string message) { Log("W", message); } /// Logs a formatted message with severity Warning. public void Warning(string format, params object[] formatArgs) { Warning(string.Format(format, formatArgs)); } /// Logs a message and an associated exception with severity Warning. public void Warning(Exception exception, string message) { Warning(message + " " + exception); } /// Logs a message with severity Error. public void Error(string message) { Log("E", message); } /// Logs a formatted message with severity Error. public void Error(string format, params object[] formatArgs) { Error(string.Format(format, formatArgs)); } /// Logs a message and an associated exception with severity Error. public void Error(Exception exception, string message) { Error(message + " " + exception); } /// Gets the type associated with this logger. protected Type AssociatedType { get { return forType; } } private void Log(string severityString, string message) { textWriterProvider().WriteLine("{0}{1} {2}{3}", severityString, DateTime.Now.ToString(DateTimeFormatString, CultureInfo.InvariantCulture), forTypeString, message); } } }