logging-log4net-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Todd <todd_beaul...@yahoo.com>
Subject Re: log4net AdoNetAppender common connectionstring value
Date Wed, 01 Feb 2012 19:40:09 GMT
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 <lam.m@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.
Mime
View raw message