Integrating Serilog in .NET MAUI for Cross-Platform Logging

A guide on setting up Serilog in .NET MAUI for structured, cross-platform logging. Covers configuration for file, console, and AppCenter sinks.

  1. Add to the builder

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            })
            .Logging.AddSerilog(Log.Logger);
    
            // Note: Comment out the template code
            //#if DEBUG
            //builder.Logging.AddDebug();            
            //#endif
    
  2. Instantiate Log.Logger at any location

    1
    2
    3
    4
    5
    6
    
    Log.Logger = new LoggerConfiguration()
            //.MinimumLevel.Debug()
            .WriteTo.File(path)
            .WriteTo.AppCenterCrashes(restrictedToMinimumLevel: LogEventLevel.Information)
            .WriteTo.Console()
            .CreateLogger();
    

    From configuration

    1
    2
    3
    
    Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();
    
    1
    2
    3
    
    // Cross-platform compatibility
    var options = new ConfigurationReaderOptions(typeof(MauiProgram).Assembly, typeof(SerilogExpression).Assembly);
    services.AddSerilog(config => { new LoggerConfiguration().ReadFrom.Configuration(configuration, options); });
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    #if ANDROID
                    var logDirectory = Android.App.Application.Context.GetExternalFilesDir(null);
                    if (logDirectory != null)
                    {
                        var logger = new LoggerConfiguration()
                        .WriteTo.File(Path.Combine(logDirectory.AbsolutePath, "log.txt"), Serilog.Events.LogEventLevel.Verbose, rollingInterval: RollingInterval.Day)
                        .CreateLogger();
                        services.AddSerilog(logger);
                    }
    #else
                    services.AddSerilog(new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger());
    #endif
    
Built with Hugo
Theme Stack designed by Jimmy