To all,
I'm trying to use log4net to log to a database and to the EventLog. Here's
my setup:
I have a C# console application which calls a C# web service. Both
applications are written under the .Net 2.0 Framework. Both applications are
using a "global" xml configuration file, which is loaded via the
XmlConfigurator. The configuration uses 2 appenders, the AdoNetAppender and
the EventLogAppender.
The "global" configuration file that I mentioned earlier is an xml file that
is hosted by our local web server. Each application takes the configuration
file from the URL specified. Then each application injects its own name in
the ApplicationName section of the EventLogAppender. This is done so that
the names in the EventLog are meaningful instead of having a GUID for the
application name.
The code looks like this:
private static readonly log4net.ILog oLog =
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().
DeclaringType);
static int Main(string[] args)
{
/*******************************************************************/
// Setup the log4net configuration. Here we'll use a cool trick.
// Log4net can be setup to load it's settings from an xml
document
// which we'll get from a URL. This allows us to update the
config
// whenever we want to without redeploying individual programs.
/*******************************************************************/
XmlDocument oDoc = new XmlDocument();
oDoc.Load(Properties.Settings.Default.log4net_config_url);
foreach (XmlNode oNode in
oDoc.SelectNodes("log4net/[EMAIL PROTECTED]'EventLogAppender']"))
{
if (oNode != null)
{
XmlAttribute oValueAttribute =
oDoc.CreateAttribute("value");
oValueAttribute.Value = oLog.Logger.Name.ToString();
XmlNode oNameNode =
oDoc.CreateNode(XmlNodeType.Element, "applicationName", "");
oNameNode.Attributes.Append(oValueAttribute);
oNode.AppendChild(oNameNode);
}
}
log4net.Config.XmlConfigurator.Configure(oDoc.DocumentElement);
The problems that I am having are that:
1. If the web service is not loaded in memory, the first call to the web
service does not log anything to the database. I do, however, get events in
the Application Event Log on the web server.
2. After the first call to the web service, on subseqent web service
calls the AdoNetAppender inserts records with timestamps left over from the
prvious call. So for example, if I call the web service for the first time
at 1:22; nothing is inserted into the database from the web service. If my
second call is at 1:26, the records that the web service inserts have a
timestamp of 1:22. If I call the web service a 3rd time at 1:29, the records
the web service insert have a timestamp of 1:26.
3. Changes to hosted XML file (which are then read by the
XmlConfigurator) do not take effect until the web service is reloaded in IIS.
I do have the [assembly: log4net.Config.XmlConfigurator(Watch = true)] flag
set. But, I'm guessing that because the assembly stays loaded in IIS, this
doesn't really have much effect.
I suspect that the problems in #1 and #2 are defects of the AdoNetAppender.
I suspect that problem #3 is something that I'll have to live with.
Can someone confirm that #1 and #2 are infact defects of the AdoNetAppender?
Thanks in advance,
Matthew Lee
This message and any files transmitted with it are confidential and are
intended solely for the use of the individual or entity to whom they are
addressed. If you have received this email in error, please delete the email
and any files transmitted with it entirely from your computer.