Blog Settings: Turning Off Comments

I have been thinking about this for a long time and finally decided to make the jump.  I am turning off comments on my blog.  I don’t have very many readers and those of you that do read my blog know me and would contact me via email or phone.  The comments I usually get are from link bots trying to drive traffic to their sites and never add anything to the discussion.

I have tried turning comment moderation and on and adding the Akismet extension for blogengine.  With that I still get an email that requires some action on my part, mostly because of the moderation rather than Akismet I am sure.

Maybe if my blog gets more popular and the need for comments arises I will consider turning them on again but until them I am going leave them off and dedicate the time I was using to deal with the few comments I was getting to more value added activities, like writing more post ;-).

Community: SharePoint Saturday Ozarks

SharePointSatOzarks

SharePoint Saturday Ozark is a one day educational, informative, and lively day filled with sessions from respected SharePoint Professionals and MVP’s. The event was held on July 18th at the South Campus of the North Arkansas College in Harrison, AR, a beautiful vibrant city located in the heart of the Ozark Mountains. The event was organized by Mark Rackley, The SharePoint Hillbilly and member of the Ozark .Net User Group. Over 75 attendees turned out for over 25 sessions covering all aspects of SharePoint from custom development, administration, and branding. There were even a few sessions for .NET Developers.

The event was fantastic, not only where the sessions awesome in every track, it was a great to see how the SharePoint community is coming together and growing. There were lots of great conversations regarding SharePoint and community going on outside the sessions and continued at the SharePint. A SharePint is an after party event where attendees and let their hair down and relax. The SharePint for this event was held at Hotel Seville which was built in 1929.

To find out more about SharePoint Saturday or to get started organizing one in your area be sure to check out the SharePoint Saturday website at http://sharepointsaturday.org. The SharePoint website also list dates and locations for other SharePoint Saturday events. Mark has also posted a great article titled Organizing a SharePoint Event: What you need to Know to help get you started, it is a great overview of the process of putting on a regional event.

I would like to thank Mark Rackley and the SharePoint Saturday event staff for putting on an awesome event and I look forward to SharePoint Saturday Ozarks 2010. I hope to see you there.

This write up also appears on the INETA August Newsletter: here

View previous INETA Newsletters and sign up to receive them via email

Modify Log4Net AdoNetAppender Connection String at run-time

Log4Net

In my every day development I always have to figure out ways to keep my connection information in sync with the environment my application is deployed to.  We currently go through 3 environments; Dev, Test, and Production.  Each with a different set of database and service connections.  Today I was working on setting up Log4Net to use the AdoNetAppender and wanted to have it’s connection string move with my ApplicationSettings so that it would point to the appropriate database for the environment.  After about 3 hours of searching and code pounding I came up with a solution and since it was so hard to find I wanted to share what I learned.

First a little background of how my application is setup.  I have created the following application settings;

  • RunEnvironment: used to show where we are deployed, valid values are Development, Test, or Production
  • Database_Development: stores the database connection for development
  • Database_Test: stores the database connection for test
  • Database_Production: stores the database connection for Production

I also have a static ApplicationSettings class like this:

   1:  using System.Collections.Specialized;      
   2:  using System.Configuration;      
   3:   
   4:  public static class ApplicationSettings
   5:  {
   6:      private static readonly NameValueCollection Settings = ConfigurationManager.AppSettings;
   7:   
   8:      public static string RunEnvironment
   9:      {
  10:          get { return Settings["RunEnvironment"]; }
  11:      }
  12:      
  13:      public static string DatabaseConnectionString
  14:      {
  15:          get { return Settings["Database_" + RunEnvironment]; }
  16:      }
  17:  }

This approach allows me to just ask ApplicationSettings for the DatabaseConnectionString and it is always adjusted for the correct RunEnvironment.

Ok, so now to the Log4Net goodness.  I used the XML Configuration in my app.config to configure Log4Net and tried several ways to get the currently active configuration and manipulate it to reflect the new database connection string.  The solution that finally worked was to implement my own AdoNetAppender derived from the AdoNetAppender and override the ConnectionString Property.

Here is the new CustomAdoNetAppender class:

   1:  using log4net.Appender;
   2:   
   3:  public class CustomAdoNetAppender : AdoNetAppender
   4:  {
   5:      public new string ConnectionString
   6:      {
   7:          get
   8:          {
   9:              return base.ConnectionString;
  10:          }
  11:          set
  12:          {
  13:              base.ConnectionString = ApplicationSettings.DatabaseConnectionString;
  14:          }
  15:      }
  16:  }

 

The next step, which was left out of many of the post regarding this matter, was to modify the Log4Net configuration in your app/web.config to use the new CustomAdoNetAppender like below:

This must be added to the Configuration->ConfigSections of you config file

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

After the Configuration->ConfigSections and at the same level in your config file add the Log4Net

   1:  <log4net>
   2:      <appender name="CustomAdoNetAppender" type="MyCustomNamespace.CustomAdoNetAppender">
   3:        <bufferSize value="100" />
   4:        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data,  />
   5:        Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
   6:        <connectionString value="data source=[DbServer];initial catalog=[DbName]; />
   7:        integrated security=false;persist security info=True;User ID=[DB_USER];Password=[DB_PASS]"
   8:        <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception])  />
   9:        VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"
  10:        <parameter>
  11:          <parameterName value="@log_date" />
  12:          <dbType value="DateTime" />
  13:          <layout type="log4net.Layout.RawTimeStampLayout" />
  14:        </parameter>
  15:        <parameter>
  16:          <parameterName value="@thread" />
  17:          <dbType value="String" />
  18:          <size value="255" />
  19:          <layout type="log4net.Layout.PatternLayout">
  20:            <conversionPattern value="%thread" />
  21:          </layout>
  22:        </parameter>
  23:        <parameter>
  24:          <parameterName value="@log_level" />
  25:          <dbType value="String" />
  26:          <size value="50" />
  27:          <layout type="log4net.Layout.PatternLayout">
  28:            <conversionPattern value="%level" />
  29:          </layout>
  30:        </parameter>
  31:        <parameter>
  32:          <parameterName value="@logger" />
  33:          <dbType value="String" />
  34:          <size value="255" />
  35:          <layout type="log4net.Layout.PatternLayout">
  36:            <conversionPattern value="%logger" />
  37:          </layout>
  38:        </parameter>
  39:        <parameter>
  40:          <parameterName value="@message" />
  41:          <dbType value="String" />
  42:          <size value="4000" />
  43:          <layout type="log4net.Layout.PatternLayout">
  44:            <conversionPattern value="%message" />
  45:          </layout>
  46:        </parameter>
  47:        <parameter>
  48:          <parameterName value="@exception" />
  49:          <dbType value="String" />
  50:          <size value="2000" />
  51:          <layout type="log4net.Layout.ExceptionLayout" />
  52:        </parameter>
  53:      </appender>
  54:      <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
  55:        <layout type="log4net.Layout.PatternLayout">
  56:          <param name="Header" value="[Header]\r\n" />
  57:          <param name="Footer" value="[Footer]\r\n" />
  58:          <param name="ConversionPattern" value="%d [%t] %-5p %m%n" />
  59:        </layout>
  60:      </appender>
  61:      <root>
  62:        <level value="DEBUG" />
  63:        <appender-ref ref="CustomAdoNetAppender" />
  64:        <appender-ref ref="ConsoleAppender" />
  65:      </root>
  66:    </log4net>

You can see on line 2 that we specified our new CustomAdoNetAppender as the name and pointed the type to MyCustomNamespace.CustomAdoNetAppender.  This tells Log4Net what class to use and where to find it.

Now you have a Custom AdoNetAppender that gets the database connection from your application settings at run-time.

Calendar

<<  March 2024  >>
MonTueWedThuFriSatSun
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

View posts in large calendar

Widget Category list not found.

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))X

Tag cloud

    Widget Month List not found.

    Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))X

    Widget AuthorList not found.

    Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))X

    Widget TextBox not found.

    Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))X