logging-log4net-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Duder Himer <websn...@yahoo.com>
Subject Re: Programmatically Change Configuration?
Date Wed, 28 Nov 2007 16:30:15 GMT
Thought I'd share this for anyone else who has a similar problem, since it took quite a bit
of trial and error to get it to work right.  This can probably be used for just about any
log4net setting in a App.config file.  The main difference would be the xpath query string.
 The below will take any appender's of type "log4net.Appender.SmtpAppender,log4net" and change
their smtpHost value.  It could probably be modified to Create the smtpHost element if not
found as well, and be made more generic of course.

private void changeConfigTest()
{
System.Configuration.Configuration config =
        System.Configuration.ConfigurationManager.OpenExeConfiguration(
        System.Configuration.ConfigurationUserLevel.None);

      System.Configuration.ConfigurationSection smtpAppenderSection = config.Sections["log4net"];
      string xml = smtpAppenderSection.SectionInformation.GetRawXml();
      string newXml = setSmtpHost(xml,"NEW.smtp.com");        

      smtpAppenderSection.SectionInformation.SetRawXml(newXml);
      smtpAppenderSection.SectionInformation.ForceSave = true;
      config.Save();
}

private string setSmtpHost(string log4netXml, string smtpHost)
    {
      XmlDocument document = new XmlDocument();
      document.LoadXml(log4netXml);      
      System.Xml.XPath.XPathNavigator navigator = document.CreateNavigator();

      foreach (System.Xml.XPath.XPathNavigator nav in navigator.Select(
        "/log4net/appender[@type='log4net.Appender.SmtpAppender,log4net']/smtpHost/@value"
        ) )
      {
        nav.SetValue("test.eng.fsu.edu");
      }
            
      XmlWriterSettings settings = new XmlWriterSettings();
      settings.OmitXmlDeclaration = true;
      settings.Indent = true;

      System.IO.StringWriter stringStream = new System.IO.StringWriter();
      XmlWriter writer = XmlTextWriter.Create(stringStream, settings);

      document.Save(writer);
   
      return stringStream.ToString();
    }





----- Original Message ----
From: Duder Himer <websnozz@yahoo.com>
To: Log4NET User <log4net-user@logging.apache.org>
Sent: Tuesday, November 27, 2007 1:59:05 PM
Subject: Re: Programmatically Change Configuration?


Well, I think I got half of it figured out.  It seems the
XmlHierarchyConfigurator class does most of the grunt work of reading
the xml configuration.  I was hoping it was using some sort of
deserialization, which would allow me to probably find a way to use
serialization to save settings, but this is not the case.  It seems to use the xml element
names and find writable properties in the corresponding objects to write the values to.  I
could do the opposite, where I read through appenders, and where I find writable properties,
write them to the xml, but I wouldn't want to write them all out.  I should only write those
out which are different from the default, so I'd have to compare the default to the actual
and only write when they are different.

I think
writing directly to the Xml file to make changes is going to be my best
bet considering the small amount of changes I want to make.  It just always seems dirty and
risky to parse through xml manually.



----- Original Message ----
From: Duder Himer <websnozz@yahoo.com>
To: Log4NET User <log4net-user@logging.apache.org>
Sent: Tuesday, November 27, 2007 1:18:19 PM
Subject: Re: Programmatically Change Configuration?


Thanks Napo,

That code would reload the configuration file, correct?

I am wanting to change a specific setting, such as the Smtp host, and have that save to the
configuration.  Having a seperate configuration file is fine, and is probably a good idea.
 I was hoping to figure out how log4net manages to map xml elements to properties, and then
I would attempt to reverse the process for saving the data.


----- Original Message ----
From: "Chen, Xuguang" <Xuguang.Chen@cn.fid-intl.com>
To: Log4NET User <log4net-user@logging.apache.org>
Sent: Wednesday, November 21, 2007 8:24:30
 PM
Subject: RE: Programmatically Change Configuration?

Message


 


DIV {
MARGIN:0px;}



Hi,Snozz:

 

     I reset my log4net configuration in 
global.asax for asp.net project.

  


     string serverMapPath = 
Server.MapPath("~");

     string configFile = serverMapPath + 
ConfigurationManager.AppSettings["Log4NetPath"];
     log4net.Config.XmlConfigurator.ConfigureAndWatch(new 
System.IO.FileInfo(configFile));
    

      Hope can help you.

    

    

     Napo.chen


  

  -----Original Message-----
From: Duder Himer 
  [mailto:websnozz@yahoo.com] 
Sent: 2007年11月21日 4:36
To: 
  log4net-user@logging.apache.org
Subject: Programmatically Change 
  Configuration?



  
  Is there a way to programmatically change the configuration through the 
  log4net API?  For example, when my application is run for the first time, 
  I want to allow the user to provide their smtp host for the SmtpAppender, and 
  have that information saved to the configuration.

I'm trying to read 
  through the log4net code the loads the configuration to see if there is 
  something there I can make use of, but I'm getting a little lost.  I am 
  not familier with NUnit, thus I don't have the source setup to compile such 
  that I can step though the code.  So I am manually looking through the 
  code, starting at the default XmlConfigurator.Configure() method, and jumping 
  through the defines of the methods it calls.  It gets really confusing 
  when the GetRepository functions are using interfaces, and I have to figure 
  out which implementation of that interface would actually be used so that I 
  can look through the functions being called.

Thanks in 
  advance.

-Snozz











      Be a better pen pal. 
Text or chat with friends inside Yahoo! Mail. See how.





      ____________________________________________________________________________________
Be a better pen pal. 
Text or chat with friends inside Yahoo! Mail. See how.  http://overview.mail.yahoo.com/
Mime
View raw message