/// <summary> /// Sets up a <see cref="BackgroundMultiLogWriter" /> that writes to <paramref name="innerLogWriter" /> on a background /// thread. /// </summary> /// <param name="innerLogWriter">The <see cref="IEntryWriter{TEntry}" /> that is written to on the background thread.</param> /// <param name="backgroundMultiLogWriter"></param> /// <param name="queueEntryWriter"> /// The returned <see cref="IQueueEntryWriter{TEntry}" />, which writes to a queue which feeds logging on the background /// thread. /// </param> /// <param name="maxQueueLength"></param> private void SetupBackgroundLogWriter <TEntry>(ILogWriter innerLogWriter, out BackgroundMultiLogWriter backgroundMultiLogWriter, out IQueueEntryWriter <TEntry> queueEntryWriter, int maxQueueLength = BackgroundMultiLogWriter.DefaultMaxQueueLength) where TEntry : ILogEntry { Contract.Requires <ArgumentNullException>(innerLogWriter != null); backgroundMultiLogWriter = new BackgroundMultiLogWriter(SetupLog); ILogWriter logWriter = backgroundMultiLogWriter.CreateProxyFor(innerLogWriter, maxQueueLength); Assert.False(backgroundMultiLogWriter.IsStarted); Assert.False((logWriter as IStartable).IsStarted); backgroundMultiLogWriter.Start(); Assert.True(backgroundMultiLogWriter.IsStarted); Assert.True((logWriter as IStartable).IsStarted); IEntryWriter <TEntry> entryWriter; Assert.True(logWriter.TryGetEntryWriter(out entryWriter)); queueEntryWriter = (IQueueEntryWriter <TEntry>)entryWriter; }
/// <summary> /// Create an <see cref="ILogWriter" /> from <paramref name="logWriterConfig" />, then proxy it as configured and log any /// errors in <see cref="SetupLog" />. /// </summary> /// <param name="logWriterConfig"></param> /// <returns></returns> internal ILogWriter CreateLogWriter(ILogWriterConfig logWriterConfig) { ILogWriter logWriter = null; try { logWriter = logWriterConfig.CreateLogWriter(SetupTracerFactory); if (logWriterConfig.BackgroundLogging) { var backgroundWriter = new BackgroundMultiLogWriter(SetupTracerFactory); _backgroundMultiLogWriters.Add(backgroundWriter); logWriter = backgroundWriter.CreateProxyFor(logWriter); backgroundWriter.Start(); } else if (!logWriter.IsSynchronized && logWriterConfig.Synchronized) { // Wrap non-synchronized LogWriters to make them threadsafe logWriter = new SynchronizingProxyLogWriter(SetupTracerFactory, logWriter); } } catch (Exception excp) { // TODO: Store initialization failure status var tracer = SetupTracerFactory.TracerFor(logWriterConfig); tracer.Severe(excp, "Exception creating logwriter from config: {0}", logWriterConfig); logWriter = null; } return(logWriter); }
public void InnerWriterExceptionsAreHandled() { var innerLogWriter = new ExceptionThrowingLogWriter <MessageEntry>(SetupLog); var backgroundMultiLogWriter = new BackgroundMultiLogWriter(SetupLog); ILogWriter logWriter = backgroundMultiLogWriter.CreateProxyFor(innerLogWriter); IEntryWriter <MessageEntry> entryWriter; Assert.True(logWriter.TryGetEntryWriter(out entryWriter)); using (backgroundMultiLogWriter) { backgroundMultiLogWriter.Start(); ExampleHelper.LogTestMessages(entryWriter, 6); } _testOutputHelper.WriteLine("Setup messages:"); _testOutputHelper.WriteEntries(SetupLog); Assert.Equal(7, SetupLog.Where((traceEntry, index) => traceEntry.TraceLevel >= TraceLevel.Error).Count()); }