/// <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;
        }
Esempio n. 2
0
        /// <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());
        }