/// <summary> /// Override to specify how the trace entry should be logged. /// </summary> /// <param name="item">Trace entry</param> protected override void DoLog(TraceLogItem item) { using (var db = new SqlDatabase(_sqlConnectionOrName)) { var logRecord = new TraceRecord { // ReSharper disable PossibleInvalidOperationException Timestamp = item.TimestampUtc.Value, // ReSharper restore PossibleInvalidOperationException Type = (int)item.Type, OperationType = item.OperationType, SessionId = item.SessionId, BusinessTransactionId = item.BusinessTransactionId, OperationInstanceId = item.OperationInstanceId, TenantId = item.TenantId, Message = item.Message, DetailedMessage = item.DetailedMessage, ServerName = item.ServerName, // ReSharper disable PossibleInvalidOperationException ThreadId = item.ThreadId.Value // ReSharper restore PossibleInvalidOperationException }; db.Insert(logRecord); } }
public void ComplexScenarioWorks() { // --- Arrange if (File.Exists(Path.Combine(LOG_ROOT, "08", LOG_FILE))) { File.Delete(Path.Combine(LOG_ROOT, "08", LOG_FILE)); } if (File.Exists(Path.Combine(LOG_ROOT, "09", LOG_FILE))) { File.Delete(Path.Combine(LOG_ROOT, "09", LOG_FILE)); } var tracer = new FileTraceLogger(LOG_FILE, LOG_ROOT, "hh", flushAfter: 3); var traceItem1 = new TraceLogItem { // 8 o'clock TimestampUtc = new DateTime(2012, 1, 1, 8, 0, 0), Type = TraceLogItemType.Informational, ServerName = "Server", ThreadId = 123, OperationType = "TestOp", Message = "Message" }; var traceItem2 = new TraceLogItem { // 9 o'clock TimestampUtc = new DateTime(2012, 1, 1, 9, 0, 0), Type = TraceLogItemType.Informational, ServerName = "Server", ThreadId = 123, OperationType = "TestOp", Message = "Message" }; // --- Act for (var i = 0; i < 3; i++) { tracer.Log(traceItem1); tracer.Log(traceItem2); tracer.Log(traceItem1); tracer.Log(traceItem1); } tracer.Dispose(); // --- Assert var text1 = File.ReadAllText(Path.Combine(LOG_ROOT, "08", LOG_FILE)); var lines1 = text1.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); lines1.ShouldHaveCountOf(9); foreach (var line in lines1) { line.ShouldEqual("2012.01.01. 8:00:00\tInformational\tServer\t123\tTestOp\tMessage\t"); } var text2 = File.ReadAllText(Path.Combine(LOG_ROOT, "09", LOG_FILE)); var lines2 = text2.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); lines2.ShouldHaveCountOf(3); foreach (var line in lines2) { line.ShouldEqual("2012.01.01. 9:00:00\tInformational\tServer\t123\tTestOp\tMessage\t"); } }
private static void LogSingleItem(TextWriter writer, TraceLogItem item) { writer.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}", item.TimestampUtc, item.Type, item.ServerName, item.ThreadId, item.OperationType, item.Message, item.DetailedMessage); }
/// <summary> /// Gets the full path of the file the specified entry should be logged to. /// </summary> /// <param name="entry">Log entry</param> /// <returns>The full path of the log file to be used.</returns> protected virtual string GetFullFilePath(TraceLogItem entry) { // -- Calculate the new full log file name according to the timestamp // ReSharper disable FormatStringProblem var subfolder = string.IsNullOrWhiteSpace(FolderPattern) ? String.Empty : string.Format(CultureInfo.InvariantCulture, "{0:" + FolderPattern + "}", entry.TimestampUtc); var filePrefix = string.IsNullOrWhiteSpace(FileNamePrefixPattern) ? String.Empty : string.Format(CultureInfo.InvariantCulture, "{0:" + FileNamePrefixPattern + "}", entry.TimestampUtc); var fileSuffix = string.IsNullOrWhiteSpace(FileNameSuffixPattern) ? String.Empty : string.Format(CultureInfo.InvariantCulture, "{0:" + FileNameSuffixPattern + "}", entry.TimestampUtc); var filebase = Path.GetFileNameWithoutExtension(FileName); var extension = Path.GetExtension(FileName); var fullFileName = filePrefix + filebase + fileSuffix + extension; return Path.Combine(RootFolder, Path.Combine(subfolder, fullFileName)); // ReSharper restore FormatStringProblem }
/// <summary> /// Override to specify how the trace entry should be logged. /// </summary> /// <param name="item">Trace entry</param> protected override void DoLog(TraceLogItem item) { if (_isDisposing) return; _entryQueue.Enqueue(item); if (_entryQueue.Count >= FlushAfter) { Flush(); } }
public void SingleScenarioWorks() { // --- Arrange var tracer = new FileTraceLogger(LOG_FILE, LOG_ROOT, flushAfter: 3); var traceItem = new TraceLogItem { TimestampUtc = new DateTime(2012, 1, 1, 8, 0, 0), Type = TraceLogItemType.Informational, ServerName = "Server", ThreadId = 123, OperationType = "TestOp", Message = "Message" }; // --- Act for (var i = 0; i < 5; i++) tracer.Log(traceItem); tracer.Dispose(); // --- Assert var text = File.ReadAllText(Path.Combine(LOG_ROOT, LOG_FILE)); var lines = text.Split(new [] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) { line.ShouldEqual("2012.01.01. 8:00:00\tInformational\tServer\t123\tTestOp\tMessage\t"); } lines.ShouldHaveCountOf(5); }