protected override void WriteTrace(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message, Guid?relatedActivityId, object[] data) { var traceTime = TraceFormatter.FormatUniversalTime(eventCache); int maxPerHour = MaxTracesPerHour; bool sendEmail = false; if (maxPerHour > 0) { lock (floodLimitLock) { if (traceTime > floodLimitReset) { // start a new flood limit floodLimitReset = traceTime.Add(floodLimitWindow); floodNumberOfTraces = 0; } if (floodNumberOfTraces < maxPerHour) { floodNumberOfTraces++; sendEmail = true; } } } else { sendEmail = true; } if (sendEmail) { string subject = traceFormatter.Format(SubjectTemplate, this, eventCache, source, eventType, id, message, relatedActivityId, data); string body = traceFormatter.Format(BodyTemplate, this, eventCache, source, eventType, id, message, relatedActivityId, data); // Use hidden/undocumented attribute to switch versions (for testing) if (Attributes["poolVersion"] == "B") { SmtpWorkerPoolB.BeginSend(FromAddress, ToAddress, subject, body, null, null); return; } SmtpWorkerPoolC.BeginSend(FromAddress, ToAddress, subject, body, null, null); } else { Debug.WriteLine("Dropped message due to flood protection."); } }
/// <summary> /// Write trace event with data. /// </summary> protected override void WriteTrace(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message, Guid?relatedActivityId, object[] data) { // NOTE: In Microsoft.VisualBasic.Logging.FileLogTraceListener the following are output separated // by a configurable delimiter: // source, TraceEventType, id, message, // Then, based on TraceOutputOptions: // call stack, logical operation stack, datetime (UTC, format "u"), process id, thread id, timestamp // Then, based on listener options: // host name // Supporting a template string kind of makes TraceOutputOptions redundant, // but could support for backwards compatibility. // i.e. if any T-O-O are set, then append them anyway?? var output = traceFormatter.Format(Template, this, eventCache, source, eventType, id, message, relatedActivityId, data ); rollingTextWriter.WriteLine(eventCache, output); }
/// <summary> /// Write trace event with data. /// </summary> protected override void WriteTrace(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message, Guid?relatedActivityId, object[] data) { /* * TraceTemplate templateArguments = new TraceTemplate() { * eventCache = eventCache, * source = source, * eventType = eventType, * id = id, * message = message, * relatedActivityId = relatedActivityId, * data = data, * }; * string output = StringTemplate.Format(Template, templateArguments.GetArgument); */ var output = traceFormatter.Format(Template, this, eventCache, source, eventType, id, message, relatedActivityId, data ); WriteLineColored(eventCache, eventType, output); }
/// <summary> /// Write trace event with data. /// </summary> protected override void WriteTrace(TraceEventCache eventCache, string source, TraceEventType eventType, int id, string message, Guid?relatedActivityId, object[] data) { var traceDetails = traceFormatter.Format(TraceTemplate, this, eventCache, source, eventType, id, message, relatedActivityId, data); bool firstMessage = false; lock (bufferLock) { if (eventMessagesBuffer.Length == 0) { firstMessage = true; } eventMessagesBuffer.AppendLine(traceDetails); } if (firstMessage) { eventMessagesSubject = traceFormatter.Format(SubjectTemplate, this, eventCache, source, eventType, id, message, relatedActivityId, data); eventMessagesHeader = traceFormatter.Format(HeaderTemplate, this, eventCache, source, eventType, id, message, relatedActivityId, data); } }
/// <summary> /// Determines whether the event should be traced by the listener or not. /// </summary> public override bool ShouldTrace(TraceEventCache cache, string source, TraceEventType eventType, int id, string formatOrMessage, object[] args, object data1, object[] data) { if (data == null) { data = new object[] { data1 }; } string propertyValue = traceFormatter.Format(propertyTemplate, null, cache, source, eventType, id, null, null, data); return(propertyValue.Equals(comparisonValue)); }