public class LogManager { public static GetLogger<T>() { return new LogEx(LogManager.GetLogger(typeof(T))); } }
// untested...I think I'm forgetting a constructor public class LogEx : LogImpl { private readonly static Type declaringType = typeof(LogEx); public void Info(string message, IDictionary properties) { if (IsInfoEnabled) { LoggingEvent loggingEvent = new LoggingEvent( declaringType, Logger.Repository, Logger.Name, Level.Info, message, t); foreach (var entry in properites) { loggingEvent.Properties[entry.Key.ToString()] = entry.Value; } Logger.Log(loggingEvent); } } } http://www.mail-archive.com/log4net-user@logging.apache.org/msg04357.html ----- Original Message ---- From: AdamTappis <adamtap...@hotmail.com> To: log4net-user@logging.apache.org Sent: Monday, August 17, 2009 11:08:44 AM Subject: Re: Adding custom logging properties Having a closer look at the documentation, the Properties property of the LoggingEvent class is a PropertiesDictionary which derives from ReadOnlyPropertiesDictionary which menas it can't be written to and hence it's not suitable for my purposes. Any ideas? AdamTappis wrote: > > Ross, > > I guess that's why I'm posting here, because I'm trying to devise a > pattern and some coding guidelines so that all our applications log > consistently. I considered wrapping log4net but all I've read advises > against that. So what I'm trying to achieve is an elegant solution that > makes the best use of the framework. > > You're right, I wish to log a collection of Key-Value pairs associated > with a given loggin event. e.g. > statistics - > <eventData><duration>3ms</duration><size>10kb</size></eventData> > details - > <eventData><customerID>3</customerID><orderID>10</orderID></eventData> > > The question I'm asking is how best to implement this with log4net? > > Should I write a wrapper or a helper class that accepts the key-Value > pairs collection as a parameter and returns a formattred XML string that > then get's logged? > > Maybe I should be creating a LoggingEvent in code manually, adding the > Key-Value pairs to the Properties collection and then using > ILog.Logger.Log to actually log the event rather than using Ilog.Info() to > log. I could than write a custom layout class that serialises the > properties out as an XML string. > > like I said, I'm not sure and am looking for some disrection. > > Ideally I would have the following interface available to me: > > ILog.Info(string message, Dictionary customProperties) > > and then it would be the configuration that drives how the > customProperties are rendered by specifying the approporiate Layout class. > That way I could format the customProperties to a file in one way and to a > Db as XML etc... without embedding the formatting logic in my code. > > > Ross Hinkley wrote: >> >> Adam, >> >> How are these properties getting transformed from a logging call to XML? >> Are you asking if there's a way to modify a custom format on the fly and >> then turn the custom properties into XML? (I'm thinking of something >> like >> appending name-value pairs to the log format and having a custom appender >> do >> the XML conversion for you. This doesn't seem terribly elegant.) >> >> Maybe I'm over-trivializing, but it seems to me you should be able to use >> custom properties to take care of your current needs, converting your >> properties to XML in code, then modifying the ADO appender configuration >> to >> handle that property appropriately when the logging database is >> implemented. >> >> I guess another question would be what sorts of things need to be >> serialized? Are they going to be serialized from a class? >> >> -Ross >> >> On Mon, Aug 17, 2009 at 8:12 AM, AdamTappis <adamtap...@hotmail.com> >> wrote: >> >>> >>> Hi, >>> >>> I've been evaluating log4net recently with a view to using the framework >>> as >>> a loggin standard for our enterprise applicaption. I see it very easy to >>> extend the framework, however I have some specific logging requirements >>> and >>> I'm not sure what would be the easiest way implement these with minimal >>> coding. >>> >>> At some time in the future, we aim to build a consolidated logging >>> database >>> that will capture logging data from our server application suite. The >>> information that needs to be logged will differ per service/applicaption >>> and >>> to that end I would aim to have a table schema that has the standard >>> logging >>> columns plus a generic XML column (no defined schema) to act as a >>> property >>> bag for custom information associated with a specific event. >>> >>> We don't have time to develop the logging repository at present, however >>> I'm >>> stressing that we should build logging into our code from the start >>> rather >>> than trying to retro-fitting it later which would be far more costly. >>> >>> So I need my code to be able to fire off logging messages with a list or >>> arbitrary custom properties that get formatted into an XML string. For >>> now >>> the messages can be written to a text file and later we'll configure and >>> AdoNetAppender to write to out logging database. >>> >>> So my questions are: >>> - Is this possible using configuration only? (I susopect not) >>> - If not then which custom objects do I need to create? From what I've >>> seen >>> so far I think I'll need to code my own Layout Class >>> - The ILog interface doesn't doesn't expose a method that takes a >>> property >>> bag (or dictionary), but it appears that the LoggingEvent object does. >>> Does >>> that mean I would have to make my logging calls using ILog.Logger.Log()? >>> - Could someone provide some sample code please? >>> -- >>> View this message in context: >>> http://www.nabble.com/Adding-custom-logging-properties-tp25006538p25006538.html >>> Sent from the Log4net - Users mailing list archive at Nabble.com. >>> >>> >> >> > > -- View this message in context: http://www.nabble.com/Adding-custom-logging-properties-tp25006538p25008536.html Sent from the Log4net - Users mailing list archive at Nabble.com.