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?
A bit late for the party. But here is a minimal config that worked for me.
Sample class
Minimal log4net trace config (inside NUnit test)
Prints to the trace listener
One way I've done this in the past is to include the configuration file as an embedded resource, and just used log4net.Config.Configure(Stream).
That way, I could use the configuration syntax I was familiar with, and didn't have to worry about getting a file deployed.
Here's a soup-to-nuts example of how you can create and use an
AdoNetAdapter
entirely in code, completely in the absence of anyApp.config
file (not even forCommon.Logging
). Go ahead, delete it!This has the added benefit of being resilient against updates under the new naming conventions, where the assembly name now reflects the version. (
Common.Logging.Log4Net1213
, etc.)[SQL]
[Main]
[DbAppender]
[DbParameter]
[DbPatternLayout]
[DbExceptionLayout]
Dr. Netjes has this for setting the connectionstring programmatically:
As Jonathan says, using a resource is a good solution.
It's a bit restrictive in that the embedded resource contents will be fixed at compile time. I have a logging component that generates an XmlDocument with a basic Log4Net configuration, using variables defined as appSettings (e.g. filename for a RollingFileAppender, default logging level, maybe connection string name if you want to use an AdoNetAppender). And then I call
log4net.Config.XmlConfigurator.Configure
to configure Log4Net using the root element of the generated XmlDocument.Then administrators can customise the "standard" configuration by modifying a few appSettings (typically level, filename, ...) or can specify an external configuration file to get more control.
It is strange that
BasicConfigurator.Configure(apndr)
did not work. In my case it did its job... But, anyway, here goes the answer - you should've wrotehier.Configured = true;
(c# code) after you've finished all setup.