Skip to content

Commit

Permalink
Add more logging methods & optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
radj307 committed Nov 12, 2023
1 parent 562de4e commit cd6c853
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 112 deletions.
104 changes: 42 additions & 62 deletions VolumeControl.Log/AsyncLogWriter.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections;
using System.Collections.Concurrent;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
Expand Down Expand Up @@ -132,11 +133,6 @@ public bool IsAsyncEnabled
#region (Private) WriteLogMessage
private void WriteLogMessage(LogMessage message)
{
if (!FilterEventType(message.EventType))
{ // event type is not enabled; don't show it
return;
}

lock (Endpoint)
{
if (!Endpoint.IsWritingEnabled) return;
Expand Down Expand Up @@ -202,6 +198,8 @@ private static string InsertLinePrefixes(string s)
}
private static string? ObjectToString(object lineObject, bool isRecursed = false)
{
lineObject.GetType();

if (lineObject is Exception ex)
{ // expand exception
return ExceptionMessageHelper.MakeExceptionMessage(ex, BlankLineHeader, Environment.NewLine, 2, ExceptionMessageHelper.MessageParts.All);
Expand Down Expand Up @@ -242,11 +240,7 @@ internal static string Indent(int maxLength, int usedLength)
#endregion (Private/Internal)

#region FilterEventType
/// <summary>
/// Checks if messages with the specified <paramref name="eventType"/> are shown in the log.
/// </summary>
/// <param name="eventType">An <see cref="EventType"/> to check.</param>
/// <returns><see langword="true"/> when the <paramref name="eventType"/> is shown; otherwise <see langword="false"/>.</returns>
/// <inheritdoc/>
public bool FilterEventType(EventType eventType)
{
return eventType == EventType.NONE
Expand Down Expand Up @@ -281,16 +275,12 @@ public void ResetEndpoint(string firstLine)
#endregion ResetEndpoint

#region LogMessage
/// <summary>
/// Writes the specified <paramref name="logMessage"/> to the log.
/// </summary>
/// <remarks>
/// When IsAsyncEnabled is <see langword="true"/>, the message is written asynchronously;
/// otherwise, the message is written synchronously and the caller will be blocked until the message has been written.
/// </remarks>
/// <param name="logMessage">The message to write to the log.</param>
public void LogMessage(LogMessage logMessage)
/// <inheritdoc/>
public bool LogMessage(LogMessage logMessage)
{
if (!FilterEventType(logMessage.EventType))
return false;

if (IsAsyncEnabled)
{
Enqueue(() => WriteLogMessage(logMessage));
Expand All @@ -299,53 +289,43 @@ public void LogMessage(LogMessage logMessage)
{
WriteLogMessage(logMessage);
}
return true;
}
#endregion LogMessage

#region EventType Writer Methods
/// <summary>
/// Queues writing a <see cref="EventType.TRACE"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Trace(params object?[] lines) => LogMessage(new(EventType.TRACE, lines));
/// <summary>
/// Queues writing a <see cref="EventType.DEBUG"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Debug(params object?[] lines) => LogMessage(new(EventType.DEBUG, lines));
/// <summary>
/// Queues writing a <see cref="EventType.INFO"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Info(params object?[] lines) => LogMessage(new(EventType.INFO, lines));
/// <summary>
/// Queues writing a <see cref="EventType.WARN"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Warning(params object?[] lines) => LogMessage(new(EventType.WARN, lines));
/// <summary>
/// Queues writing a <see cref="EventType.ERROR"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Error(params object?[] lines) => LogMessage(new(EventType.ERROR, lines));
/// <summary>
/// Queues writing a <see cref="EventType.FATAL"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Fatal(params object?[] lines) => LogMessage(new(EventType.FATAL, lines));
/// <summary>
/// Queues writing a <see cref="EventType.CRITICAL"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Critical(params object?[] lines) => LogMessage(new(EventType.CRITICAL, lines));
/// <summary>
/// Queues writing a <see cref="EventType.NONE"/> message with the specified <paramref name="lines"/>.
/// </summary>
/// <remarks>
/// This produces a message with no event type header, but a timestamp is still shown.
/// </remarks>
/// <param name="lines">Any number of objects. Each object will be written on a new line. <see langword="null"/> objects and blank strings are skipped.</param>
public void Blank(params object?[] lines) => LogMessage(new(EventType.NONE, lines));
/// <inheritdoc/>
public bool Trace(params object?[] lines) => LogMessage(new(EventType.TRACE, lines));
/// <inheritdoc/>
public bool Trace(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.TRACE));
/// <inheritdoc/>
public bool Debug(params object?[] lines) => LogMessage(new(EventType.DEBUG, lines));
/// <inheritdoc/>
public bool Debug(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.DEBUG));
/// <inheritdoc/>
public bool Info(params object?[] lines) => LogMessage(new(EventType.INFO, lines));
/// <inheritdoc/>
public bool Info(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.INFO));
/// <inheritdoc/>
public bool Warning(params object?[] lines) => LogMessage(new(EventType.WARN, lines));
/// <inheritdoc/>
public bool Warning(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.WARN));
/// <inheritdoc/>
public bool Error(params object?[] lines) => LogMessage(new(EventType.ERROR, lines));
/// <inheritdoc/>
public bool Error(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.ERROR));
/// <inheritdoc/>
public bool Fatal(params object?[] lines) => LogMessage(new(EventType.FATAL, lines));
/// <inheritdoc/>
public bool Fatal(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.FATAL));
/// <inheritdoc/>
public bool Critical(params object?[] lines) => LogMessage(new(EventType.CRITICAL, lines));
/// <inheritdoc/>
public bool Critical(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.CRITICAL));
/// <inheritdoc/>
public bool Blank(params object?[] lines) => LogMessage(new(EventType.NONE, lines));
/// <inheritdoc/>
public bool Blank(LogMessage logMessage) => LogMessage(logMessage.SetEventType(EventType.NONE));
#endregion EventType Writer Methods

#region DisableAsyncNoFlush
Expand Down
38 changes: 27 additions & 11 deletions VolumeControl.Log/FLog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,22 +119,38 @@ public static void ChangeLogPath(string newPath)
public static bool FilterEventType(EventType eventType) => Log.FilterEventType(eventType);
/// <inheritdoc cref="AsyncLogWriter.LogMessage(Log.LogMessage)"/>
public static void LogMessage(LogMessage logMessage) => Log.LogMessage(logMessage);
/// <inheritdoc cref="AsyncLogWriter.Trace"/>
public static void Trace(params object?[] lines) => Log.LogMessage(new(EventType.TRACE, lines));
/// <inheritdoc cref="AsyncLogWriter.Trace(object?[])"/>
public static bool Trace(params object?[] lines) => Log.LogMessage(new(EventType.TRACE, lines));
/// <inheritdoc cref="AsyncLogWriter.Trace(Log.LogMessage)"/>
public static bool Trace(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.TRACE));
/// <inheritdoc cref="AsyncLogWriter.Debug(object?[])"/>
public static void Debug(params object?[] lines) => Log.LogMessage(new(EventType.DEBUG, lines));
/// <inheritdoc cref="AsyncLogWriter.Info"/>
public static void Info(params object?[] lines) => Log.LogMessage(new(EventType.INFO, lines));
/// <inheritdoc cref="AsyncLogWriter.Warning"/>
public static void Warning(params object?[] lines) => Log.LogMessage(new(EventType.WARN, lines));
public static bool Debug(params object?[] lines) => Log.LogMessage(new(EventType.DEBUG, lines));
/// <inheritdoc cref="AsyncLogWriter.Debug(Log.LogMessage)"/>
public static bool Debug(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.DEBUG));
/// <inheritdoc cref="AsyncLogWriter.Info(object?[])"/>
public static bool Info(params object?[] lines) => Log.LogMessage(new(EventType.INFO, lines));
/// <inheritdoc cref="AsyncLogWriter.Info(Log.LogMessage)"/>
public static bool Info(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.INFO));
/// <inheritdoc cref="AsyncLogWriter.Warning(object?[])"/>
public static bool Warning(params object?[] lines) => Log.LogMessage(new(EventType.WARN, lines));
/// <inheritdoc cref="AsyncLogWriter.Warning(Log.LogMessage)"/>
public static bool Warning(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.WARN));
/// <inheritdoc cref="AsyncLogWriter.Error(object?[])"/>
public static void Error(params object?[] lines) => Log.LogMessage(new(EventType.ERROR, lines));
public static bool Error(params object?[] lines) => Log.LogMessage(new(EventType.ERROR, lines));
/// <inheritdoc cref="AsyncLogWriter.Error(Log.LogMessage)"/>
public static bool Error(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.ERROR));
/// <inheritdoc cref="AsyncLogWriter.Fatal(object?[])"/>
public static void Fatal(params object?[] lines) => Log.LogMessage(new(EventType.FATAL, lines));
public static bool Fatal(params object?[] lines) => Log.LogMessage(new(EventType.FATAL, lines));
/// <inheritdoc cref="AsyncLogWriter.Fatal(Log.LogMessage)"/>
public static bool Fatal(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.FATAL));
/// <inheritdoc cref="AsyncLogWriter.Critical(object?[])"/>
public static void Critical(params object?[] lines) => Log.LogMessage(new(EventType.CRITICAL, lines));
public static bool Critical(params object?[] lines) => Log.LogMessage(new(EventType.CRITICAL, lines));
/// <inheritdoc cref="AsyncLogWriter.Critical(Log.LogMessage)"/>
public static bool Critical(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.CRITICAL));
/// <inheritdoc cref="AsyncLogWriter.Blank(object?[])"/>
public static void Blank(params object?[] lines) => Log.LogMessage(new(EventType.NONE, lines));
public static bool Blank(params object?[] lines) => Log.LogMessage(new(EventType.NONE, lines));
/// <inheritdoc cref="AsyncLogWriter.Blank(Log.LogMessage)"/>
public static bool Blank(LogMessage logMessage) => Log.LogMessage(logMessage.SetEventType(EventType.NONE));
#endregion AsyncLogWriter Methods

#endregion Methods
Expand Down
Loading

0 comments on commit cd6c853

Please sign in to comment.