Search code examples
wpfprismunity-containerenterprise-library

WPF, Prism, Unitybootstrapper, and Enterprise Library Logging setup throwing LogWriter exception


I'm just trying to get up off the ground and get used to working with Prism, in my bootstrapper I have:

public class Bootstrapper : UnityBootstrapper
{

    private readonly EnterpriseLibraryLoggerAdapter _logger =  new EnterpriseLibraryLoggerAdapter();  

    protected override void InitializeShell()
    {
        base.InitializeShell();

        Application.Current.MainWindow = (Shell)this.Shell;
        Application.Current.MainWindow.Show();
    }

    protected override DependencyObject CreateShell()
    {
        return this.Container.Resolve<Shell>();
    }

    protected override ILoggerFacade CreateLogger()
        {
              return _logger; 
        }

for my App OnStartup:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        Bootstrapper bootstrapper = new Bootstrapper();
        bootstrapper.Run();
    }
}

And the logging adapter

public class EnterpriseLibraryLoggerAdapter : ILoggerFacade
{
    #region ILoggerFacade Members

    public void Log(string message, Category category, Priority priority)
    {
        Logger.Write(message, category.ToString(), (int)priority); // <--Blows up here 
    }

    #endregion
}

When the bootstrapper Runs, it hits the Logger.Write and throws an exception:

The type LogWriter does not have an accessible constructor.

I'm following from the StockTraderRI sample app. Am I missing a registration somewhere?


Solution

  • moved the configuration to my bootstrapper constructor and things seem to be working

     var builder = new ConfigurationSourceBuilder();
            builder.ConfigureLogging()
                .WithOptions
                .DoNotRevertImpersonation()
                .LogToCategoryNamed("Debug")
                .SendTo.FlatFile("Basic Log File")
                .FormatWith(new FormatterBuilder()
                                .TextFormatterNamed("Text Formatter")
                                .UsingTemplate(
                                    "Timestamp: {timestamp}{newline}Message: {message}{newline}Category: {category}{newline}"))
                .ToFile("core.log")
                .SendTo.RollingFile("Rolling Log files")
                .RollAfterSize(1024)
                .ToFile("RollingTest.log")
                .LogToCategoryNamed("General")
                    .WithOptions.SetAsDefaultCategory()
                    .SendTo.SharedListenerNamed("Basic Log File");
    
            var configSource = new DictionaryConfigurationSource();
            builder.UpdateConfigurationWithReplace(configSource);
            EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);