Hm, we could provide a scripting language that allows you to customize logging event properties but that scripting language wont ever suffice.
You are probably best off by implementing a facade that matches your needs and hides the heavy lifting done the used logging framework. On 24 Oct 2016 3:28 p.m., "Nicholas Duane" <nic...@msn.com> wrote: > Thanks. We already have written a custom appender. Ideally I want the > category set by the time the event makes it to our appender. As I > mentioned, what I'm trying to do is the following: > > > When someone logs an event I want to populate a property named "category" > on the LoggingEvent which is based on the level of the event. > > > level: FATAL - INFO -> set category to criticalDiagnostic > > level: DEBUG, TRACE -> set category to noncriticalDiagnostic > > > I could imagine there could be many other reasons why someone might want > to modify the LoggingEvent automatically without any user code to do so. > > > As I mentioned, I don't want an application to make code changes to make > this happen. I'm looking for a config only solution for this. You could > imagine that the LogManager could expose a set of events and allow plugging > in event sinks via configuration. This would allow me to write an event > sink and plug it into the system via the configuration. > > > Thanks, > > Nick > > ------------------------------ > *From:* Dominik Psenner <dpsen...@gmail.com> > *Sent:* Monday, October 24, 2016 1:39 AM > *To:* Log4NET User > *Subject:* Re: Injecting properties into LoggingEvent > > > Ps: this might also something that you should look at. > > http://stackoverflow.com/questions/17120943/how-add-custom-properties-in- > appenderskeleton-log4net > > <http://stackoverflow.com/questions/17120943/how-add-custom-properties-in-appenderskeleton-log4net> > How Add custom properties in ... - Stack Overflow > <http://stackoverflow.com/questions/17120943/how-add-custom-properties-in-appenderskeleton-log4net> > stackoverflow.com > I Create Custom Appender(with AppenderSkeleton) that Connect to the Web > Service... in this Appender i need to send some custom properties(like Url > , Browser ,User ... > > And note too that the layoutpattern gets a applicationsetting pattern > string to include application settings in the formatted logevent string. > You can try that feature by building from source or by using the relerase > candidate binaries. > > It is unclear where these "categories" come from if the developers do not > maintain them. Therefore I am not able to understand your requirements. > > On 24 Oct 2016 7:21 a.m., "Dominik Psenner" <dpsen...@gmail.com> wrote: > >> In that case you can pipe your log events through a custom appender that >> you implement. That custom appender can implement your logic of events as >> smart as you need it and then call inner appenders to process events. See >> the bufferingappenderskeleton. >> >> On 24 Oct 2016 12:52 a.m., "Nicholas Duane" <nic...@msn.com> wrote: >> >>> Thanks. I think I'm not quite explaining it well enough. While I would >>> like to set properties on the LoggingEvent class, it could not be >>> accomplished similar to the way you suggest. The reason is that the >>> property I want to set, "category", would be based on the level the user is >>> logging the event at and thus could not be done until the logging method >>> was called. >>> >>> >>> I don't think I'm asking the logging framework to do something way out >>> of the ordinary. All I'm trying to do is set a property based on the >>> level, and I would like to do that without the user having to do anything, >>> other than maybe including some config code which would allow me to inject >>> my code into the equation. >>> >>> >>> Thanks, >>> >>> Nick >>> >>> ------------------------------ >>> *From:* Dominik Psenner <dpsen...@gmail.com> >>> *Sent:* Sunday, October 23, 2016 3:13 PM >>> *To:* Log4NET User >>> *Subject:* Re: Injecting properties into LoggingEvent >>> >>> >>> Responding inline.. >>> >>> On 23 Oct 2016 4:04 p.m., "Nicholas Duane" <nic...@msn.com> wrote: >>> > >>> > Is there a way for me to add properties to a LoggingEvent without the >>> user doing anything out of the ordinary. Maybe it's even best to assume an >>> existing application which is using log4net. I would like to take this >>> existing log4net application and without them changing any code, >>> configuration changes are ok, I would like to add properties to each >>> LoggingEvent which is created from their log statements like: >>> > >>> > >>> > logger.Error(); >>> > >>> > logger.Info(); >>> > >>> > logger.Debug(); >>> > >>> > etc. >>> > >>> > >>> >>> That requirement sounds like you would like to: >>> >>> // thread properties... >>> log4net.LogicalThreadContext.Properties["CustomColumn"] >>> = "Custom value"; log.Info("Message"); >>> >>> // ...or global properties log4net.GlobalContext.Properties["CustomColumn"] >>> = "Custom value"; >>> >>> These automatically set these properties on the logging events and you >>> can then filter those with a propertyfilter as you write here: >>> >>> > such that I could use the PropertyFilter filter to filter out events? >>> I want to set a property based on the level of the event. I could of >>> course use the LevelRangeFilter but in other cases I'm using the >>> PropertyFilter and was figuring it might be nice to do it the same for all >>> events. >>> > >>> > >>> > This other case where I'm using the PropertyFilter is for new events >>> we've introduced. These are what we call "compliance" and "business" >>> events. We originally introduced a "compliance" event and at that time I >>> introduced a custom level for that. However, I'm trying to move away from >>> defining custom levels and instead use a property on the event to >>> distinguish its "category". For these new events which don't fit nicely >>> into the level gradient I've introduced a method for developers to use to >>> log them called LogEvent(). They will pass in their logger, the category >>> of the event, and the event. In this scenario it's easy for me to set >>> properties on the LoggingEvent. >>> >>> To me this sounds like you are trying to force the logging framework to >>> do something different than the rest of the application logs do. If thats >>> the case, then let me warn you that it might not be a good idea. Logs could >>> be only a byproduct of the feature you would like to implement. If you are >>> implementing application features through the logging framework, logging is >>> too smart and does too much. Try to design your applocation so that it >>> could do its job even if logging was not there. >>> >>> However it sounds like this works for you, therefore I do not try to >>> work out anything. >>> >>> > However, for what we call the diagnostic events, those that are >>> logged using the methods exposed by log4net, we don't want them to have to >>> do anything different than they were doing. If they want to log an error >>> they would still use: >>> > >>> > >>> > logger.Error("this is my error"); >>> > >>> > >>> > or a warning: >>> > >>> > >>> > logger.Warn("this is my warning"); >>> > >>> > >>> > etc. >>> > >>> > >>> > Ideally I would like to set the "category" on those events also so >>> that by the time they make it to the appender it has this "category" >>> property. Is there a way to do that? >>> >>> This sounds like this: >>> >>> http://stackoverflow.com/questions/9015432/how-can-i-inject- >>> a-property-for-only-one-call-in-log4net >>> >>> Best regards, >>> Dominik >>> >>> > >>> > >>> > Thanks, >>> > >>> > Nick >>> > >>> > >>> > ________________________________ >>> > From: Dominik Psenner <dpsen...@gmail.com> >>> > Sent: Sunday, October 23, 2016 9:18 AM >>> > >>> > To: Log4NET User >>> > Subject: Re: Injecting properties into LoggingEvent >>> > >>> > >>> > Sorry, I cannot grasp your requirements. Please try to explain your >>> usecase better in a way that gives the document some kind of structure. >>> > >>> > >>> > On 23 Oct 2016 12:02 a.m., "Nicholas Duane" <nic...@msn.com> wrote: >>> >> >>> >> Thank you for the suggestions. >>> >> >>> >> >>> >> We are already logging complex objects in many cases. We have the >>> notion of a compliance event. That's basically a map (IDictionary<string, >>> object>). We're now adding business events. However, even with these >>> "complex" events I don't want the map to contain the category, at least not >>> at event creation time. I see an event as just a collection of >>> properties. The act of logging it at a certain level or category is what >>> assigns the severity or category. For example: >>> >> >>> >> >>> >> logger.Warn("this is my warning message"); >>> >> >>> >> >>> >> logger.Error("this is my error message"); >>> >> >>> >> >>> >> logger.Info("this is my info message"); >>> >> >>> >> >>> >> In each of those cases if we assume the event is the message itself, >>> there is no criticality associated with that event. It's the act of >>> logging that defines the event's criticality. I want the same to be true >>> for the category. I believe I have this working fine for our "complex" >>> events which don't fit into the Level gradient. I expose a LogEvent() >>> method which logs at the Emergency level as I showed in the code I included >>> in the previous thread. However, we also need to capture diagnostic >>> events, ones that are logged via the logging framework's methods: >>> >> >>> >> >>> >> logger.Error(...); >>> >> >>> >> logger.Warn(...); >>> >> >>> >> >>> >> What I am hoping to do is hook in some of my code and generate one of >>> our complex events each time the logging framework logs an event and will >>> map the level to one of our categories. I can imagine that this might be >>> possible if I somehow wrap a logger, but as I mentioned I don't want the >>> user to have to call anything special at startup to hook up that wrapping. >>> I was hoping there would be a way for me to hook myself in via >>> configuration. I'm ok with giving them a configuration file they need to >>> use but I don't want them to have to change any existing code them may have. >>> >> >>> >> >>> >> By the way, we did generate a custom log level for our compliance >>> event. However I'm trying to move away from that as it was point out that >>> our events don't fit well within the level gradient. So the new code for >>> logging a compliance event does not use that level. Both the compliance >>> and business event would be logged at the Emergency level. I would use the >>> category property to differentiate them. Similar, I guess, to log4j2's >>> Markers. >>> >> >>> >> >>> >> Thanks, >>> >> >>> >> Nick >>> >> >>> >> >>> >> ________________________________ >>> >> From: Dominik Psenner <dpsen...@gmail.com> >>> >> Sent: Saturday, October 22, 2016 1:29 PM >>> >> To: Log4NET User >>> >> Subject: Re: Injecting properties into LoggingEvent >>> >> >>> >> >>> >> What I am proposing here are a mere ideas that will need further >>> investigation. I have not tried any of these ideas. You will have to >>> prioritize these ideas based on your requirements. >>> >> >>> >> A. Implement an extension class for the ILog interface >>> >> B. Implement a custom ILog interface implementation and a >>> LoggerFactory. >>> >> C. Define custom loglevels >>> >> D. Use thread context properties altogether with custom format layouts >>> >> E. Log "complex" classes that hold your category information and find >>> a way to format them >>> >> >>> >> There might be more things that you could do.. >>> >> >>> >> >>> >> On 22 Oct 2016 5:31 p.m., "Nicholas Duane" <nic...@msn.com> wrote: >>> >>> >>> >>> Is there a way for me to inject properties into a LoggingEvent? I'm >>> trying to accomplish this without the user (of log4net) doing anything >>> special. The only thing I could think of was wrapping loggers, and while >>> I'm not against doing that it would have to be done via configuration as I >>> don't want the user to have to do it programmatically. Is there any way >>> for me to inject a logger wrapper via configuration? >>> >>> >>> >>> >>> >>> The reason I'm looking to do this is that I would like to set a >>> property on the LoggingEvent to use for filtering. This property would be >>> determined based on the level property. I could simply use the level >>> property for filtering, but I have other events which I generate which are >>> all logged at the Emergency level but have a different value for this >>> property so for them I'm using this property for filtering. I don't have >>> the same issue with these other events because they are logged via an >>> extension method I provided on the ILog interface: >>> >>> >>> >>> >>> >>> public static class Logging >>> >>> >>> >>> { >>> >>> >>> >>> public static void LogEvent(this ILog logger, Category category, >>> IEvent evnt) >>> >>> >>> >>> { >>> >>> >>> >>> if ((category != null) && (evnt != null)) >>> >>> >>> >>> { >>> >>> >>> >>> evnt.SetCategory(category.Name); >>> >>> >>> >>> LoggingEvent le = new LoggingEvent(null, >>> logger.Logger.Respository, >>> >>> >>> >>> logger.Logger.Name, Level.Emergency, evnt, >>> null); >>> >>> >>> >>> le.Properties["category"] = category.Name; >>> >>> >>> >>> logger.Logger.Log(le); >>> >>> >>> >>> } >>> >>> >>> >>> } >>> >>> >>> >>> } >>> >>> >>> >>> >>> >>> So for instance when a user does the following: >>> >>> >>> >>> >>> >>> logger.Error("this is my error message"); >>> >>> >>> >>> or >>> >>> >>> >>> logger.Warn("this is my warning message"); >>> >>> >>> >>> or >>> >>> >>> >>> logger.Info("this is my info message"); >>> >>> >>> >>> >>> >>> I would like to set the property "category" on the LoggingEvent to >>> "criticalDiagnostic". When they do: >>> >>> >>> >>> >>> >>> logger.Debug("this is my debug message"); >>> >>> >>> >>> or >>> >>> >>> >>> logger.Trace("this is my trace message"); >>> >>> >>> >>> >>> >>> I would like to set the property "category" on the LoggingEvent to >>> "noncriticalDiagnostic". Any way for me to do that automagically? >>> >>> >>> >>> >>> >>> I also posted this at: >>> >>> >>> >>> >>> >>> http://stackoverflow.com/questions/40187597/injecting-proper >>> ties-into-log4nets-loggingevent >>> >>> >>> >>> >>> >>> Thanks, >>> >>> >>> >>> Nick >>> >>