예제 #1
0
        public async Task ExecuteAsync_InsertAllMessagesAfter50ms_Ok()
        {
            var sqlServerMock = new Mock <ISqlServerBulk>();

            sqlServerMock.Setup(
                v => v.ExecuteAsync(It.IsAny <ICollection <YadlMessage> >(), It.IsAny <CancellationToken>()))
            .Returns(() => Task.CompletedTask);

            var options = new YadlLoggerOptions
            {
                BatchSize   = 100,
                BatchPeriod = 50
            };

            var yadlProcessor = new YadlProcessor(options);
            var hostedService = new TimedHostedService(yadlProcessor, options, sqlServerMock.Object);

            await hostedService.StartAsync(CancellationToken.None);

            for (int i = 1; i <= 15; i++)
            {
                _ = yadlProcessor !.ChannelWriter.TryWrite(new YadlMessage
                {
                    Message          = $"MSG: {i}",
                    Level            = 1,
                    LevelDescription = "Debug",
                    TimeStamp        = DateTimeOffset.Now
                });
            }

            await hostedService.StopAsync(CancellationToken.None);

            yadlProcessor.Messages.Should().BeEmpty();
        }
예제 #2
0
        public YadlLoggerProvider(IYadlProcessor processor, YadlLoggerOptions options)
        {
            _options   = options;
            _processor = processor;

            if (_options == null)
            {
                throw new ArgumentNullException(nameof(_options));
            }

            if (_processor == null)
            {
                throw new ArgumentNullException(nameof(_processor));
            }

            if (_options.BatchSize <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(_options.BatchSize),
                                                      $"{nameof(_options.BatchSize)} must be a positive number.");
            }

            if (string.IsNullOrEmpty(_options.ConnectionString))
            {
                throw new ArgumentNullException(nameof(_options.ConnectionString),
                                                $"{nameof(_options.ConnectionString)} cannot be null or empty.");
            }

            if (string.IsNullOrEmpty(_options.TableDestination))
            {
                throw new ArgumentNullException(nameof(_options.TableDestination),
                                                $"{nameof(_options.TableDestination)} cannot be null or empty.");
            }
        }
예제 #3
0
        public async Task ExecuteAsync_CountMessagesMoreThanBatchSize_Ok()
        {
            var sqlServerMock = new Mock <ISqlServerBulk>();

            sqlServerMock.Setup(
                v => v.ExecuteAsync(It.IsAny <ICollection <YadlMessage> >(), It.IsAny <CancellationToken>()))
            .Returns(() => Task.CompletedTask);

            var options = new YadlLoggerOptions
            {
                BatchSize = 100
            };

            var yadlProcessor = new YadlProcessor(options);
            var hostedService = new CoreLoggerHostedService(yadlProcessor, options, sqlServerMock.Object);

            await hostedService.StartAsync(CancellationToken.None);

            for (int i = 1; i <= 250; i++)
            {
                _ = yadlProcessor !.ChannelWriter.TryWrite(new YadlMessage
                {
                    Message          = $"MSG: {i}",
                    Level            = 1,
                    LevelDescription = "Debug",
                    TimeStamp        = DateTimeOffset.Now
                });
            }

            await Task.Delay(25);

            await hostedService.StopAsync(CancellationToken.None);

            yadlProcessor.Messages.Should().HaveCount(50);
        }
예제 #4
0
        public TimedHostedService(IYadlProcessor processor,
                                  YadlLoggerOptions options, ISqlServerBulk sqlServerBulk)
        {
            _processor     = processor;
            _options       = options;
            _sqlServerBulk = sqlServerBulk;

            _memberLock = new object();
        }
예제 #5
0
        public YadlProcessor(YadlLoggerOptions options)
        {
            _options = options;

            if (_options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            Channel = System.Threading.Channels.Channel.CreateUnbounded <YadlMessage>(
                new UnboundedChannelOptions
            {
                SingleReader = false,
                SingleWriter = true
            });

            Messages = new ConcurrentBag <YadlMessage>();

            ChannelReader = Channel.Reader;
            ChannelWriter = Channel.Writer;
        }
예제 #6
0
 public SqlServerBulk(YadlLoggerOptions options)
 {
     _options = options;
 }
예제 #7
0
 public YadlLogger(string name, YadlLoggerOptions options, IYadlProcessor processor)
 {
     _name      = name;
     _options   = options;
     _processor = processor;
 }