Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to configure log4net programmatically from scratch (no config)

This is a Bad Idea, I know, but... I want to configure log4net programmatically from scratch with no config file. I'm working on a simple logging application for me and my team to use for a bunch of relatively small departmental applications we're responsible for. I want them to all log to the same database. The logging application is just a wrapper around log4net with the AdoNetAppender preconfigured.

All of the applications are ClickOnce deployed, which presents a small problem with deploying the config file. If the config file were part of the core project, I could set its properties to deploy with the assembly. But it's part of a linked application, so I don't have the option of deploying it with the main application. (If that's not true, somebody please let me know).

Probably because it's a Bad Idea, there doesn't seem to be much sample code available for programmatically configruating log4net from scratch. Here's what I have so far.

Dim apndr As New AdoNetAppender() apndr.CommandText = "INSERT INTO LOG_ENTRY (LOG_DTM, LOG_LEVEL, LOGGER, MESSAGE, PROGRAM, USER_ID, MACHINE, EXCEPTION) VALUES (@log_date, @log_level, @logger, @message, @program, @user, @machine, @exception)" apndr.ConnectionString = connectionString apndr.ConnectionType = "System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" apndr.CommandType = CommandType.Text Dim logDate As New AdoNetAppenderParameter() logDate.ParameterName = "@log_date" logDate.DbType = DbType.DateTime logDate.Layout = New RawTimeStampLayout() apndr.AddParameter(logDate) Dim logLevel As New AdoNetAppenderParameter() logLevel.ParameterName = "@log_level" 'And so forth... 

After configuring all the parameters for apndr, I at first tried this...

Dim hier As Hierarchy = DirectCast(LogManager.GetRepository(), Hierarchy) hier.Root.AddAppender(apndr) 

It didn't work. Then, as a shot in the dark, I tried this instead.

BasicConfigurator.Configure(apndr) 

That didn't work either. Does anybody have any good references on how to configure log4net programmatically from scratch with no config file?

like image 838
John M Gant Avatar asked Apr 20 '09 20:04

John M Gant


People also ask

Where is log4net config?

You can configure the log4net. config file to create log files. The file is located in the webroot\App_data directory of the installation.


1 Answers

Here's an example class that creates log4net config completely in code. I should mention that creating a logger via a static method is generally viewed as bad, but in my context, this is what I wanted. Regardless, you can carve up the code to meet your needs.

using log4net; using log4net.Repository.Hierarchy; using log4net.Core; using log4net.Appender; using log4net.Layout;  namespace dnservices.logging { public class Logger {     private PatternLayout _layout = new PatternLayout();     private const string LOG_PATTERN = "%d [%t] %-5p %m%n";      public string DefaultPattern     {         get { return LOG_PATTERN; }     }      public Logger()     {         _layout.ConversionPattern = DefaultPattern;         _layout.ActivateOptions();     }      public PatternLayout DefaultLayout     {         get { return _layout; }     }      public void AddAppender(IAppender appender)     {         Hierarchy hierarchy =              (Hierarchy)LogManager.GetRepository();          hierarchy.Root.AddAppender(appender);     }      static Logger()     {         Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();         TraceAppender tracer = new TraceAppender();         PatternLayout patternLayout = new PatternLayout();          patternLayout.ConversionPattern = LOG_PATTERN;         patternLayout.ActivateOptions();          tracer.Layout = patternLayout;         tracer.ActivateOptions();         hierarchy.Root.AddAppender(tracer);          RollingFileAppender roller = new RollingFileAppender();         roller.Layout = patternLayout;         roller.AppendToFile = true;         roller.RollingStyle = RollingFileAppender.RollingMode.Size;         roller.MaxSizeRollBackups = 4;         roller.MaximumFileSize = "100KB";         roller.StaticLogFileName = true;         roller.File = "dnservices.txt";         roller.ActivateOptions();         hierarchy.Root.AddAppender(roller);          hierarchy.Root.Level = Level.All;         hierarchy.Configured = true;     }      public static ILog Create()     {         return LogManager.GetLogger("dnservices");     } } 

}

like image 199
Todd Stout Avatar answered Sep 18 '22 12:09

Todd Stout