//-----------------------------------------------------------------------
//
// Copyright (c) Outercurve Foundation. All rights reserved.
//
//-----------------------------------------------------------------------
namespace DotNetOpenAuth.OpenIdOfflineProvider {
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
using DotNetOpenAuth.Logging;
///
/// Sends logging events to a .
///
///
///
/// An Appender that writes to a .
///
///
/// This appender may be used stand alone if initialized with an appropriate
/// writer, however it is typically used as a base class for an appender that
/// can open a to write to.
///
///
/// Nicko Cadell
/// Gert Driesen
/// Douglas de la Torre
internal class TextWriterLogProvider : ILogProvider {
private readonly TextBoxTextWriter _writer;
private static bool _providerIsAvailableOverride = true;
internal TextWriterLogProvider(TextBoxTextWriter writer) {
this._writer = writer;
}
///
/// Gets or sets a value indicating whether [provider is available override]. Used in tests.
///
///
/// true if [provider is available override]; otherwise, false.
///
public static bool ProviderIsAvailableOverride {
get { return _providerIsAvailableOverride; }
set { _providerIsAvailableOverride = value; }
}
public ILog GetLogger(string name) {
return new TextWriterLogger(this._writer);
}
public class TextWriterLogger : ILog {
private readonly int _skipLevel;
private TextWriter _writer;
private ITextWriterFormatter _textWriterFormatter;
private IDateTimeProvider _dateTimeProvider;
internal TextWriterLogger(TextBoxTextWriter writer) {
this._writer = writer;
this._skipLevel = 1;
this.DateTimeProvider = new UtcDateTimeProvider();
this.TextWriterFormatter = new DefaultTextWriterFormatter();
}
public interface IDateTimeProvider {
DateTime GetCurrentDateTime();
}
public interface ITextWriterFormatter {
void WriteText(TextWriter writer, LogLevel level, DateTime dateTime, string text);
}
public TextWriter Writer {
get {
return this._writer;
}
set {
this._writer = value;
}
}
public ITextWriterFormatter TextWriterFormatter {
get {
return this._textWriterFormatter;
}
set {
if (value == null) {
throw new ArgumentNullException();
}
this._textWriterFormatter = value;
}
}
public IDateTimeProvider DateTimeProvider {
get {
return this._dateTimeProvider;
}
set {
if (value == null) {
throw new ArgumentNullException();
}
this._dateTimeProvider = value;
}
}
public bool Log(LogLevel logLevel, Func messageFunc, Exception exception) {
if (messageFunc == null) {
// nothing to log..
return true;
}
string[] lines = Regex.Split(messageFunc(), "\r\n|\r|\n");
foreach (var line in lines) {
this.TextWriterFormatter.WriteText(this._writer, logLevel, this.DateTimeProvider.GetCurrentDateTime(), line);
}
this._writer.Flush();
return true;
}
public class DefaultTextWriterFormatter : ITextWriterFormatter {
public void WriteText(TextWriter writer, LogLevel level, DateTime dateTime, string text) {
string logLevelAbbreviation;
switch (level) {
case LogLevel.Info:
default:
logLevelAbbreviation = "I";
break;
case LogLevel.Debug:
logLevelAbbreviation = "D";
break;
case LogLevel.Warn:
logLevelAbbreviation = "W";
break;
case LogLevel.Error:
logLevelAbbreviation = "E";
break;
}
writer.WriteLine(
"{0}:{1} {2} [{4}]: {3}",
logLevelAbbreviation,
dateTime.ToShortDateString(),
dateTime.ToLongTimeString(),
text,
Thread.CurrentThread.GetHashCode());
}
}
public class UtcDateTimeProvider : IDateTimeProvider {
public DateTime GetCurrentDateTime() {
return DateTime.UtcNow;
}
}
}
}
}