Search code examples
c#xamarinloggingmvvmcross

MvvmCross custom log provider


I'm trying to implement my own log provider.

Setup.cs contains:

protected override MvxLogProviderType GetDefaultLogProviderType() => MvxLogProviderType.None;

protected override IMvxLogProvider CreateLogProvider()
{
    var logger = new Logger();
    return base.CreateLogProvider();
}

Logger.cs

public class Logger : IMvxLog
{
    public bool Log(MvxLogLevel logLevel, Func<string> messageFunc, Exception exception = null, params object[] formatParameters)
    {
        var client = new HttpClient();
        var url = new Uri("https://jsonplaceholder.typicode.com/posts/1");
        client.PostAsync(url,null);
        return true;
    }
}

It crashes with the ViewModel constructor when IoC try to resolve the dependency.

Error message:

Failed to resolve parameter for parameter log of type IMvxLog when creating eOrder.ViewModel.ActivitiesViewModel

Maybe I don't need to override MvxLogProviderType.None?


Solution

  • You return the base in CreateLogProvider() and since you set the GetDefaultLogProviderType to None, that will return null.

    The second problem is that you implement IMvxLog, and not IMvxLogProvider. Try implementing that one, and return that in the setup instead of the base.

    More information can be found at: https://www.mvvmcross.com/documentation/fundamentals/logging#customize-the-log-provider

    Not that the custom sample code there is using Serilog, and is accessing the static instance.

    protected override IMvxLogProvider CreateLogProvider()
    {
        Log.Logger = new LoggerConfiguration()
                    .MinimumLevel.Debug()
                    .WriteTo.LiterateConsole()
                    .WriteTo.AndroidLog()
                    .CreateLogger();
        return base.CreateLogProvider();
    }