Logger.cs
using System.Collections.Generic;
using Sandbox;


public class LogLevel
{
    public const string Info = "info";
    public const string Warn = "warn";
    public const string Error = "error";
}

/// <summary>
/// This is a component - in your library!
/// </summary>
[Title( "Fivemanage Logging" )]
public class Logger : Component
{
    private string apiKey;
    private bool debugMode;

    public Logger( string apiKey, bool debugMode = false )
    {
        this.apiKey = apiKey;
        this.debugMode = debugMode;

        Log.Info( "Fivemanage Logging component initialized." );
    }

    public void Message(string datasetId, string level, string message, object metadata = null,
        [System.Runtime.CompilerServices.CallerMemberName] string resource = null)
    {
        SendLog(datasetId, level, message, metadata, resource);
    }

    public void Debug(string datasetId, string message, object metadata = null,
        [System.Runtime.CompilerServices.CallerMemberName] string resource = null)
    {
        if ( !debugMode ) return;

        SendLog(datasetId, "debug", message, metadata, resource);
    }

    public void Info(string datasetId, string message, object metadata = null,
        [System.Runtime.CompilerServices.CallerMemberName] string resource = null)
    {
        SendLog(datasetId, LogLevel.Info, message, metadata, resource);
    }

    public void Warn(string datasetId, string message, object metadata = null,
        [System.Runtime.CompilerServices.CallerMemberName] string resource = null)
    {
        SendLog(datasetId, LogLevel.Warn, message, metadata, resource);
    }

    public void Error(string datasetId, string message, object metadata = null,
        [System.Runtime.CompilerServices.CallerMemberName] string resource = null)
    {
        SendLog(datasetId, LogLevel.Error, message, metadata, resource);
    }

    private async void SendLog(string datasetId, string level, string message, object metadata = null, string resource = null)
    {
        if (this.debugMode) {
            Log.Info( $"Level={level}, Message={message}, Resource={resource}, Metadata={metadata}");
        }

        var trace = Http.CreateJsonContent(new[]
        {
            new {
                level = level,
                message = message,
                metadata = metadata,
                resource = resource
            }
        });

        var headers = new Dictionary<string, string>
        {
            { "Authorization", $"{apiKey}" },
            { "X-Fivemanage-Dataset", datasetId }
        };

        var response = await Http.RequestAsync( "https://api.fivemanage.com/api/logs/batch", "POST", trace, headers );

        if ( debugMode )
        {
            Log.Info( $"Fivemanage Logging Response: {response.StatusCode}" );
        }
    }
}