I do something along that line. I have a connection string inside 
machine.config and I wrapped l4n in a wrapper dll that's used in many projects. 
I actually deploy a logging config file alongside the wrapper, so some of the 
code here is accessing settings inside that. The logging CN is in 
machine.config because it's used elsewhere, as well.
 
So the wraper calls ConfigureLogging() from wrapper logging methods that I 
expose. My apps don't actually deal with l4n directly. Each one simply checks 
if initialization is needed before forwarding into l4n.
 
In the wrapper class I do this:
 
        private static void ConfigureLogging()
        {
            string assemblyPath = string.Empty;
            Configuration cfg = null;
            try
            {
                string connectionString = string.Empty;
                assemblyPath = Assembly.GetExecutingAssembly().Location;
                try
                {
                    cfg = 
ConfigurationManager.OpenExeConfiguration(assemblyPath);
                }
                catch (Exception ex)
                {
                    string msg = string.Format("Failed to load configuration 
file");
                    throw new ApplicationException(msg, ex);
                }
                if (!cfg.HasFile)
                {
                    string msg = string.Format("Failed to load configuration 
file");
                    throw new ApplicationException(msg);
                }
                // Connection strings come from machine.config, even though 
we're explicitly going after the app.dll.config
                if((cfg.ConnectionStrings == null) || 
cfg.ConnectionStrings.ConnectionStrings == null || 
cfg.ConnectionStrings.ConnectionStrings.Count == 0)
                    throw new ApplicationException("Framework could not to 
locate connection string collection in machine.config");

                ConnectionStringSettings cstr = 
cfg.ConnectionStrings.ConnectionStrings["CentralLogging"];
                if (cstr == null)
                    throw new ApplicationException("Framework could not locate 
'CentralLogging' connection string.");
                connectionString = 
cfg.ConnectionStrings.ConnectionStrings["CentralLogging"].ConnectionString;
                connectionString += string.Format(";Application Name={0}; ", 
DatabaseApplicationName);
                try
                {
                    // Now we're using the local app.dll.config file
                    FileInfo fi = new FileInfo(cfg.FilePath);
                    if (fi.Exists)
                    {
                        // array of LogLog objects. Silly, eh?
                        ArrayList configurationMessages = 
(ArrayList)log4net.Config.XmlConfigurator.Configure(fi);
                        if (configurationMessages.Count > 0)
                        {
                            foreach (log4net.Util.LogLog l in 
configurationMessages)
                            {
                                if (l.Exception != null)
                                    _configurationMessages.Add(l.Exception);
                                else
                                    _configurationMessages.Add(l.Message);
                            }
                        }
                    }
                    else
                    {
                        string msg = string.Format("Missing configuration 
file'{0}'", assemblyPath);
                        throw new ApplicationException(msg);
                    }
                }
                catch (Exception ex)
                {
                    throw new ApplicationException("Framework unable to 
configure log4net by pointing it to the cfg file.", ex);
                }
                try
                {
                    ConnectLog4NetAppenders(connectionString);
                }
                catch (Exception ex)
                {
                    throw new ApplicationException("Framework unable to connect 
log4net appenders.", ex);
                }
            }
            catch (Exception ex)
            {
                Exception innerEx = ex;
                while(innerEx.InnerException != null)
                    innerEx = innerEx.InnerException;
                string cfgFilePath = "Unknown";
                if (cfg != null)
                    cfgFilePath = cfg.FilePath;
 
                string msg = string.Format("{0}.\nAssembly Location: 
{1}\ncfg.FilePath: {2}\n", ex.Message, assemblyPath, cfgFilePath);
                throw new ApplicationException(msg, innerEx);
            }
        }
        private static void ConnectLog4NetAppenders(string connectionString)
        {
            log4net.Repository.Hierarchy.Hierarchy hier = 
log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;
            if (hier != null)
            {
                //string cnStr = "data source=do-sqld1;initial 
catalog=Admin;integrated security=true;persist security info=True";
                foreach (log4net.Appender.IAppender appender in 
hier.GetAppenders())
                {
                    if (appender.GetType() == 
typeof(log4net.Appender.AdoNetAppender) && 
!string.IsNullOrEmpty(connectionString))
                    {
                        log4net.Appender.AdoNetAppender sqlAppender = 
(log4net.Appender.AdoNetAppender)appender;
                        sqlAppender.ConnectionString = connectionString;
                        // In order to get these custom id values into the log, 
we have to dynamically create parameters and populate them.
                        // This is because log4net does not expose the command 
object, or existing parameter objects. If we defined them
                        // in the config file, we'd be updating their 
properties here, but instead, we have to create them entirely here.
                        // Note that the command text is still defined in the 
config file and references these parameters, even though they
                        // won't exist up until this point.
                        
sqlAppender.AddParameter(CreateSystemIdParameter("@system_name", SystemName));
                        
sqlAppender.AddParameter(CreateSystemIdParameter("@system_tag", SystemTag));
                        
                        sqlAppender.ActivateOptions(); //refresh settings of 
appender  
                    }
                }
            }
        }

  

________________________________
 From: mmingfeilam <la...@comcast.net>
To: log4net-user@logging.apache.org 
Sent: Wednesday, February 1, 2012 2:12 PM
Subject: log4net AdoNetAppender common connectionstring value
  

i have two exes in my solution that are run simultaeneously.  each exe has a
log4net.xml file with a AdoNetAppender in it:
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data,
Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[database server];initial
catalog=[database name];integrated security=false;persist security
info=True;User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log
([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date,
@thread, @log_level, @logger, @message, @exception)" />
    <parameter>

is there any way to move the value of the connectionstring to a common file
and just reference it by name?  would it be possible to move the appenders
to one common location as well?  i want to do it using a config file and not
programmatically.  thanks.


-- 
View this message in context: 
http://old.nabble.com/log4net-AdoNetAppender-common-connectionstring-value-tp33244792p33244792.html
Sent from the Log4net - Users mailing list archive at Nabble.com.

Reply via email to