log4net logger not writing my logs to file, but ASP.NET log messages are written - asp.net-core

I have an ASP.NET Core 3.1 Razor pages web site, and am trying to add log4net to it, but can't get logging to work properly. I have referenced the Microsoft.Extensions.Logging.Log4Net.AspNetCore Nuget package and associated dependencies.
I added a log4net.config file...
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="RollingFileAppender"
type="log4net.Appender.RollingFileAppender">
<param name="File"
value="MyWebSite.log" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="2" />
<maximumFileSize value="5MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-7level %logger - %message%newline%exception" />
</layout>
</appender>
<appender name="Console" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
</layout>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
I changed Program.cs to look like this...
public class Program {
public static void Main(string[] args) =>
CreateHostBuilder(args).Build().Run();
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
}).ConfigureLogging(builder => {
builder.SetMinimumLevel(LogLevel.Trace);
builder.AddLog4Net("log4net.config");
});
}
I tried using this on the site home page, as follows...
public class IndexModel : PageModel {
private readonly ILogger<IndexModel> _logger;
public IndexModel(ILogger<IndexModel> logger) {
_logger = logger;
}
public void OnGet() {
_logger.LogDebug("Home page loading");
}
}
However, the log file did not contain the message I added.
I can see that logging is working to a degree, as the log file was created, and the first three lines were...
2020-10-18 16:27:59,052 INFO Microsoft.Hosting.Lifetime.? [?] - MESSAGE: Application started. Press Ctrl+C to shut down.
2020-10-18 16:27:59,065 INFO Microsoft.Hosting.Lifetime.? [?] - MESSAGE: Hosting environment: Development
2020-10-18 16:27:59,066 INFO Microsoft.Hosting.Lifetime.? [?] - MESSAGE: Content root path:
...but then I don't get anything else.
To check it was all being set up correctly, I added the following lines inside the Onget() method...
ILoggerRepository repository = log4net.LogManager.GetAllRepositories().FirstOrDefault();
RollingFileAppender appender = repository.GetAppenders().OfType<RollingFileAppender>().FirstOrDefault();
string logFile = appender.File;
At run time, the logFile variable is correctly set to the path to the expected log file, so it looks like it has initialised fine.
I tried going the old-fashioned root and newing up an instance of the logger as follows...
log4NetLogger = LogManager.GetLogger(typeof(IndexModel));
...and this worked fine.
So, I can log, but only by creating the logger manually, not by injection.
Anyone any idea what I'm doing wrong here? Thanks
Update Having just found out how to debug log4net, I added the following line in the ConfigureServices method in Startupcs...
log4net.Util.LogLog.InternalDebugging = true;
This resulted in the following being sent to the output panel...
log4net: log4net assembly [log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. (.NET Framework [.NET Core 3.1.4] on Microsoft Windows 10.0.18363)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d]
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] Loaded From [Not supported on .NET Core]
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] does not have a RepositoryAttribute specified.
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using XML element
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [DEBUG].
log4net: Logger [root] level set to [name="DEBUG",value=30000].
log4net: Loading Appender [RollingFileAppender] type: [log4net.Appender.RollingFileAppender]
log4net: Setting Property [File] to String value [MyWebSite.log]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [LockingModel] to object [log4net.Appender.FileAppender+MinimalLock]
log4net: Setting Property [RollingStyle] to RollingMode value [Size]
log4net: Setting Property [MaxSizeRollBackups] to Int32 value [2]
log4net: Setting Property [MaximumFileSize] to String value [5MB]
log4net: Setting Property [StaticLogFileName] to Boolean value [True]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date [%thread] %-7level %logger - %message%newline%exception]
log4net: Converter [date] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=7,max=2147483647,leftAlign=True]
log4net: Converter [literal] Option [ ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [logger] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [exception] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Searched for existing files in [PATHTOPROJECT]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [PATHTOPROJECT\MyWebSite.log] append [True]
log4net: Created Appender [RollingFileAppender]
log4net: Adding appender named [RollingFileAppender] to logger [root].
log4net: Hierarchy Threshold []
Microsoft.Hosting.Lifetime: Information: Application started. Press Ctrl+C to shut down.
Microsoft.Hosting.Lifetime: Information: Hosting environment: Development
Microsoft.Hosting.Lifetime: Information: Content root path: PATHTOPROJECT
Not sure if this helps, as it doesn't seem to show any errors. The path is correct, and points to the log file that is written.

Have you changed the default logging level set in your appSettings.json to "Debug"? If it's set to "Information" then debug logging messages won't show.

Related

Failed to use log4crc configuration file

I am trying to use log4c for my C application logging. For implementing rolling policy, I used log4c rolling file APIs. I understood from Log4C developers guide that the rolling policy could be achieved by editing the configuration file (log4crc). I tried editing the appender name to a log file path in the configuration file. But the application run without logging. Can anyone please tell me how to implement rolling log mechanism using log4c?
Please see my helloworld application sample and the configuration file below:
#include<stdio.h>
#include"log4c.h"
int main(int argc, char** argv)
{
int rc = 0;
log4c_category_t* mycat = NULL;
if (log4c_init()){
printf("log4c_init() failed");
rc = 1;
}else{
mycat = log4c_category_get("log4c.examples.helloworld");
log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "Hello World!");
/* Explicitly call the log4c cleanup routine */
if ( log4c_fini()){
printf("log4c_fini() failed");
}
}
return 0;
}
The configuration file looks as follows:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM "">
<log4c version="1.2.3">
<config>
<bufsize>0</bufsize>
<debug level="2"/>
<nocleanup>0</nocleanup>
<reread>1</reread>
</config>
<category name="root" priority="notice"/>
<category name="six13log.log" priority="error" appender="stdout" />
<rollingpolicy name="myrollingpolicy" type="sizewin" maxsize="1024" maxnum="10" />
<appender name="myrollingfileappender" type="rollingfile" logdir="." prefix="myprefix" layout="dated" rollingpolicy="myrollingpolicy" />
<appender name="stdout" type="stream" layout="basic"/>
<appender name="stderr" type="stream" layout="dated"/>
<appender name="syslog" type="syslog" layout="basic"/>
<appender name="s13file" type="s13_file" layout="basic"/>
<appender name="plain_stderr" type="s13_stderr" layout="none"/>
<appender name="cat_stderr" type="s13_stderr" layout="catlayout"/>
<appender name="xml_stderr" type="s13_stderr" layout="xmllayout"/>
<appender name="user_stderr" type="s13_stderr" layout="userlayout"/>
<layout name="basic" type="basic"/>
<layout name="dated" type="dated"/>
<layout name="catlayout" type="s13_cat"/>
<layout name="xmllayout" type="s13_xml"/>
<layout name="none" type="s13_none"/>
<layout name="userlayout" type="s13_userloc"/>
<category name="six13log.log.app.application2" priority="debug" appender="cat_stderr" />
<category name="six13log.log.app.application3" priority="debug" appender="user_stderr" />
<category name="six13log.log.app" priority="debug" appender="myrollingfileappender" />
<category name="log4c.examples.helloworld" priority="debug" appender="stdout"/>
<category name="log4c.examples.helloworld" priority="debug" appender="/home .. /..filename.txt"/>
</log4c>
I edited the last two lines in the configuration file for logging.
Please let me know what is wrong with my log4crc configuration file and how I can use configuration file to implement logging without using log4c rolling policy apis?
I am also new to log4c. But what I understand from your log4c configuration file
you have category name "log4c.examples.helloworld" twice. So when you write log4c_category_get("log4c.examples.helloworld") it is going to check from CRC file and will get appender name.
Corresponding to log4c.examples.helloworld the appender names are "stdout" and "/home .. /..filename.txt". First one is proper as it will give output to screen. The last one is improper. Do not specify file path there. Put name/ string that will correspoond to appender name. And then in appender name you have logdir value where you can specify the directory where your file will get created.
Check whether your log4crc file is included in the helloworld directory
Removing the version number completely works for me:
Change
<log4c version="1.2.3">
to
<log4c>

sl4j/logback under weblogic

I'm trying to configure sl4j/logback under Weblogic12.
I deploy ear file, which has war file, which has WEB-INF\classes\logback.xml
Here is the config:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
My code to log :
private static final Logger logger = LoggerFactory.getLogger(FrontEndServlet.class);
//......
logger.info("info test");
logger.debug("debug test");
logger.error("error test");
What I see in the standart output is :
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost
INFO: info test
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost
SEVERE: error test
So, it looks like config file is not picked up.
What am I doing wrong?
The problem is discussed here in detail: https://stagingthinking.wordpress.com/2012/06/02/annoying-slf4j-problem-in-weblogic-server-12c/
The exact package you need to put to the prefer-application-packages mechanism is org.slf4j, like this:
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application>
<prefer-application-packages>
<package-name>org.slf4j</package-name>
</prefer-application-packages>
</weblogic-application>
Note: Also this question is already answered, I want to add that you should also add prefer-application-resources.
Answer: Add a file called META-INF/weblogic-application.xml to your ear, containing both prefer-application-packages and prefer-application-resources!
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application
xmlns="http://xmlns.oracle.com/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd"
version="6">
<!-- http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm -->
<prefer-application-packages>
<package-name>org.slf4j.*</package-name>
</prefer-application-packages>
<!-- if not using prefer-application-resources you will get a warning like this: -->
<!-- Class path contains multiple SLF4J bindings -->
<!-- SLF4J: Found binding in [jar:file:/C:/wls1211/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] -->
<prefer-application-resources>
<resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
</prefer-application-resources>
</weblogic-application>
The problem was - sl4j did not pick up logback and used Weblogic's slf4j-jdk logging instead. Can be fixed with Weblogic's config weblogic-application.xml, option prefer-application-packages
Alternatively or if you have problems with more than just slf4j, you could use
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
Instead of
<prefer-application-packages>
<package-name>org.slf4j.*</package-name>
</prefer-application-packages>
Source: Oracle
Environment: Weblogic 12.2.1
Logging Framework : Slf4j and Logback
Requirement : Log to a file of my choosing (per application) as well as Weblogic server logs
Using the <prefer-application-packages/> or <prefer-web-inf-classes> in weblogic.xml did not satisfy the requirement. In my testing, using one or the other tags (you can't use both) will result in the application logback.xml to be picked up and logging will go to the file defined in logback.xml. However, the typical STDOUT defintion using logback's ConsoleAppender will not log to the server logs.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
Removing the following from weblogic.xml
<wls:prefer-application-packages>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
will result in using the bundled SLF4j binding, which in Weblogic 12.2.1, is Java Util logging. In this case, log statements will go to the server logs and not to the file definition in the application level logback.xml. In my research, it appears at one time, some version of Weblogic 12 allowed the internal SLF4j to be bound to Log4j but was removed in one of the minor releases. This was my case; I did not have the option of enabling Log4j as the primary logging Framework in Weblogic through the Admin console. I am fairly sure this wouldn't have helped me, but I did want to note it because several documents I read indicated this would be available.
After much research and fighting configuration with weblogic.xml, configuration of POM (exclusions etc) and trying to use different bindings and bridges, I was unable to achieve the logging configuration that I wanted. It appears that Weblogic's slf4j is bound to Java utility logging, for better or worse. If you choose your own implementation of slf4j and binding (in my case Logback), there is no way that I could find to route those messages to Weblogic server logs through configuration. There can only be one binding in slf4j, and although many frameworks can be routed to that one binding, (I found this diagram useful) Weblogic 12.2.1 only employs Java util logging binding, there is no way to (at the application configuration level) to wire Weblogic to use the Logback binding that you provide to log to its server logs. There might be some way to use log4j and bridges to accomplish this, but for me that's entirely too much bloat and configuration to accomplish a simple logging task.
Giving up on trying to conquer this by configuration, I decided to simply write my own logback appender that translates a logging event into a JUL logging event. I replaced the standard STDOUT definition seen in many Logback examples with my own implementation of Logback's AppenderBase. At this point I can now log using per application logging configuration and also log to the Weblogic Server log.
Relevant POM Dependencies:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
weblogic.xml (Note here that Hibernate comes with JbossLogging which will bridge to slf4j automatically)
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/2.0/weblogic-web-app.xsd">
<jsp-descriptor>
<keepgenerated>true</keepgenerated>
<debug>true</debug>
</jsp-descriptor>
<context-root>YourContextRoot</context-root>
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>ch.qos.logback.*</wls:package-name>
<wls:package-name>org.jboss.logging.*</wls:package-name>
<wls:package-name>org.slf4j.*</wls:package-name>
</wls:prefer-application-packages>
<wls:prefer-application-resources>
<wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name>
</wls:prefer-application-resources>
</wls:container-descriptor>
Logback AppenderBase implementation
import java.util.logging.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class WeblogicAppender extends AppenderBase<ILoggingEvent> {
private final Logger logger = Logger.getLogger(WeblogicAppender.class.getName());
ILoggingEvent event = null;
#Override
protected void append(ILoggingEvent event) {
this.event = event;
logger.log(getJULLevel(), event.getFormattedMessage());
}
private java.util.logging.Level getJULLevel() {
if (this.event == null) {
return java.util.logging.Level.SEVERE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.ALL) {
return java.util.logging.Level.ALL;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.DEBUG) {
return java.util.logging.Level.FINE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.ERROR) {
return java.util.logging.Level.SEVERE;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.INFO) {
return java.util.logging.Level.INFO;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.TRACE) {
return java.util.logging.Level.FINEST;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.WARN) {
return java.util.logging.Level.WARNING;
} else if (this.event.getLevel() == ch.qos.logback.classic.Level.OFF) {
return java.util.logging.Level.OFF;
} else {
return java.util.logging.Level.INFO;
}
}
}
Logback.xml configuration
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="com.your.package.WeblogicAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>yourlog.log
</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>yourlog.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>25MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern>
</encoder>
</appender>
<root level="TRACE">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Hopefully I can save others some of the pain that I went through trying to get this working the way I wanted.

Can't Able to get Instance of ExceptionManager

I am using Enterprise Library 5.0 in Silverlight using mvvm-light Framework.
When I'm going to getInstace of ExceptionManager Class like:
var exceptionManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
exceptionManager.HandleException(E.Error, "Policy");
I Got this type of error Message
Activation error occured while trying to get instance of type ExceptionManager, key ""
Resolution of the dependency failed, type = Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager", name = "(none)"
Exception occurred while: while resolving.Exception is: InvalidOperationException - The type TraceListener cannot be constructed. You must configure the container to supply this value
-----------------------------------------------
At the time of the exception, the container was:
Resolving Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManagerImpl,ExceptionManager.__default__ (mapped from Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager, (none))
Resolving parameter "exceptionPolicies" of constructor Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManagerImpl(System.Collections.Generic.IEnumerable`1[[Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Silverlight, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] exceptionPolicies, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Instrumentation.IDefaultExceptionHandlingInstrumentationProvider instrumentationProvider)
Resolving Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl,Policy
Resolving parameter "policyEntries" of constructor Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyImpl(System.String policyName, System.Collections.Generic.IEnumerable`1[[Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Silverlight, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] policyEntries)
Resolving Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry,Policy.All Exceptions
Resolving parameter "handlers" of constructor Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionPolicyEntry(System.Type exceptionType, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.PostHandlingAction postHandlingAction, System.Collections.Generic.IEnumerable`1[[Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.IExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Silverlight, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] handlers, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Instrumentation.IExceptionHandlingInstrumentationProvider instrumentationProvider)
Resolving Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler,Policy.All Exceptions.Logging Exception Handler (mapped from Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.IExceptionHandler, Policy.All Exceptions.Logging Exception Handler)
Resolving parameter "writer" of constructor Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler(System.String logCategory, System.Int32 eventId, Microsoft.Practices.EnterpriseLibrary.Logging.Diagnostics.TraceEventType severity, System.String title, System.Int32 priority, System.Type formatterType, Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter writer)
Resolving Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterImpl,LogWriter.__default__ (mapped from Microsoft.Practices.EnterpriseLibrary.Logging.LogWriter, (none))
Resolving parameter "structureHolder" of constructor Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterImpl(Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterStructureHolder structureHolder, Microsoft.Practices.EnterpriseLibrary.Logging.Instrumentation.ILoggingInstrumentationProvider instrumentationProvider, Microsoft.Practices.EnterpriseLibrary.Logging.IAsyncTracingErrorReporter asyncTracingErrorReporter)
Resolving Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterStructureHolder,LogWriterStructureHolder.__default__ (mapped from Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterStructureHolder, (none))
Resolving parameter "traceSources" of constructor Microsoft.Practices.EnterpriseLibrary.Logging.LogWriterStructureHolder(System.Collections.Generic.IEnumerable`1[[Microsoft.Practices.EnterpriseLibrary.Logging.Filters.ILogFilter, Microsoft.Practices.EnterpriseLibrary.Logging.Silverlight, Version=5.0.505.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] filters, System.Collections.Generic.IEnumerable`1[[System.String, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]] traceSourceNames, System.Collections.Generic.IEnumerable`1[[Microsoft.Practices.EnterpriseLibrary.Logging.LogSource, Microsoft.Practices.EnterpriseLibrary.Logging.Silverlight, Version=5.0.505.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] traceSources, Microsoft.Practices.EnterpriseLibrary.Logging.LogSource allEventsTraceSource, Microsoft.Practices.EnterpriseLibrary.Logging.LogSource notProcessedTraceSource, Microsoft.Practices.EnterpriseLibrary.Logging.LogSource errorsTraceSource, System.String defaultCategory, System.Boolean tracingEnabled, System.Boolean logWarningsWhenNoCategoriesMatch, System.Boolean revertImpersonation)
Resolving Microsoft.Practices.EnterpriseLibrary.Logging.LogSource,General
Resolving parameter "traceListeners" of constructor Microsoft.Practices.EnterpriseLibrary.Logging.LogSource(System.String name, System.Collections.Generic.IEnumerable`1[[Microsoft.Practices.EnterpriseLibrary.Logging.Diagnostics.TraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Silverlight, Version=5.0.505.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35]] traceListeners, Microsoft.Practices.EnterpriseLibrary.Logging.Diagnostics.SourceLevels level, System.Boolean autoFlush, Microsoft.Practices.EnterpriseLibrary.Logging.Instrumentation.ILoggingInstrumentationProvider instrumentationProvider)
Resolving Microsoft.Practices.EnterpriseLibrary.Logging.Diagnostics.TraceListener,Flat File Trace Listener
At Line of
var exceptionManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
My Configuration File is:
<?xml version="1.0" encoding="utf-8"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:el="http://schemas.microsoft.com/practices/2011/entlib">
<el:ExceptionHandlingSettings x:Key="exceptionHandling">
<el:ExceptionHandlingSettings.ExceptionPolicies>
<el:ExceptionPolicyData Name="LogPolicy">
<el:ExceptionPolicyData.ExceptionTypes>
<el:ExceptionTypeData Name="All Exceptions" TypeName="System.Exception, mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e">
<el:ExceptionTypeData.ExceptionHandlers>
<el:LoggingExceptionHandlerData LogCategory="General" FormatterTypeName="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Silverlight, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Priority="-1" Name="Logging Exception Handler" />
</el:ExceptionTypeData.ExceptionHandlers>
</el:ExceptionTypeData>
</el:ExceptionPolicyData.ExceptionTypes>
</el:ExceptionPolicyData>
</el:ExceptionHandlingSettings.ExceptionPolicies>
</el:ExceptionHandlingSettings>
<el:LoggingSettings DefaultCategory="General" x:Key="loggingConfiguration">
<el:LoggingSettings.TraceSources>
<el:TraceSourceData Name="General">
<el:TraceSourceData.TraceListeners>
<el:TraceListenerReferenceData Name="Flat File Trace Listener" />
</el:TraceSourceData.TraceListeners>
</el:TraceSourceData>
</el:LoggingSettings.TraceSources>
<el:LoggingSettings.SpecialTraceSources>
<el:SpecialTraceSourcesData>
<el:SpecialTraceSourcesData.AllEventsTraceSource>
<el:TraceSourceData Name="All Events" />
</el:SpecialTraceSourcesData.AllEventsTraceSource>
<el:SpecialTraceSourcesData.NotProcessedTraceSource>
<el:TraceSourceData Name="Unprocessed Category" />
</el:SpecialTraceSourcesData.NotProcessedTraceSource>
<el:SpecialTraceSourcesData.ErrorsTraceSource>
<el:TraceSourceData Name="Logging Errors & Warnings">
<el:TraceSourceData.TraceListeners>
<el:TraceListenerReferenceData Name="Flat File Trace Listener" />
</el:TraceSourceData.TraceListeners>
</el:TraceSourceData>
</el:SpecialTraceSourcesData.ErrorsTraceSource>
</el:SpecialTraceSourcesData>
</el:LoggingSettings.SpecialTraceSources>
</el:LoggingSettings>
</ResourceDictionary>
It looks like your configuration is referencing a trace listener called "Flat File Trace Listener" but there is no trace listener defined by that name.
Also, you should be aware that the Enterprise Library Silverlight Logging Application Block does not support a Flat File Trace Listener. Valid actions are:
Logging to a remote WCF Service.
Logging to isolated storage.
Logging to an event.

What's wrong with my log4net configuration file?

I am trying to write a simple wrapper around log4net for my team, but I cannot get rid of the log4net configuration errors I am getting.
Can someone assist me?
The Wrapper Class
namespace Common
{
public enum LogType
{
Info,Warn,Fatal,Error,Debug
}
public class DtntLogger
{
public static string LOG4NET_CONFIG_FILE = "log4net.xml";
public LogType LogType { get; protected set; }
/******************************************************************************************/
protected static readonly log4net.ILog FileAppenderLog = log4net.LogManager.GetLogger("LogFileAppender1");
protected static readonly log4net.ILog Eventlog = log4net.LogManager.GetLogger("EventLogAppener1");
//protected static readonly log4net.ILog log = log4net.LogManager.GetLogger("LogFileAppender");
//(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/******************************************************************************************/
protected static DtntLogger _info;
public static DtntLogger Info {
get {
return getLogger(LogType.Info, _info);
}
}
protected static DtntLogger _error;
public static DtntLogger Error
{
get
{
return getLogger(LogType.Error, _error);
}
}
protected static DtntLogger _debug;
public static DtntLogger Debug
{
get
{
return getLogger(LogType.Debug, _debug);
}
}
protected static DtntLogger _fatal;
public static DtntLogger Fatal
{
get
{
return getLogger(LogType.Fatal, _fatal);
}
}
protected static DtntLogger _warn;
public static DtntLogger Warn
{
get
{
return getLogger(LogType.Warn, _warn);
}
}
private static DtntLogger getLogger(LogType type, DtntLogger logger)
{
if (logger == null)
logger = new DtntLogger(type);
lock (logger)
{
return logger;
}
}
#region CTORS
protected DtntLogger(LogType type)
{ this.LogType = type;
LoadLoggerConfig();
}
private void LoadLoggerConfig()
{
FileInfo file = new FileInfo(LOG4NET_CONFIG_FILE);
if (!file.Exists)
{
throw new FileLoadException(string.Format("The configuration file for the logger cannot be found in {0}", file.Directory.FullName), file.FullName);
}
log4net.Config.XmlConfigurator.Configure(file);
}
#endregion
public static string EncodeConsole(string message, params object[] args)
{
string content = message;
string pattern = #"{(.*?)}";
MatchCollection mc = Regex.Matches(content, pattern
, RegexOptions.Compiled); //compiled is faster
#region make better Exception that string.format
bool badStringFormat = false;
try { string.Format(message, args); }
catch (FormatException fe)
{
badStringFormat = true;
}
if (badStringFormat || mc.Count > args.Length)
{
string format1 = "you supplied {0} params, but require {1} in the template";
///error message
string err = string.Format(format1, args.Length, "more");
throw new FormatException(err);
}
#endregion
char delimiter = '~';
char filler = '#';
string encoded = message;
foreach (Match item in mc)
encoded = encoded.Replace(item.Value + "", delimiter.ToString() + filler.ToString() + delimiter.ToString() + "").Replace(delimiter.ToString() + delimiter.ToString(), delimiter.ToString());
if (encoded.EndsWith(delimiter.ToString()))
encoded = encoded.Substring(0, encoded.Length - 1);
if (encoded.StartsWith(delimiter.ToString())) encoded = encoded.Substring(1);
var arr = encoded.Split(delimiter);
string out_ = "";
int matchnum = 0;
for (int i = 0; i < arr.Length; i++)
{
if (arr[i][0] == filler)
{
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.Blue;
var oldmatch = mc[matchnum].Value;
var g = oldmatch.Split(':');
var clear = g[0].Replace("{", "").Replace("}", "");
int value = Int32.Parse(clear);
//will always be 0 for data
string match = "{0}";
if (g.Length > 1)
match = "{0:" + g[1];
string args_matchnum = args[value] + "";
var data = string.Format(match, args[value]);
arr[i] = data;
matchnum++;
}
else
Console.ResetColor();
string arr_i = arr[i].ToString();
Console.Write(arr[i]);
out_ += arr[i];
}
Console.WriteLine("");
return out_;
}
public string Write(string message, params object[] args)
{
string s = Write(FileAppenderLog, message, args);
return s;
}
protected string Write(log4net.ILog log, string message, params object[] args)
{
var newmessage = message;
string format = "{2} - {1} | {0}";
string s1 = string.Format(format,
message,
DateTime.Now.ToString("T"),
Thread.CurrentThread.Name
);
string out_ = string.Format(message, args);
logWrite(log, out_);
logWrite(Eventlog, out_);
EncodeConsole(s1, args);
return out_;
}
private void logWrite(ILog log, string message)
{
if (!log.Logger.Repository.Configured)
LoadLoggerConfig();
switch (this.LogType)
{
case LogType.Info:
if (log.IsInfoEnabled)
log.Info(message);
break;
case LogType.Warn:
if (log.IsWarnEnabled)
log.Warn(message);
break;
case LogType.Fatal:
if (log.IsFatalEnabled)
log.Fatal(message);
break;
case LogType.Error:
if (log.IsErrorEnabled)
log.Error(message);
break;
case LogType.Debug:
if (log.IsDebugEnabled)
log.Debug(message);
break;
default:
throw new InvalidOperationException("LogType is an Enum, what are you doing ???");
}
}
}
}
THE XML Configuration file log4net.xml
< ?xml version="1.0" encoding="utf-8" ?>
<log4net>
<root>
<level value="all" />
<!--
<appender-ref ref="EventLogAppender" />
<appender-ref ref="LogFileAppender" />
-->
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<File value="MyApp.log" />
<AppendToFile value="true" />
<staticLogFileName value="true" />
<maximumFileSize value="1000MB" />
<rollingStyle value="Date" />
<datePattern value="yyyMMdd"/>
<maxSizeRollBackups value="10" />
<threshold value="WARN" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p%t%d{yyyy-MM-dd HH:mm:ss} – %m%n" />
</layout>
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="WARN" />
</evaluator>
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
<applicationName value="MyApp" />
<threshold value="WARN" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<logger name="EventLogAppender1">
<level value="ALL" />
<param value="All" name="Threshold" />
<threshold value="ALL" />
<appender-ref ref="EventLogAppender" />
</logger>
<logger name="LogFileAppender1">
<level value="ALL" />
<maximumfilesize value="1000MB" />
<param value="All" name="Threshold" />
<appender-ref ref="LogFileAppender" />
</logger>
</log4net>
Log4NET Debug data (Console Output)
log4net: log4net assembly [log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\XXXYYYXXX\TestResults\DEV1\Out\log4net.dll]. (.NET Runtime [4.0.30319.261] on Microsoft Windows NT 6.1.7601 Service Pack 1)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\XXXYYYXXX\TestResults\DEV1\Out\DtntLogger.dll]
log4net: Assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using file [log4net.xml]
log4net: configuring repository [log4net-default-repository] using stream
log4net: loading XML configuration
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [all].
log4net: Logger [root] level set to [name="ALL",value=-2147483648].
log4net: Retrieving an instance of log4net.Repository.Logger for logger [EventLogAppender1].
log4net: Setting [EventLogAppender1] additivity to [True].
log4net: Logger [EventLogAppender1] Level string is [ALL].
log4net: Logger [EventLogAppender1] level set to [name="ALL",value=-2147483648].
log4net: Loading Appender [EventLogAppender] type: [log4net.Appender.EventLogAppender]
log4net: Setting Property [ApplicationName] to String value [AppApp]
log4net: Setting Property [Threshold] to Level value [WARN]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date [%thread] %-5level %logger [%property{NDC}] - %message%newline]
log4net: Converter [date] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=5,max=2147483647,leftAlign=True]
log4net: Converter [literal] Option [ ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [logger] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [property] Option [NDC] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Source [AppApp] is registered to log []
log4net: reated Appender [EventLogAppender]
log4net: Adding appender named [EventLogAppender] to logger [EventLogAppender1].
log4net: Retrieving an instance of log4net.Repository.Logger for logger [LogFileAppender1].
log4net: Setting [LogFileAppender1] additivity to [True].
log4net: Logger [LogFileAppender1] Level string is [ALL].
log4net: Logger [LogFileAppender1] level set to [name="ALL",value=-2147483648].
log4net: Loading Appender [LogFileAppender] type: [log4net.Appender.RollingFileAppender]
log4net: Setting Property [File] to String value [App.log]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [StaticLogFileName] to Boolean value [True]
log4net: Setting Property [MaximumFileSize] to String value [1000MB]
log4net: Setting Property [RollingStyle] to RollingMode value [Date]
log4net: Setting Property [DatePattern] to String value [yyyMMdd]
log4net: Setting Property [MaxSizeRollBackups] to Int32 value [10]
log4net: Setting Property [Threshold] to Level value [WARN]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%-5p%t%d{yyyy-MM-dd HH:mm:ss} – %m%n]
log4net: Converter [p] Option [] Format [min=5,max=2147483647,leftAlign=True]
log4net: Converter [t] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [d] Option [yyyy-MM-dd HH:mm:ss] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ – ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [m] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [n] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Type = [0], r0 = [19700101], r1 = [19700101]
log4net: Type = [1], r0 = [19700101], r1 = [19700101]
log4net: Type = [2], r0 = [19700101], r1 = [19700101]
log4net: Type = [3], r0 = [19700101], r1 = [19700102]
log4net: Searched for existing files in [C:\XXXYYYXXX\TestResults\DEV1\Out]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [C:\XXXYYYXXX\TestResults\DEV1\Out\App.log] append [True]
log4net: reated Appender [LogFileAppender]
log4net: Adding appender named [LogFileAppender] to logger [LogFileAppender1].
log4net: Hierarchy Threshold []
log4net: No appenders could be found for logger [EventLogAppener1] repository [log4net-default-repository]
log4net: Please initialize the log4net system properly.
log4net: Current AppDomain context information:
log4net: BaseDirectory : C:\XXXYYYXXX\TestResults\DEV1\Out
log4net: FriendlyName : TestAppDomain: 5dfd9ec0-bf14-4d65-9b74-b78d054c9ca0
log4net: DynamicDirectory:
Agent: adapter run thread for test 'TestWrite' with id '4f072f2c-d52e-466c-bf4d-87b1a0d3cc40' - 13:02:58 | debugging
Log4NET Debug data (Std Error Output)
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [Threshold] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [threshold] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [maximumfilesize] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [Threshold] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [evaluator] to set object on [log4net.Appender.RollingFileAppender]
Debug Trace
log4net: log4net assembly [log4net, Version=1.2.11.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\XXXYYYXXX\TestResults\DEV1\Out\log4net.dll]. (.NET Runtime [4.0.30319.261] on Microsoft Windows NT 6.1.7601 Service Pack 1)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\XXXYYYXXX\TestResults\DEV1\Out\DtntLogger.dll]
log4net: Assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [DtntLogger, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using file [log4net.xml]
log4net: configuring repository [log4net-default-repository] using stream
log4net: loading XML configuration
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [all].
log4net: Logger [root] level set to [name="ALL",value=-2147483648].
log4net: Retrieving an instance of log4net.Repository.Logger for logger [EventLogAppender1].
log4net: Setting [EventLogAppender1] additivity to [True].
log4net: Logger [EventLogAppender1] Level string is [ALL].
log4net: Logger [EventLogAppender1] level set to [name="ALL",value=-2147483648].
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [Threshold] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [threshold] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net: Loading Appender [EventLogAppender] type: [log4net.Appender.EventLogAppender]
log4net: Setting Property [ApplicationName] to String value [AppApp]
log4net: Setting Property [Threshold] to Level value [WARN]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date [%thread] %-5level %logger [%property{NDC}] - %message%newline]
log4net: Converter [date] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=5,max=2147483647,leftAlign=True]
log4net: Converter [literal] Option [ ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [logger] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [property] Option [NDC] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Source [AppApp] is registered to log []
log4net: reated Appender [EventLogAppender]
log4net: Adding appender named [EventLogAppender] to logger [EventLogAppender1].
log4net: Retrieving an instance of log4net.Repository.Logger for logger [LogFileAppender1].
log4net: Setting [LogFileAppender1] additivity to [True].
log4net: Logger [LogFileAppender1] Level string is [ALL].
log4net: Logger [LogFileAppender1] level set to [name="ALL",value=-2147483648].
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [maximumfilesize] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [Threshold] to set object on [log4net.Repository.Hierarchy.DefaultLoggerFactory+LoggerImpl]
log4net: Loading Appender [LogFileAppender] type: [log4net.Appender.RollingFileAppender]
log4net: Setting Property [File] to String value [App.log]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [StaticLogFileName] to Boolean value [True]
log4net: Setting Property [MaximumFileSize] to String value [1000MB]
log4net: Setting Property [RollingStyle] to RollingMode value [Date]
log4net: Setting Property [DatePattern] to String value [yyyMMdd]
log4net: Setting Property [MaxSizeRollBackups] to Int32 value [10]
log4net: Setting Property [Threshold] to Level value [WARN]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%-5p%t%d{yyyy-MM-dd HH:mm:ss} – %m%n]
log4net: Converter [p] Option [] Format [min=5,max=2147483647,leftAlign=True]
log4net: Converter [t] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [d] Option [yyyy-MM-dd HH:mm:ss] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ – ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [m] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [n] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net:ERROR XmlHierarchyConfigurator: Cannot find Property [evaluator] to set object on [log4net.Appender.RollingFileAppender]
log4net: Type = [0], r0 = [19700101], r1 = [19700101]
log4net: Type = [1], r0 = [19700101], r1 = [19700101]
log4net: Type = [2], r0 = [19700101], r1 = [19700101]
log4net: Type = [3], r0 = [19700101], r1 = [19700102]
log4net: Searched for existing files in [C:\XXXYYYXXX\TestResults\DEV1\Out]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [C:\XXXYYYXXX\TestResults\DEV1\Out\App.log] append [True]
log4net: reated Appender [LogFileAppender]
log4net: Adding appender named [LogFileAppender] to logger [LogFileAppender1].
log4net: Hierarchy Threshold []
log4net: No appenders could be found for logger [EventLogAppener1] repository [log4net-default-repository]
log4net: Please initialize the log4net system properly.
log4net: Current AppDomain context information:
log4net: BaseDirectory : C:\XXXYYYXXX\TestResults\DEV1\Out
log4net: FriendlyName : TestAppDomain: 5dfd9ec0-bf14-4d65-9b74-b78d054c9ca0
log4net: DynamicDirectory:
Answered this in my blog http://mperlstein.blogspot.com/2012/04/log4net-configuration-trouble.html
The gist is that log4net uses reflection to update attributes, and Threshold does not exist as a writable property/attribute on the object in question.
Never again

Unity unable to correctly resolve WCF InstanceContext implementation

I'm attempting to set up the client for a duplex WCF service via Unity 2.0. To do so, I want to insert an implementation of my CallbackContract - IUpdateClient - into an InstanceContext, which is then inserted into my service proxy, in this case a subclass of DuplexClientBase<IUpdateService> called UpdateProxy.
The problem I encounter is, when attempting to use the Proxy as stored in my Unity container to subscribe the client to updates from the service, I receive the following exception:
The InstanceContext provided to the
ChannelFactory contains a UserObject
that does not implement the
CallbackContractType
'..Services..ServiceContracts.IUpdateClient'.
I am accessing the proxy like so:
_container.Resolve<IUpdateService>("updateServiceImpl").Subscribe();
Given my Unity config:
<!-- Interface to implementation mappings -->
<register type="RepositoryInterface" mapTo="Repository" name="repositoryImpl">
<constructor>
<param name="proxy" dependencyName="proxyImpl"/>
</constructor>
</register>
<!-- Here's the bit that doesn't seem to be resolving as expected -->
<register type="UpdateClientInterface" mapTo="UpdateClient" name="updateClientImpl">
<lifetime type="singleton"/>
<constructor>
<param name="repository" dependencyName="repositoryImpl"/>
</constructor>
</register>
<register type="System.ServiceModel.InstanceContext, System.ServiceModel,
Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="instanceContext">
<constructor>
<param name="implementation" dependencyName="updateClientImpl"/>
</constructor>
</register>
<!-- This is the type I'm resolving with the above _container.Resolve() statement -->
<register type="UpdateServiceInterface" mapTo="UpdateService" name="updateServiceImpl">
<constructor>
<param name="callbackInstance" dependencyName="instanceContext"/>
</constructor>
</register>
<register type="ProxyInterface" mapTo="Proxy" name="proxyImpl">
<constructor>
<param name="configurationName">
<value value="ServiceEndpointFromAppConfig"/>
</param>
</constructor>
</register>
I would expect that when I resolve the UpdateService class, seen here:
public class UpdateProxy : DuplexClientBase<IUpdateService>, IUpdateService
{
public UpdateProxy(InstanceContext callbackInstance)
: base(callbackInstance) {}
public void Subscribe() {}
[...]
}
That the Unity container instantiates an InstanceContext (registered as "instanceContext" in config) and, when doing that, it must instantiate the type registered as "updateClientImpl" - which does, in fact, implement IUpdateClient - and pass that into the InstanceContext's constructor as its implementation parameter.
Nonetheless, I receive the error as above.
In Summary (aka "the tl;dr version"): When the Unity container resolves an InstanceContext, it doesn't seem to create its implementation correctly. I don't know if this is an error in configuration, or if I'm fundamentally misunderstanding how the Unity container resolves a set of dependent types. Any guidance on this would be helpful.
The issue you're running into is because you registered the InstanceContext with a name. However, the UpdateProxy type isn't registered at all. So what's happening is the container will attempt to resolve InstanceContext using the default, unnamed registration.
However, since there is no default registration, the defaults kick in and it looks like it is choosing a different constructor.
The fix would be to either register UpdateProxy and set that registration to use the named registration for InstanceContext or to remove the name from the registration for InstanceContext.