示例#1
0
        public void reading_and_writing_CKExceptionData_with_BinaryWriter_and_BinaryReader()
        {
            var dataE0 = CKExceptionData.CreateFrom(ThrowAggregatedException());
            var dataE1 = CKExceptionData.CreateFrom(ThrowSimpleException("Test Message"));
            var dataE2 = CKExceptionData.CreateFrom(ThrowLoaderException());
            var dataE3 = CKExceptionData.CreateFrom(ThrowExceptionWithInner());
            var dataE4 = CKExceptionData.CreateFrom(ThrowTwoInnerExceptions());

            using (var mem = new MemoryStream())
            {
                CKBinaryWriter w = new CKBinaryWriter(mem);
                dataE0.Write(w);
                dataE1.Write(w);
                dataE2.Write(w);
                dataE3.Write(w);
                dataE4.Write(w);
                mem.Position = 0;
                var r     = new CKBinaryReader(mem);
                var data0 = new CKExceptionData(r, StringAndStringBuilderExtension.IsCRLF);
                data0.ToString().Should().Be(dataE0.ToString());
                var data1 = new CKExceptionData(r, StringAndStringBuilderExtension.IsCRLF);
                data1.ToString().Should().Be(dataE1.ToString());
                var data2 = new CKExceptionData(r, StringAndStringBuilderExtension.IsCRLF);
                data2.ToString().Should().Be(dataE2.ToString());
                var data3 = new CKExceptionData(r, StringAndStringBuilderExtension.IsCRLF);
                data3.ToString().Should().Be(dataE3.ToString());
                var data4 = new CKExceptionData(r, StringAndStringBuilderExtension.IsCRLF);
                data4.ToString().Should().Be(dataE4.ToString());
            }
        }
示例#2
0
        private static void CheckSimpleExceptionData(CKExceptionData simpleData, Func <string, bool> message, bool?hasInner = null, bool hasStack = true)
        {
            message(simpleData.Message).Should().BeTrue("Invalid message.");
            simpleData.ExceptionTypeName.Should().Be("Exception");
            simpleData.ExceptionTypeAssemblyQualifiedName.Should().Be(typeof(Exception).AssemblyQualifiedName);

            if (hasStack)
            {
                simpleData.StackTrace.Should().NotBeNull("Stack trace is not null when the exception has actually been thrown.");
            }
            else
            {
                simpleData.StackTrace.Should().BeNull();
            }

            if (hasInner.HasValue)
            {
                if (hasInner.Value)
                {
                    simpleData.InnerException.Should().NotBeNull();
                }
                else
                {
                    simpleData.InnerException.Should().BeNull();
                }
            }
            simpleData.AggregatedExceptions.Should().BeNull();
            simpleData.LoaderExceptions.Should().BeNull();
        }
示例#3
0
        private static void CheckSimpleExceptionData(CKExceptionData simpleData, Func <string, bool> message, bool?hasInner = null, bool hasStack = true)
        {
            Assert.That(message(simpleData.Message), "Invalid message.");
            Assert.That(simpleData.ExceptionTypeName, Is.EqualTo("Exception"));
            Assert.That(simpleData.ExceptionTypeAssemblyQualifiedName, Is.EqualTo(typeof(Exception).AssemblyQualifiedName));

            if (hasStack)
            {
                Assert.That(simpleData.StackTrace, Is.Not.Null, "Stack trace is not null when the exception has actually been thrown.");
            }
            else
            {
                Assert.That(simpleData.StackTrace, Is.Null);
            }

            if (hasInner.HasValue)
            {
                if (hasInner.Value)
                {
                    Assert.That(simpleData.InnerException, Is.Not.Null);
                }
                else
                {
                    Assert.That(simpleData.InnerException, Is.Null);
                }
            }
            Assert.That(simpleData.AggregatedExceptions, Is.Null);
            Assert.That(simpleData.LoaderExceptions, Is.Null);
        }
示例#4
0
        public void reading_and_writing_CKExceptionData_with_Standard_Serialization()
        {
            var dataE0 = CKExceptionData.CreateFrom(ThrowAggregatedException());
            var dataE1 = CKExceptionData.CreateFrom(ThrowSimpleException("Test Message"));
            var dataE2 = CKExceptionData.CreateFrom(ThrowLoaderException());
            var dataE3 = CKExceptionData.CreateFrom(ThrowExceptionWithInner());
            var dataE4 = CKExceptionData.CreateFrom(ThrowTwoInnerExceptions());

            BinaryFormatter f = new BinaryFormatter();

            using (var mem = new MemoryStream())
            {
                f.Serialize(mem, dataE0);
                f.Serialize(mem, dataE1);
                f.Serialize(mem, dataE2);
                f.Serialize(mem, dataE3);
                f.Serialize(mem, dataE4);
                mem.Position = 0;
                var data0 = (CKExceptionData)f.Deserialize(mem);
                data0.ToString().Should().Be(dataE0.ToString());
                var data1 = (CKExceptionData)f.Deserialize(mem);
                data1.ToString().Should().Be(dataE1.ToString());
                var data2 = (CKExceptionData)f.Deserialize(mem);
                data2.ToString().Should().Be(dataE2.ToString());
                var data3 = (CKExceptionData)f.Deserialize(mem);
                data3.ToString().Should().Be(dataE3.ToString());
                var data4 = (CKExceptionData)f.Deserialize(mem);
                data4.ToString().Should().Be(dataE4.ToString());
            }
        }
示例#5
0
        public void FromSimplestException()
        {
            CheckSimpleExceptionData(CKExceptionData.CreateFrom(new Exception("")), s => s == "", false, false);

            var simpleData = CKExceptionData.CreateFrom(ThrowSimpleException("Test"));

            CheckSimpleExceptionData(simpleData, s => s == "Test", false, true);
        }
示例#6
0
        public void WithInnerExceptions()
        {
            Exception e = ThrowExceptionWithInner();
            var       d = CKExceptionData.CreateFrom(e);

            CheckSimpleExceptionData(d, s => s == "Outer", true);
            CheckSimpleExceptionData(d.InnerException, s => s == "Inner", false);
        }
示例#7
0
 public LEOpenGroup(LEMCOpenGroup e)
 {
     _text       = e.Text;
     _time       = e.LogTime;
     _fileName   = e.FileName;
     _lineNumber = e.LineNumber;
     _level      = e.LogLevel;
     _tags       = e.Tags;
     _ex         = e.Exception;
 }
示例#8
0
 public LEOpenGroup(string text, DateTimeStamp t, string fileName, int lineNumber, LogLevel l, CKTrait tags, CKExceptionData ex)
 {
     _text       = text;
     _time       = t;
     _fileName   = fileName;
     _lineNumber = lineNumber;
     _level      = l;
     _tags       = tags;
     _ex         = ex;
 }
        public void LogEntry_write_and_read_back()
        {
            var exInner = new CKExceptionData("message", "typeof(exception)", "assemblyQualifiedName", "stackTrace", null, "fileName", "fusionLog", null, null);
            var ex2     = new CKExceptionData("message2", "typeof(exception2)", "assemblyQualifiedName2", "stackTrace2", exInner, "fileName2", "fusionLog2", null, null);
            var exL     = new CKExceptionData("loader-message", "typeof(loader-exception)", "loader-assemblyQualifiedName", "loader-stackTrace", null, "loader-fileName", "loader-fusionLog", null, null);
            var exAgg   = new CKExceptionData("agg-message", "typeof(agg-exception)", "agg-assemblyQualifiedName", "agg-stackTrace", ex2, "fileName", "fusionLog", null, new[] { ex2, exL });

            var       prevLog = DateTimeStamp.UtcNow;
            ILogEntry e1      = LogEntry.CreateLog("Text1", new DateTimeStamp(DateTime.UtcNow, 42), LogLevel.Info, "c:\\test.cs", 3712, ActivityMonitor.Tags.CreateDependentToken, exAgg);
            ILogEntry e2      = LogEntry.CreateMulticastLog("GOId", "3712", LogEntryType.Line, prevLog, 5, "Text2", DateTimeStamp.UtcNow, LogLevel.Fatal, null, 3712, ActivityMonitor.Tags.CreateDependentToken, exAgg);;

            using (var mem = new MemoryStream())
                using (var w = new CKBinaryWriter(mem))
                {
                    w.Write(LogReader.CurrentStreamVersion);
                    e1.WriteLogEntry(w);
                    e2.WriteLogEntry(w);
                    w.Write((byte)0);
                    w.Flush();

                    byte[] versionBytes = new byte[4];
                    mem.Position = 0;
                    mem.Read(versionBytes, 0, 4);
                    BitConverter.ToInt32(versionBytes, 0).Should().Be(LogReader.CurrentStreamVersion);

                    using (var reader = new LogReader(mem, LogReader.CurrentStreamVersion, 4))
                    {
                        reader.MoveNext().Should().BeTrue();
                        reader.Current.Text.Should().Be(e1.Text);
                        reader.Current.LogLevel.Should().Be(e1.LogLevel);
                        reader.Current.LogTime.Should().Be(e1.LogTime);
                        reader.Current.FileName.Should().Be(e1.FileName);
                        reader.Current.LineNumber.Should().Be(e1.LineNumber);
                        reader.Current.Exception.ExceptionTypeAssemblyQualifiedName.Should().Be(e1.Exception.ExceptionTypeAssemblyQualifiedName);
                        reader.Current.Exception.ToString().Should().Be(e1.Exception.ToString());

                        reader.MoveNext().Should().BeTrue();
                        reader.CurrentMulticast.GrandOutputId.Should().Be("GOId");
                        reader.CurrentMulticast.MonitorId.Should().Be("3712");
                        reader.CurrentMulticast.PreviousEntryType.Should().Be(LogEntryType.Line);
                        reader.CurrentMulticast.PreviousLogTime.Should().Be(prevLog);
                        reader.Current.Text.Should().Be(e2.Text);
                        reader.Current.LogTime.Should().Be(e2.LogTime);
                        reader.Current.FileName.Should().BeNull();
                        reader.Current.LineNumber.Should().Be(0, "Since no file name is set, line number is 0.");
                        reader.Current.Exception.ExceptionTypeAssemblyQualifiedName.Should().Be(e2.Exception.ExceptionTypeAssemblyQualifiedName);
                        reader.Current.Exception.ToString().Should().Be(e2.Exception.ToString());

                        reader.MoveNext().Should().BeFalse();
                        reader.BadEndOfFileMarker.Should().BeFalse();
                    }
                }
        }
示例#10
0
        public void LogEntryReadWrite()
        {
            var exInner = new CKExceptionData("message", "typeof(exception)", "assemblyQualifiedName", "stackTrace", null, "fileName", "fusionLog", null, null);
            var ex2     = new CKExceptionData("message2", "typeof(exception2)", "assemblyQualifiedName2", "stackTrace2", exInner, "fileName2", "fusionLog2", null, null);
            var exL     = new CKExceptionData("loader-message", "typeof(loader-exception)", "loader-assemblyQualifiedName", "loader-stackTrace", null, "loader-fileName", "loader-fusionLog", null, null);
            var exAgg   = new CKExceptionData("agg-message", "typeof(agg-exception)", "agg-assemblyQualifiedName", "agg-stackTrace", ex2, "fileName", "fusionLog", null, new[] { ex2, exL });

            var       prevLog = DateTimeStamp.UtcNow;
            ILogEntry e1      = LogEntry.CreateLog("Text1", new DateTimeStamp(DateTime.UtcNow, 42), LogLevel.Info, "c:\\test.cs", 3712, ActivityMonitor.Tags.CreateDependentActivity, exAgg);
            ILogEntry e2      = LogEntry.CreateMulticastLog(Guid.Empty, LogEntryType.Line, prevLog, 5, "Text2", DateTimeStamp.UtcNow, LogLevel.Fatal, null, 3712, ActivityMonitor.Tags.CreateDependentActivity, exAgg);

            using (var mem = new MemoryStream())
                using (var w = new CKBinaryWriter(mem))
                {
                    w.Write(LogReader.CurrentStreamVersion);
                    e1.WriteLogEntry(w);
                    e2.WriteLogEntry(w);
                    w.Write((byte)0);
                    w.Flush();

                    byte[] versionBytes = new byte[4];
                    mem.Position = 0;
                    mem.Read(versionBytes, 0, 4);
                    Assert.That(BitConverter.ToInt32(versionBytes, 0), Is.EqualTo(LogReader.CurrentStreamVersion));

                    using (var reader = new LogReader(mem, LogReader.CurrentStreamVersion, 4))
                    {
                        Assert.That(reader.MoveNext());
                        Assert.That(reader.Current.Text, Is.EqualTo(e1.Text));
                        Assert.That(reader.Current.LogLevel, Is.EqualTo(e1.LogLevel));
                        Assert.That(reader.Current.LogTime, Is.EqualTo(e1.LogTime));
                        Assert.That(reader.Current.FileName, Is.EqualTo(e1.FileName));
                        Assert.That(reader.Current.LineNumber, Is.EqualTo(e1.LineNumber));
                        Assert.That(reader.Current.Exception.ExceptionTypeAssemblyQualifiedName, Is.EqualTo(e1.Exception.ExceptionTypeAssemblyQualifiedName));
                        Assert.That(reader.Current.Exception.ToString(), Is.EqualTo(e1.Exception.ToString()));

                        Assert.That(reader.MoveNext());
                        Assert.That(reader.CurrentMulticast.PreviousEntryType, Is.EqualTo(LogEntryType.Line));
                        Assert.That(reader.CurrentMulticast.PreviousLogTime, Is.EqualTo(prevLog));
                        Assert.That(reader.Current.Text, Is.EqualTo(e2.Text));
                        Assert.That(reader.Current.LogTime, Is.EqualTo(e2.LogTime));
                        Assert.That(reader.Current.FileName, Is.Null);
                        Assert.That(reader.Current.LineNumber, Is.EqualTo(0), "Since no file name is set, line number is 0.");
                        Assert.That(reader.Current.Exception.ExceptionTypeAssemblyQualifiedName, Is.EqualTo(e2.Exception.ExceptionTypeAssemblyQualifiedName));
                        Assert.That(reader.Current.Exception.ToString(), Is.EqualTo(e2.Exception.ToString()));

                        Assert.That(reader.MoveNext(), Is.False);
                        Assert.That(reader.BadEndOfFileMarker, Is.False);
                    }
                }
        }
示例#11
0
        public void AggregatedExceptions()
        {
            AggregateException eAgg = ThrowAggregatedException();
            var d = CKExceptionData.CreateFrom(eAgg);

            d.ExceptionTypeAssemblyQualifiedName.Should().Be(typeof(AggregateException).AssemblyQualifiedName);
            d.ExceptionTypeName.Should().Be(typeof(AggregateException).Name);
            d.AggregatedExceptions.Count.Should().BeGreaterOrEqualTo(1);
            d.InnerException.Should().BeSameAs(d.AggregatedExceptions[0]);
            for (int i = 0; i < d.AggregatedExceptions.Count; ++i)
            {
                CheckSimpleExceptionData(d.AggregatedExceptions[i], s => s.StartsWith("Ex n°"));
            }
        }
示例#12
0
        public void AggregatedExceptions()
        {
            AggregateException eAgg = ThrowAggregatedException();
            var d = CKExceptionData.CreateFrom(eAgg);

            Assert.That(d.ExceptionTypeAssemblyQualifiedName, Is.EqualTo(typeof(AggregateException).AssemblyQualifiedName));
            Assert.That(d.ExceptionTypeName, Is.EqualTo(typeof(AggregateException).Name));
            Assert.That(d.AggregatedExceptions.Count, Is.GreaterThanOrEqualTo(1));
            Assert.That(d.InnerException, Is.SameAs(d.AggregatedExceptions[0]));
            for (int i = 0; i < d.AggregatedExceptions.Count; ++i)
            {
                CheckSimpleExceptionData(d.AggregatedExceptions[i], s => s.StartsWith("Ex n°"));
            }
        }
示例#13
0
        static void DumpSampleLogs2(Random r, GrandOutput g)
        {
            var m = new ActivityMonitor(false);

            g.EnsureGrandOutputClient(m);

            m.Fatal("An error occured", _exceptionWithInner);
            m.Fatal("Same error occured (wrapped in CKException)", new CKException(CKExceptionData.CreateFrom(_exceptionWithInner)));
            m.SetTopic("This is a topic...");
            m.Trace("a trace");
            m.Trace("another one");
            m.SetTopic("Please, show this topic!");
            m.Trace("Anotther trace.");
            using (m.OpenTrace("A group trace."))
            {
                m.Trace("A trace in group.");
                m.Info("An info...");
                using (m.OpenInfo(@"A group information... with a 
multi
-line
message. 
This MUST be correctly indented!"))
                {
                    m.Info("Info in info group.");
                    m.Info("Another info in info group.");
                    m.Error("An error.", _exceptionWithInnerLoader);
                    m.Error("Same error occured (wrapped in CKException)", new CKException(CKExceptionData.CreateFrom(_exceptionWithInnerLoader)));
                    m.Warn("A warning.");
                    m.Trace("Something must be said.");
                    m.CloseGroup("Everything is in place.");
                }
            }
            m.SetTopic(null);
            using (m.OpenTrace("A group with multiple conclusions."))
            {
                using (m.OpenTrace("A group with no conclusion."))
                {
                    m.Trace("Something must be said.");
                }
                m.CloseGroup(new[] {
                    new ActivityLogGroupConclusion("My very first conclusion."),
                    new ActivityLogGroupConclusion("My second conclusion."),
                    new ActivityLogGroupConclusion(@"My very last conclusion
is a multi line one.
and this is fine!")
                });
            }
            m.Trace("This is the final trace.");
        }
示例#14
0
        private Document GetDocument(CKExceptionData exception)
        {
            var document = new Document();

            foreach (var propertyInfo in exception.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                var exceptionValue = exception.GetType().GetProperty(propertyInfo.Name)?.GetValue(exception);
                if (exceptionValue == null)
                {
                    continue;
                }

                switch (propertyInfo.Name)
                {
                case LogField.AGGREGATED_EXCEPTIONS:
                    if (_exceptionDepth == 0)
                    {
                        var exList = new StringBuilder();
                        foreach (var ex in exception.AggregatedExceptions)
                        {
                            exList.Append(GetDocument(ex).Get(LogField.INDEX_DTS));
                            exList.Append(";");
                            _exceptionDepth++;
                        }
                        document.Add(new Int32Field(LogField.EXCEPTION_DEPTH, _exceptionDepth, Field.Store.YES));
                        document.Add(new TextField(LogField.AGGREGATED_EXCEPTIONS, exList.ToString(), Field.Store.YES));
                        _exceptionDepth = 0;
                    }

                    break;

                case LogField.INNER_EXCEPTION:
                    document.Add(new StringField(LogField.INNER_EXCEPTION, GetDocument(exceptionValue as CKExceptionData).Get("IndexDTS"), Field.Store.YES));
                    break;

                default:
                    document.Add(new TextField(propertyInfo.Name, exceptionValue.ToString(), Field.Store.YES));
                    break;
                }
            }

            document.Add(new StringField(LogField.INDEX_DTS, CreateIndexDts().ToString(), Field.Store.YES));

            WriteDocument(document);

            return(document);
        }
示例#15
0
        private static void CheckSimpleExceptionData( CKExceptionData simpleData, Func<string,bool> message, bool? hasInner = null, bool hasStack = true )
        {
            Assert.That( message(simpleData.Message), "Invalid message." );
            Assert.That( simpleData.ExceptionTypeName, Is.EqualTo( "Exception" ) );
            Assert.That( simpleData.ExceptionTypeAssemblyQualifiedName, Is.EqualTo( typeof( Exception ).AssemblyQualifiedName ) );
            
            if( hasStack ) 
                Assert.That( simpleData.StackTrace, Is.Not.Null, "Stack trace is not null when the exception has actually been thrown." );
            else Assert.That( simpleData.StackTrace, Is.Null );

            if( hasInner.HasValue )
            {
                if( hasInner.Value ) Assert.That( simpleData.InnerException, Is.Not.Null );
                else Assert.That( simpleData.InnerException, Is.Null );
            }
            Assert.That( simpleData.AggregatedExceptions, Is.Null );
            Assert.That( simpleData.LoaderExceptions, Is.Null );
        }
示例#16
0
        static void DoWriteLog(CKBinaryWriter w, StreamLogType t, LogLevel level, DateTimeStamp logTime, string text, CKTrait tags, CKExceptionData ex, string fileName, int lineNumber)
        {
            if (tags != null && !tags.IsEmpty)
            {
                t |= StreamLogType.HasTags;
            }
            if (ex != null)
            {
                t |= StreamLogType.HasException;
                if (text == ex.Message)
                {
                    t |= StreamLogType.IsTextTheExceptionMessage;
                }
            }
            if (fileName != null)
            {
                t |= StreamLogType.HasFileName;
            }
            if (logTime.Uniquifier != 0)
            {
                t |= StreamLogType.HasUniquifier;
            }

            WriteLogTypeAndLevel(w, t, level);
            w.Write(logTime.TimeUtc.ToBinary());
            if (logTime.Uniquifier != 0)
            {
                w.Write(logTime.Uniquifier);
            }
            if ((t & StreamLogType.HasTags) != 0)
            {
                w.Write(tags.ToString());
            }
            if ((t & StreamLogType.HasFileName) != 0)
            {
                w.Write(fileName);
                w.WriteNonNegativeSmallInt32(lineNumber);
            }
            if ((t & StreamLogType.HasException) != 0)
            {
                ex.Write(w);
            }
            if ((t & StreamLogType.IsTextTheExceptionMessage) == 0)
            {
                w.Write(text);
            }
        }
示例#17
0
 /// <summary>
 /// Creates a <see cref="ILogEntry"/> for a line.
 /// </summary>
 /// <param name="monitorId">Identifier of the monitor.</param>
 /// <param name="previousEntryType">Log type of the previous entry in the monitor..</param>
 /// <param name="previousLogTime">Time stamp of the previous entry in the monitor.</param>
 /// <param name="depth">Depth of the line (number of opened groups above).</param>
 /// <param name="text">Text of the log entry.</param>
 /// <param name="t">Time stamp of the log entry.</param>
 /// <param name="level">Log level of the log entry.</param>
 /// <param name="fileName">Source file name of the log entry</param>
 /// <param name="lineNumber">Source line number of the log entry</param>
 /// <param name="tags">Tags of the log entry</param>
 /// <param name="ex">Exception of the log entry.</param>
 /// <returns>A log entry object.</returns>
 public static IMulticastLogEntry CreateMulticastLog(Guid monitorId, LogEntryType previousEntryType, DateTimeStamp previousLogTime, int depth, string text, DateTimeStamp t, LogLevel level, string fileName, int lineNumber, CKTrait tags, CKExceptionData ex)
 {
     return(new LEMCLog(monitorId, depth, previousLogTime, previousEntryType, text, t, fileName, lineNumber, level, tags, ex));
 }
示例#18
0
        /// <summary>
        /// Reads a <see cref="ILogEntry"/> from the binary reader that can be a <see cref="IMulticastLogEntry"/>.
        /// If the first read byte is 0, read stops and null is returned.
        /// The 0 byte is the "end marker" that <see cref="CKMonWriterClient.Close()"/> write, but this
        /// method can read non zero-terminated streams (it catches an EndOfStreamException when reading the first byte and handles it silently).
        /// This method can throw any type of exception except <see cref="EndOfStreamException"/>
        /// (like <see cref="InvalidDataException"/> for instance) that must be handled by the caller.
        /// </summary>
        /// <param name="r">The binary reader.</param>
        /// <param name="streamVersion">The version of the stream.</param>
        /// <param name="badEndOfFile">True whenever the end of file is the result of an <see cref="EndOfStreamException"/>.</param>
        /// <returns>The log entry or null if a zero byte (end marker) has been found.</returns>
        static public ILogEntry?Read(CKBinaryReader r, int streamVersion, out bool badEndOfFile)
        {
            Throw.CheckNotNullArgument(r);
            badEndOfFile = false;
            StreamLogType t        = StreamLogType.EndOfStream;
            LogLevel      logLevel = LogLevel.None;

            try
            {
                ReadLogTypeAndLevel(r, streamVersion, out t, out logLevel);
            }
            catch (EndOfStreamException)
            {
                badEndOfFile = true;
                // Silently ignores here reading beyond the stream: this
                // kindly handles the lack of terminating 0 byte.
            }
            if (t == StreamLogType.EndOfStream)
            {
                return(null);
            }

            if ((t & StreamLogType.TypeMask) == StreamLogType.TypeGroupClosed)
            {
                return(ReadGroupClosed(streamVersion, r, t, logLevel));
            }
            DateTimeStamp time = new DateTimeStamp(DateTime.FromBinary(r.ReadInt64()), (t & StreamLogType.HasUniquifier) != 0 ? r.ReadByte() : (Byte)0);

            if (time.TimeUtc.Year < 2014 || time.TimeUtc.Year > 3000)
            {
                throw new InvalidDataException("Date year before 2014 or after 3000 are considered invalid.");
            }
            CKTrait         tags       = ActivityMonitor.Tags.Empty;
            string?         fileName   = null;
            int             lineNumber = 0;
            CKExceptionData?ex         = null;
            string?         text       = null;

            if ((t & StreamLogType.HasTags) != 0)
            {
                tags = ActivityMonitor.Tags.Register(r.ReadString());
            }
            if ((t & StreamLogType.HasFileName) != 0)
            {
                fileName   = r.ReadString();
                lineNumber = streamVersion < 6 ? r.ReadInt32() : r.ReadNonNegativeSmallInt32();
                if (lineNumber > 100 * 1000)
                {
                    throw new InvalidDataException("LineNumber greater than 100K is considered invalid.");
                }
            }
            if ((t & StreamLogType.HasException) != 0)
            {
                ex = new CKExceptionData(r);
                if ((t & StreamLogType.IsTextTheExceptionMessage) != 0)
                {
                    text = ex.Message;
                }
            }
            if (text == null)
            {
                text = r.ReadString((t & StreamLogType.IsLFOnly) == 0);
            }

            string        gId;
            string        mId;
            int           depth;
            LogEntryType  prevType;
            DateTimeStamp prevTime;

            if ((t & StreamLogType.TypeMask) == StreamLogType.TypeLine)
            {
                if ((t & StreamLogType.IsMultiCast) == 0)
                {
                    return(new LELog(text, time, fileName, lineNumber, logLevel, tags, ex));
                }
                ReadMulticastFooter(streamVersion, r, t, out gId, out mId, out depth, out prevType, out prevTime);
                return(new LEMCLog(gId, mId, depth, prevTime, prevType, text, time, fileName, lineNumber, logLevel, tags, ex));
            }
            if ((t & StreamLogType.TypeMask) != StreamLogType.TypeOpenGroup)
            {
                throw new InvalidDataException();
            }
            if ((t & StreamLogType.IsMultiCast) == 0)
            {
                return(new LEOpenGroup(text, time, fileName, lineNumber, logLevel, tags, ex));
            }
            ReadMulticastFooter(streamVersion, r, t, out gId, out mId, out depth, out prevType, out prevTime);
            return(new LEMCOpenGroup(gId, mId, depth, prevTime, prevType, text, time, fileName, lineNumber, logLevel, tags, ex));
        }
示例#19
0
 /// <summary>
 /// Binary writes a log entry.
 /// </summary>
 /// <param name="w">Binary writer to use.</param>
 /// <param name="isOpenGroup">True if this the opening of a group. False for a line.</param>
 /// <param name="level">Log level of the log entry.</param>
 /// <param name="text">Text of the log entry.</param>
 /// <param name="logTime">Time stamp of the log entry.</param>
 /// <param name="tags">Tags of the log entry</param>
 /// <param name="ex">Exception of the log entry.</param>
 /// <param name="fileName">Source file name of the log entry</param>
 /// <param name="lineNumber">Source line number of the log entry</param>
 static public void WriteLog(CKBinaryWriter w, bool isOpenGroup, LogLevel level, DateTimeStamp logTime, string text, CKTrait tags, CKExceptionData ex, string fileName, int lineNumber)
 {
     if (w == null)
     {
         throw new ArgumentNullException("w");
     }
     DoWriteLog(w, isOpenGroup ? StreamLogType.TypeOpenGroup : StreamLogType.TypeLine, level, logTime, text, tags, ex, fileName, lineNumber);
 }
示例#20
0
 public void reading_and_writing_CKExceptionData_with_BinaryWriter_and_BinaryReader()
 {
     var dataE0 = CKExceptionData.CreateFrom( ThrowAggregatedException() );
     var dataE1 = CKExceptionData.CreateFrom( ThrowSimpleException( "Test Message" ) );
     var dataE2 = CKExceptionData.CreateFrom( ThrowLoaderException() );
     var dataE3 = CKExceptionData.CreateFrom( ThrowExceptionWithInner() );
     var dataE4 = CKExceptionData.CreateFrom( ThrowTwoInnerExceptions() );
     using( var mem = new MemoryStream() )
     {
         CKBinaryWriter w = new CKBinaryWriter( mem );
         dataE0.Write( w );
         dataE1.Write( w );
         dataE2.Write( w );
         dataE3.Write( w );
         dataE4.Write( w );
         mem.Position = 0;
         var r = new CKBinaryReader( mem );
         var data0 = new CKExceptionData( r, StringAndStringBuilderExtension.IsCRLF );
         Assert.AreEqual( data0.ToString(), dataE0.ToString() );
         var data1 = new CKExceptionData( r, StringAndStringBuilderExtension.IsCRLF );
         Assert.AreEqual( data1.ToString(), dataE1.ToString() );
         var data2 = new CKExceptionData( r, StringAndStringBuilderExtension.IsCRLF );
         Assert.AreEqual( data2.ToString(), dataE2.ToString() );
         var data3 = new CKExceptionData( r, StringAndStringBuilderExtension.IsCRLF );
         Assert.AreEqual( data3.ToString(), dataE3.ToString() );
         var data4 = new CKExceptionData( r, StringAndStringBuilderExtension.IsCRLF );
         Assert.AreEqual( data4.ToString(), dataE4.ToString() );
     }
 }
示例#21
0
 /// <summary>
 /// Creates a <see cref="ILogEntry"/> for an opened group.
 /// </summary>
 /// <param name="text">Text of the log entry.</param>
 /// <param name="t">Time stamp of the log entry.</param>
 /// <param name="level">Log level of the log entry.</param>
 /// <param name="fileName">Source file name of the log entry</param>
 /// <param name="lineNumber">Source line number of the log entry</param>
 /// <param name="tags">Tags of the log entry</param>
 /// <param name="ex">Exception of the log entry.</param>
 /// <returns>A log entry object.</returns>
 public static ILogEntry CreateOpenGroup(string text, DateTimeStamp t, LogLevel level, string fileName, int lineNumber, CKTrait tags, CKExceptionData ex)
 {
     return(new LEOpenGroup(text, t, fileName, lineNumber, level, tags, ex));
 }
示例#22
0
 public LEMCOpenGroup(Guid monitorId, int depth, DateTimeStamp previousLogTime, LogEntryType previousEntryType, string text, DateTimeStamp t, string fileName, int lineNumber, LogLevel l, CKTrait tags, CKExceptionData ex)
     : base(text, t, fileName, lineNumber, l, tags, ex)
 {
     _monitorId         = monitorId;
     _depth             = depth;
     _previousEntryType = previousEntryType;
     _previousLogTime   = previousLogTime;
 }
示例#23
0
        /// <summary>
        /// Binary writes a multicast log entry.
        /// </summary>
        /// <param name="w">Binary writer to use.</param>
        /// <param name="monitorId">Identifier of the monitor.</param>
        /// <param name="previousEntryType">Log type of the previous entry in the monitor..</param>
        /// <param name="previousLogTime">Time stamp of the previous entry in the monitor.</param>
        /// <param name="depth">Depth of the line (number of opened groups above).</param>
        /// <param name="isOpenGroup">True if this the opening of a group. False for a line.</param>
        /// <param name="text">Text of the log entry.</param>
        /// <param name="level">Log level of the log entry.</param>
        /// <param name="logTime">Time stamp of the log entry.</param>
        /// <param name="tags">Tags of the log entry</param>
        /// <param name="ex">Exception of the log entry.</param>
        /// <param name="fileName">Source file name of the log entry</param>
        /// <param name="lineNumber">Source line number of the log entry</param>
        static public void WriteLog(CKBinaryWriter w, Guid monitorId, LogEntryType previousEntryType, DateTimeStamp previousLogTime, int depth, bool isOpenGroup, LogLevel level, DateTimeStamp logTime, string text, CKTrait tags, CKExceptionData ex, string fileName, int lineNumber)
        {
            if (w == null)
            {
                throw new ArgumentNullException("w");
            }
            StreamLogType type = StreamLogType.IsMultiCast | (isOpenGroup ? StreamLogType.TypeOpenGroup : StreamLogType.TypeLine);

            type = UpdateTypeWithPrevious(type, previousEntryType, ref previousLogTime);
            DoWriteLog(w, type, level, logTime, text, tags, ex, fileName, lineNumber);
            WriteMulticastFooter(w, monitorId, previousEntryType, previousLogTime, depth);
        }