At a glace, that looks reasonable to me. The only thing I can think of is that if you have a lot of custom properties, your logging code will be somewhat obtrusive. I'm not sure this avoidable, no matter how you approach this problem.
-Ross On Mon, Aug 17, 2009 at 12:59 PM, AdamTappis <adamtap...@hotmail.com> wrote: > > OK, > > So far I've created the following 2 very simple classes which appear to > give > me what I need: > > class EventPropertiesXMLLayout : XmlLayoutBase > { > protected override void FormatXml(XmlWriter writer, LoggingEvent > loggingEvent) > { > LogMessage lm = loggingEvent.MessageObject as LogMessage; > if (lm != null) > { > writer.WriteStartElement("LogEntry"); > writer.WriteStartElement("Message"); > writer.WriteValue(lm.Message); > writer.WriteEndElement(); > writer.WriteStartElement("Properties"); > foreach (DictionaryEntry de in lm.Properties) > { > writer.WriteStartElement(de.Key.ToString()); > writer.WriteValue(de.Value.ToString()); > writer.WriteEndElement(); > } > writer.WriteEndElement(); > writer.WriteEndElement(); > } > } > } > > class LogMessage > { > private string _message; > private Hashtable _properties; > > public LogMessage(string message) > { > _message = message; > _properties = new Hashtable(); > } > > public string Message > { > get > { > return _message; > } > } > > public Hashtable Properties > { > get > { > return _properties; > } > } > } > > And then write the following code if I have to collect custom properties: > > LogMessage lm = new LogMessage("This is a custom log message"); > lm.Properties.Add("prop1", "value1"); > lm.Properties.Add("prop2", "value2"); > log.Info(lm); > > > Can you see any immediate issues or limitations with this approach? > > > AdamTappis wrote: > > > > How about if I create a custom LogMessage Class that has the message and > > distionary as properties and then write a cutom ObjectRenderer for my > > custom class. This would give my developers the flexibility of either > > logging strings or the custom LogMessage if they require additional > > properties. I guess what it doesn't give me is the flexibility or > > rendering the object to a file using one format and to a DB using a > > different formats. Objects of the specified type would always be rendered > > the same way. > > > > > > AdamTappis wrote: > >> > >> 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-tp25006538p25011405.html > Sent from the Log4net - Users mailing list archive at Nabble.com. > >