ashlar64
ashlar64

Reputation: 1094

log4net use a different xml config file when in DEBUG mode compared to RELEASE mode

I have a webapp that I would like to use a different log4net config file when running under DEBUG mode compared to running under RELEASE mode.

I am using log4net version 2.0.3.

In my AssemblyInfo.cs class I have this code:

#if DEBUG
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4netDebug.xml",     Watch = true)]
#else
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4netLive.xml", Watch = true)]
#endif

In my Global.asax.cs class I have this code:

log4net.Config.XmlConfigurator.Configure(); 
log = LogManager.GetLogger(typeof(GlobalApp));

(log is a public static member of GlobalApp.) In my log4netDebug.xml file I have this code:

<?xml version="1.0" encoding="utf-8"?>
<!-- Configuration for logging using log4net-->
<configuration>
<configSections>
<section name="log4net"  type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<!-- Show logging in the Visual Studio output window-->
<appender name="TraceAppender"
      type="log4net.Appender.TraceAppender" >
<layout type="log4net.Layout.PatternLayout">
   <conversionPattern value="%-6level - %message%newline" />
</layout>
</appender>
<appender
        name="AdoNetAppender"
        type="log4net.Appender.AdoNetAppender">
    <threshold>INFO</threshold>
    <bufferSize
    value="1" />
    <connectionType
    value="System.Data.SqlClient.SqlConnection, System.Data,  Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=BLAH;initial  catalog=BLAH;integrated security=True;persist security info=True" />
<commandText value="INSERT INTO Logs ([Date],[Thread],[Source],[Level],  [Logger],[Message],[Exception],[HostName]) VALUES (@log_date, @thread, 'LOG SOURCE',@log_level, @logger, @message, @exception, @hostname)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@hostname" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%property{log4net:HostName}" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="-1" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="-1" />
        <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
</appender>
<root>
    <level value="ALL" />
    <!-- Show logging in the Visual Studio output window-->
    <appender-ref ref="TraceAppender" />
    <appender-ref ref="AdoNetAppender" />
</root>
</log4net>
</configuration>

I have tested this config script and it works if I place it in my web.config file. The log4netDebug.xml file has the Copy always property set.

When I try to do something like this: System.IO.FileInfo fi = new System.IO.FileInfo("Log4NetDebug.xml"); log4net.Config.XmlConfigurator.ConfigureAndWatch(fi);

This doesn't work either.
I have read several stackoverflow and other web pages that describe how to do this and I seem to be doing what they recommend doing but it still deson't seem to work.

Any ideas why?

Upvotes: 2

Views: 1452

Answers (1)

Trevor Pilley
Trevor Pilley

Reputation: 16413

If you look at the Constructor for the FileInfo class, you will see that it expects The fully qualified name of the new file, or the relative file name..

So when you do this System.IO.FileInfo fi = new System.IO.FileInfo("Log4NetDebug.xml"); you need to specify the full path to the file.

As this is in a web app, you probably want something like this:

var logFile = new FileInfo(Path.Combine(HttpRuntime.BinDirectory, "Log4NetDebug.xml"));

Upvotes: 1

Related Questions