Example #1
0
        public void DeserializesRecord()
        {
            const string lex = @"
                timestamp   [0-9]{2}[.][0-9]{2}[.][0-9]{4}[T][0-9]{2}[:][0-9]{2}[:][0-9]{2}
                level       TRACE|DEBUG|INFO|WARN|ERROR|FATAL
                message     [^\r\n]+

                %x matched_level
                %%

                <INITIAL,matched_level> {
                    {timestamp} { this.Timestamp = TextAsTimestamp(""MM.dd.yyyyTHH:mm:ss""); BEGIN(INITIAL); }
                    {level} { this.Level = yytext; BEGIN(matched_level); }
                }
                <matched_level>{message} { this.Message = yytext; BEGIN(INITIAL); }
                ";

            var compiler = new LexCompiler {Diagnostics = Console.Out};
            var scanners = compiler.Compile("%%", lex);
            var taskScheduler = new TestTaskScheduler();

            var format = new LexLogFormat {
                RecordsScannerType = scanners.RecordsScannerType,
                TaskScheduler = taskScheduler
            };

            var record = format.DeserializeRecord(
                new ArraySegment<byte>(Encoding.UTF8.GetBytes("01.01.2012T15:41:23 DEBUG Hello world!\r\n")));

            taskScheduler.ExecuteAll();

            Assert.Equal(LogLevel.Debug, record.Level);
            Assert.Equal(" Hello world!", record.Message);
        }
Example #2
0
        public void ReadsSegments()
        {
            var stream = CreateStream("01.01.2012T15:41:23 DEBUG Hello world!\r\n02.01.2012T10:23:03 WARN Bye bye!");

            const string lex = @"
                start   [0-9]{2}[.][0-9]{2}[.][0-9]{4}[T][0-9]{2}[:][0-9]{2}[:][0-9]{2}
                end     \r\n
                %%
                {start} BeginSegment();
                {end} EndSegment();
                <<EOF>> EndSegment();
                ";

            var compiler = new LexCompiler {Diagnostics = Console.Out};

            var scanners = compiler.Compile(lex, "%%");

            Assert.True(scanners.Success);

            var taskScheduler = new TestTaskScheduler();

            var format = new LexLogFormat {
                SegmentsScannerType = scanners.SegmentsScannerType,
                Diagnostics = Console.Out,
                TaskScheduler = taskScheduler
            };

            var segments = new List<RecordSegment>();
            var subject = new Subject<RecordSegment>();

            subject.Subscribe(segments.Add);

            format.ReadSegments(subject, stream, CancellationToken.None);

            taskScheduler.ExecuteAll();

            var segment = segments.FirstOrDefault();

            Assert.NotNull(segment);

            stream.Position = segment.Offset;

            var buffer = new byte[segment.Length];

            stream.Read(buffer, 0, buffer.Length);

            var str = Encoding.UTF8.GetString(buffer);

            Assert.Equal("01.01.2012T15:41:23 DEBUG Hello world!", str);
        }
Example #3
0
        private static ILogFormat Compile(LexPreset preset)
        {
            var compiler = new LexCompiler();

            var directory = GetCacheDirectory();

            LexCompiler.LexFormatScanners result;

            var presetAssembly = GetCachedAssembly(preset, directory);

            if (directory.Exists)
            {
                if (presetAssembly.Exists)
                {
                    using (var fileStream = presetAssembly.OpenRead())
                        result = compiler.LoadCompiled(fileStream);

                    if (result.Success)
                    {
                        return new LexLogFormat {
                                   SegmentsScannerType = result.SegmentsScannerType,
                                   RecordsScannerType  = result.RecordsScannerType
                        }
                    }
                    ;
                }
            }
            else
            {
                directory.Create();
            }

            using (var fileStream = presetAssembly.Create())
                result = compiler.Compile(
                    string.Concat(preset.CommonCode, Environment.NewLine, preset.SegmentCode),
                    string.Concat(preset.CommonCode, Environment.NewLine, preset.RecordCode),
                    fileStream);

            if (result.Success)
            {
                return new LexLogFormat {
                           SegmentsScannerType = result.SegmentsScannerType,
                           RecordsScannerType  = result.RecordsScannerType
                }
            }
            ;

            return(null);
        }
        private static ILogFormat Compile(LexPreset preset)
        {
            var compiler = new LexCompiler();

            var directory = GetCacheDirectory();

            LexCompiler.LexFormatScanners result;

            var presetAssembly = GetCachedAssembly(preset, directory);

            if (directory.Exists) {
                if (presetAssembly.Exists) {
                    using (var fileStream = presetAssembly.OpenRead())
                        result = compiler.LoadCompiled(fileStream);

                    if (result.Success)
                        return new LexLogFormat {
                            SegmentsScannerType = result.SegmentsScannerType,
                            RecordsScannerType = result.RecordsScannerType
                        };
                }
            } else
                directory.Create();

            using (var fileStream = presetAssembly.Create())
                result = compiler.Compile(
                    string.Concat(preset.CommonCode, Environment.NewLine, preset.SegmentCode),
                    string.Concat(preset.CommonCode, Environment.NewLine, preset.RecordCode),
                    fileStream);

            if (result.Success)
                return new LexLogFormat {
                    SegmentsScannerType = result.SegmentsScannerType,
                    RecordsScannerType = result.RecordsScannerType
                };

            return null;
        }