public static void Pop(ILoggingContext context) { var frameID = GetFrameID(context); var frame = new LoggingCallContextStackFrame(frameID); if (!frame.Deactivate()) { return; } using (var keySet = Keys().GetEditor()) { foreach (var key in frame.Keys) { var activeFrameData = new LoggingCallContextActiveFrameData(key); LoggingCallContextStackFrame currentFrame; while (activeFrameData.TryGetFrame(out currentFrame) && !currentFrame.IsActive()) { currentFrame.FreeKey(key); if (!activeFrameData.Pop()) { keySet.Remove(key); break; } } } CallContext.LogicalSetData(SERIALIZATION_KEY, SerializeToXML(keySet.DataStore())); } }
/// <summary> /// Enumerate the keys stored in the context and /// serialize them to an XML blob /// </summary> private static string SerializeToXML(IEnumerable <string> keyCollection) { var sb = new StringBuilder(); using (var tw = new StringWriter(sb)) using (var xw = new XmlTextWriter(tw)) { xw.WriteStartElement("loggingContext"); foreach (var key in keyCollection) { var frameData = new LoggingCallContextActiveFrameData(key); object data; xw.WriteStartElement(key); if (frameData.TryGetValue(out data) && data != null) { xw.WriteString(data.ToString()); } else { xw.WriteString("(Unknown)"); } xw.WriteEndElement(); } xw.WriteEndElement(); } return(sb.ToString()); }
public static ILoggingContext Push(IEnumerable <KeyValuePair <string, object> > data) { var context = new LoggingContext(); var frame = LoggingCallContextStackFrame.Initialize(context, data); using (var keySet = Keys().GetEditor()) { foreach (var key in frame.Keys) { LoggingCallContextActiveFrameData.Initialize(frame, key); keySet.Add(key); } CallContext.LogicalSetData(SERIALIZATION_KEY, SerializeToXML(keySet.DataStore())); } return(context); }
/// <summary> /// Retrieves the current active value for the key /// </summary> public static bool TryGetContextData(string key, out object result) { LoggingCallContextActiveFrameData data = new LoggingCallContextActiveFrameData(key); return(data.TryGetValue(out result)); }