public override IRawLayout Adapt(TAttribute attribute) { var layout = Activator.CreateInstance <TLayout>(); ConfigureLayout(layout, attribute); layout.ActivateOptions(); var rawLayout = new Layout2RawLayoutAdapter(layout); ConfigureLayout(rawLayout, attribute); return(rawLayout); }
private string GetCollectionName(LoggingEvent loggingEvent) { if (string.IsNullOrEmpty(CollectionPattern)) { return("logs"); } SetMdcProperties(); var pattern = new Layout2RawLayoutAdapter(new PatternLayout(CollectionPattern)); var collection = pattern.Format(loggingEvent) as string; RemoveMdcProperties(); return(collection); }
protected override void Append(LoggingEvent loggingEvent) { if (RavenClient == null) { RavenClient = new RavenClient(DSN) { Logger = Logger, Environment = Environment, Release = Release, // If something goes wrong when sending the event to Sentry, make sure this is written to log4net's internal // log. See <add key="log4net.Internal.Debug" value="true"/> ErrorOnCapture = ex => LogLog.Error(typeof(SentryAppender), "[" + Name + "] " + ex.Message, ex) }; if (!string.IsNullOrWhiteSpace(Tags)) { string[] tags = Tags.Split('&'); foreach (string tagPair in tags) { string[] keyValue = tagPair.Split(new[] { '=' }, 2); if (keyValue.Length == 2) { Layout2RawLayoutAdapter layout = new Layout2RawLayoutAdapter(new PatternLayout(HttpUtility.UrlDecode(keyValue[1]))); AddTag(new SentryTag { Name = keyValue[0], Layout = layout }); } } } } SentryEvent sentryEvent = null; if (loggingEvent.ExceptionObject != null) { // We should capture both the exception and the message passed sentryEvent = new SentryEvent(loggingEvent.ExceptionObject) { Message = loggingEvent.RenderedMessage }; } else if (loggingEvent.MessageObject is Exception) { // We should capture the exception with no custom message sentryEvent = new SentryEvent(loggingEvent.MessageObject as Exception); } else { // Just capture message sentryEvent = new SentryEvent(loggingEvent.RenderedMessage); } // Assign error level sentryEvent.Level = Translate(loggingEvent.Level); // Format and add tags tagLayouts.ForEach(tl => sentryEvent.Tags.Add(tl.Name, (tl.Layout.Format(loggingEvent) ?? string.Empty).ToString())); // Add extra data sentryEvent.Extra = GetLoggingEventProperties(loggingEvent); RavenClient.Capture(sentryEvent); }
/// <summary> /// When configured by XML or by <see cref="ArrangementConverter"/> in general, /// the <see cref="Option"/> is tried to figure out the <see cref="IRawLayout"/> to use. /// </summary> /// <remarks> /// It can be a <see cref="PatternString" />, then the option will be stringified. /// It can be a <see cref="string"/>, then <see cref="ArrangementConverter.GetArrangement"/> will be attempted. /// It can be an <see cref="IArrangement"/>, then it will be used to arrange a new <see cref="RawArrangedLayout"/> /// It can be another <see cref="IMember" />, then if Name was not set yet it will be adopted. /// It can be a <see cref="ConverterInfo" />, then a new RawCallLayout will be set up around it. /// It can be a <see cref="PatternParser" />, then a new RawCallLayout will be set up around it. /// </remarks> public void ActivateOptions() { if (Option == null) { Option = GetLayout(Name); return; } if (Option is PatternString) { var ps = (PatternString)Option; Option = ps.Format(); } if (Option is string) { // try to parse an arrangement var arrangement = ArrangementConverter.GetArrangement(Option as string, Converters); if (arrangement != null) { Option = arrangement; } } if (Option is string) { // try to find a layout var layout = GetLayout(Option as string); if (layout != null) { Option = layout; } } if (Option is ConverterInfo) { Option = new RawCallLayout((ConverterInfo)Option); } if (Option is PatternConverter) { Option = new RawCallLayout(Name, (PatternConverter)Option); } if (Option is IOptionHandler) { // this simplifies calls in ArrangementConverter a lot ((IOptionHandler)Option).ActivateOptions(); } if (Option is ILayout) { var layout = (ILayout)Option; var playout = Option as PatternLayout; if (playout != null && Converters != null) { foreach (var conv in Converters) { playout.AddConverter(conv); } } Option = new Layout2RawLayoutAdapter((ILayout)Option); } else if (Option is IMember) { var optionMember = (IMember)Option; if (String.IsNullOrEmpty(Name)) { Name = optionMember.Name; } Option = optionMember.Layout; } else if (Option is IArrangement) { var optionArrangemet = (IArrangement)Option; var l = new RawArrangedLayout(); optionArrangemet.Arrange(l.Members, Converters); Option = l; } if (Option is IOptionHandler) { // do it again if object changed ((IOptionHandler)Option).ActivateOptions(); } }