@@ -1,105 +0,0 @@ | |||
using System; | |||
using System.Threading.Tasks; | |||
namespace Discord.Logging | |||
{ | |||
internal class LogManager | |||
{ | |||
public LogSeverity Level { get; } | |||
private Logger ClientLogger { get; } | |||
public event Func<LogMessage, Task> Message { add { _messageEvent.Add(value); } remove { _messageEvent.Remove(value); } } | |||
private readonly AsyncEvent<Func<LogMessage, Task>> _messageEvent = new AsyncEvent<Func<LogMessage, Task>>(); | |||
public LogManager(LogSeverity minSeverity) | |||
{ | |||
Level = minSeverity; | |||
ClientLogger = new Logger(this, "Discord"); | |||
} | |||
public async Task LogAsync(LogSeverity severity, string source, Exception ex) | |||
{ | |||
try | |||
{ | |||
if (severity <= Level) | |||
await _messageEvent.InvokeAsync(new LogMessage(severity, source, null, ex)).ConfigureAwait(false); | |||
} | |||
catch | |||
{ | |||
// ignored | |||
} | |||
} | |||
public async Task LogAsync(LogSeverity severity, string source, string message, Exception ex = null) | |||
{ | |||
try | |||
{ | |||
if (severity <= Level) | |||
await _messageEvent.InvokeAsync(new LogMessage(severity, source, message, ex)).ConfigureAwait(false); | |||
} | |||
catch | |||
{ | |||
// ignored | |||
} | |||
} | |||
public async Task LogAsync(LogSeverity severity, string source, FormattableString message, Exception ex = null) | |||
{ | |||
try | |||
{ | |||
if (severity <= Level) | |||
await _messageEvent.InvokeAsync(new LogMessage(severity, source, message.ToString(), ex)).ConfigureAwait(false); | |||
} | |||
catch { } | |||
} | |||
public Task ErrorAsync(string source, Exception ex) | |||
=> LogAsync(LogSeverity.Error, source, ex); | |||
public Task ErrorAsync(string source, string message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Error, source, message, ex); | |||
public Task ErrorAsync(string source, FormattableString message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Error, source, message, ex); | |||
public Task WarningAsync(string source, Exception ex) | |||
=> LogAsync(LogSeverity.Warning, source, ex); | |||
public Task WarningAsync(string source, string message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Warning, source, message, ex); | |||
public Task WarningAsync(string source, FormattableString message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Warning, source, message, ex); | |||
public Task InfoAsync(string source, Exception ex) | |||
=> LogAsync(LogSeverity.Info, source, ex); | |||
public Task InfoAsync(string source, string message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Info, source, message, ex); | |||
public Task InfoAsync(string source, FormattableString message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Info, source, message, ex); | |||
public Task VerboseAsync(string source, Exception ex) | |||
=> LogAsync(LogSeverity.Verbose, source, ex); | |||
public Task VerboseAsync(string source, string message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Verbose, source, message, ex); | |||
public Task VerboseAsync(string source, FormattableString message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Verbose, source, message, ex); | |||
public Task DebugAsync(string source, Exception ex) | |||
=> LogAsync(LogSeverity.Debug, source, ex); | |||
public Task DebugAsync(string source, string message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Debug, source, message, ex); | |||
public Task DebugAsync(string source, FormattableString message, Exception ex = null) | |||
=> LogAsync(LogSeverity.Debug, source, message, ex); | |||
public Logger CreateLogger(string name) => new Logger(this, name); | |||
public async Task WriteInitialLog() | |||
{ | |||
await ClientLogger.InfoAsync($"Discord.Net v{DiscordConfig.Version} (API v{DiscordConfig.APIVersion})").ConfigureAwait(false); | |||
} | |||
} | |||
} |
@@ -1,136 +0,0 @@ | |||
using System; | |||
using System.Text; | |||
namespace Discord | |||
{ | |||
/// <summary> | |||
/// Provides a message object used for logging purposes. | |||
/// </summary> | |||
public struct LogMessage | |||
{ | |||
/// <summary> | |||
/// Gets the severity of the log entry. | |||
/// </summary> | |||
/// <returns> | |||
/// A <see cref="LogSeverity"/> enum to indicate the severeness of the incident or event. | |||
/// </returns> | |||
public LogSeverity Severity { get; } | |||
/// <summary> | |||
/// Gets the source of the log entry. | |||
/// </summary> | |||
/// <returns> | |||
/// A string representing the source of the log entry. | |||
/// </returns> | |||
public string Source { get; } | |||
/// <summary> | |||
/// Gets the message of this log entry. | |||
/// </summary> | |||
/// <returns> | |||
/// A string containing the message of this log entry. | |||
/// </returns> | |||
public string Message { get; } | |||
/// <summary> | |||
/// Gets the exception of this log entry. | |||
/// </summary> | |||
/// <returns> | |||
/// An <see cref="Discord.LogMessage.Exception" /> object associated with an incident; otherwise <c>null</c>. | |||
/// </returns> | |||
public Exception Exception { get; } | |||
/// <summary> | |||
/// Initializes a new <see cref="LogMessage"/> struct with the severity, source, message of the event, and | |||
/// optionally, an exception. | |||
/// </summary> | |||
/// <param name="severity">The severity of the event.</param> | |||
/// <param name="source">The source of the event.</param> | |||
/// <param name="message">The message of the event.</param> | |||
/// <param name="exception">The exception of the event.</param> | |||
public LogMessage(LogSeverity severity, string source, string message, Exception exception = null) | |||
{ | |||
Severity = severity; | |||
Source = source; | |||
Message = message; | |||
Exception = exception; | |||
} | |||
public override string ToString() => ToString(); | |||
public string ToString(StringBuilder builder = null, bool fullException = true, bool prependTimestamp = true, DateTimeKind timestampKind = DateTimeKind.Local, int? padSource = 11) | |||
{ | |||
string sourceName = Source; | |||
string message = Message; | |||
string exMessage = fullException ? Exception?.ToString() : Exception?.Message; | |||
int maxLength = 1 + | |||
(prependTimestamp ? 8 : 0) + 1 + | |||
(padSource.HasValue ? padSource.Value : sourceName?.Length ?? 0) + 1 + | |||
(message?.Length ?? 0) + | |||
(exMessage?.Length ?? 0) + 3; | |||
if (builder == null) | |||
builder = new StringBuilder(maxLength); | |||
else | |||
{ | |||
builder.Clear(); | |||
builder.EnsureCapacity(maxLength); | |||
} | |||
if (prependTimestamp) | |||
{ | |||
DateTime now; | |||
if (timestampKind == DateTimeKind.Utc) | |||
now = DateTime.UtcNow; | |||
else | |||
now = DateTime.Now; | |||
if (now.Hour < 10) | |||
builder.Append('0'); | |||
builder.Append(now.Hour); | |||
builder.Append(':'); | |||
if (now.Minute < 10) | |||
builder.Append('0'); | |||
builder.Append(now.Minute); | |||
builder.Append(':'); | |||
if (now.Second < 10) | |||
builder.Append('0'); | |||
builder.Append(now.Second); | |||
builder.Append(' '); | |||
} | |||
if (sourceName != null) | |||
{ | |||
if (padSource.HasValue) | |||
{ | |||
if (sourceName.Length < padSource.Value) | |||
{ | |||
builder.Append(sourceName); | |||
builder.Append(' ', padSource.Value - sourceName.Length); | |||
} | |||
else if (sourceName.Length > padSource.Value) | |||
builder.Append(sourceName.Substring(0, padSource.Value)); | |||
else | |||
builder.Append(sourceName); | |||
} | |||
builder.Append(' '); | |||
} | |||
if (!string.IsNullOrEmpty(Message)) | |||
{ | |||
for (int i = 0; i < message.Length; i++) | |||
{ | |||
//Strip control chars | |||
char c = message[i]; | |||
if (!char.IsControl(c)) | |||
builder.Append(c); | |||
} | |||
} | |||
if (exMessage != null) | |||
{ | |||
if (!string.IsNullOrEmpty(Message)) | |||
{ | |||
builder.Append(':'); | |||
builder.AppendLine(); | |||
} | |||
builder.Append(exMessage); | |||
} | |||
return builder.ToString(); | |||
} | |||
} | |||
} |
@@ -1,34 +0,0 @@ | |||
namespace Discord | |||
{ | |||
/// <summary> | |||
/// Specifies the severity of the log message. | |||
/// </summary> | |||
public enum LogSeverity | |||
{ | |||
/// <summary> | |||
/// Logs that contain the most severe level of error. This type of error indicate that immediate attention | |||
/// may be required. | |||
/// </summary> | |||
Critical = 0, | |||
/// <summary> | |||
/// Logs that highlight when the flow of execution is stopped due to a failure. | |||
/// </summary> | |||
Error = 1, | |||
/// <summary> | |||
/// Logs that highlight an abnormal activity in the flow of execution. | |||
/// </summary> | |||
Warning = 2, | |||
/// <summary> | |||
/// Logs that track the general flow of the application. | |||
/// </summary> | |||
Info = 3, | |||
/// <summary> | |||
/// Logs that are used for interactive investigation during development. | |||
/// </summary> | |||
Verbose = 4, | |||
/// <summary> | |||
/// Logs that contain the most detailed messages. | |||
/// </summary> | |||
Debug = 5 | |||
} | |||
} |
@@ -1,72 +0,0 @@ | |||
using System; | |||
using System.Threading.Tasks; | |||
namespace Discord.Logging | |||
{ | |||
internal class Logger | |||
{ | |||
private readonly LogManager _manager; | |||
public string Name { get; } | |||
public LogSeverity Level => _manager.Level; | |||
public Logger(LogManager manager, string name) | |||
{ | |||
_manager = manager; | |||
Name = name; | |||
} | |||
public Task LogAsync(LogSeverity severity, Exception exception = null) | |||
=> _manager.LogAsync(severity, Name, exception); | |||
public Task LogAsync(LogSeverity severity, string message, Exception exception = null) | |||
=> _manager.LogAsync(severity, Name, message, exception); | |||
public Task LogAsync(LogSeverity severity, FormattableString message, Exception exception = null) | |||
=> _manager.LogAsync(severity, Name, message, exception); | |||
public Task ErrorAsync(Exception exception) | |||
=> _manager.ErrorAsync(Name, exception); | |||
public Task ErrorAsync(string message, Exception exception = null) | |||
=> _manager.ErrorAsync(Name, message, exception); | |||
public Task ErrorAsync(FormattableString message, Exception exception = null) | |||
=> _manager.ErrorAsync(Name, message, exception); | |||
public Task WarningAsync(Exception exception) | |||
=> _manager.WarningAsync(Name, exception); | |||
public Task WarningAsync(string message, Exception exception = null) | |||
=> _manager.WarningAsync(Name, message, exception); | |||
public Task WarningAsync(FormattableString message, Exception exception = null) | |||
=> _manager.WarningAsync(Name, message, exception); | |||
public Task InfoAsync(Exception exception) | |||
=> _manager.InfoAsync(Name, exception); | |||
public Task InfoAsync(string message, Exception exception = null) | |||
=> _manager.InfoAsync(Name, message, exception); | |||
public Task InfoAsync(FormattableString message, Exception exception = null) | |||
=> _manager.InfoAsync(Name, message, exception); | |||
public Task VerboseAsync(Exception exception) | |||
=> _manager.VerboseAsync(Name, exception); | |||
public Task VerboseAsync(string message, Exception exception = null) | |||
=> _manager.VerboseAsync(Name, message, exception); | |||
public Task VerboseAsync(FormattableString message, Exception exception = null) | |||
=> _manager.VerboseAsync(Name, message, exception); | |||
public Task DebugAsync(Exception exception) | |||
=> _manager.DebugAsync(Name, exception); | |||
public Task DebugAsync(string message, Exception exception = null) | |||
=> _manager.DebugAsync(Name, message, exception); | |||
public Task DebugAsync(FormattableString message, Exception exception = null) | |||
=> _manager.DebugAsync(Name, message, exception); | |||
} | |||
} |