# Microsoft.Extensions.Logging.Log4Net.AspNetCore
**Repository Path**: RandyField/Microsoft.Extensions.Logging.Log4Net.AspNetCore
## Basic Information
- **Project Name**: Microsoft.Extensions.Logging.Log4Net.AspNetCore
- **Description**: log4net扩展
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-04
- **Last Updated**: 2021-05-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Microsoft.Extensions.Logging.Log4Net.AspNetCore
Allows to configure Log4net as Microsoft Extensions Logging handler on any ASP.NET Core application.
Thanks to [@anuraj](https://github.com/anuraj) for this [original blog post](https://dotnetthoughts.net/how-to-use-log4net-with-aspnetcore-for-logging/).

[](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Log4Net.AspNetCore/)
## Example of use
* Install the package or reference the project into your asp.net core application.
* Add the `AddLog4Net()` call into your `Configure` method of the `Startup` class.
```csharp
using Microsoft.Extensions.Logging;
public class Startup
{
//...
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
//...
loggerFactory.AddLog4Net(); // << Add this line
app.UseMvc();
//...
}
}
```
* Add a `log4net.config` file with the content:
```xml
```
You can found more configuration examples on [configuration documentation](/doc/CONFIG.md).
## FAQ
### Using BeginScope
> Associated issues #45
From version 2.2.7, this nuget allow to use the `BeginScope` method from `Log4NetLogger`.
```csharp
var dictionary = new Dictionary() { { "test", "SCOPED_VALUE" } };
using (var scope = logger.BeginScope(dictionary))
{
logger.LogCritical(message);
}
```
The `BeginScope` method allow any object, but only some of types are handled in an special way. Those types are:
* `string`
* `IEnumerable>`
* `IEnumerable>`
By default, any other type will be managed as a conventional `object`.
#### How it works
When you use any of the `IEnumerable>` allowed types, the collection will be processed and every item from this collection should be introduced to the `LogicalThreadContext` managed by the log4net library using the `Key` as the property name and the `Value` as the value to replace the placeholder on the Pattern Layout defined.
This example shows how the log4net.config pattern layout could include a `%property{}` placeholder that will be matched within the corresponding scoped value from the collection argument.
```xml
```
When you use the `BeginScope` method passing a collection that contains a KeyValuePair within the key `custom_name`, the logged message will contain the `SCOPED_VALUE` text on it.
```csharp
var dictionary = new Dictionary() { { "custom_name", "SCOPED_VALUE" } };
using (var scope = logger.BeginScope(dictionary))
{
logger.LogCritical(message); // SCOPED_VALUE will replace the %property{custom_name} placeholder
}
```
At the other hand, if the argument is not from the given `IEnumerable>`, the value will be logged on the default `scope` property.
```csharp
using (var scope = logger.BeginScope("SCOPED_VALUE"))
{
logger.LogCritical(message); // SCOPED_VALUE will replace the %property{scope} placeholder
}
using (var scope = logger.BeginScope(Guid.NewGuid()))
{
logger.LogCritical(message); // Guid value will replace the %property{scope} placeholder
}
```
And, when you use two chained `BeginScope` calls...
```csharp
using (var scope = logger.BeginScope("SCOPED_VALUE"))
{
using (var scope = logger.BeginScope(Guid.NewGuid()))
{
logger.LogCritical(message); // SCOPED_VALUE and Guid value (both) will replace the %property{scope} placeholder
}
}
```
For additional information about how the `LogicalThreadContext` works, please visit the [official documentation](https://logging.apache.org/log4net/release/manual/contexts.html)
### .NET Core 2.0 - Logging debug level messages
> Associated issues #34 & #41
In order to be able to register Debug level messages in any of your configured log4net appenders, you should change the ASP .NET Core 2 configuration when you build your `IWebHost` instance as follows.
```csharp
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.ConfigureLogging((hostingContext, logging) =>
{
// The ILoggingBuilder minimum level determines the
// the lowest possible level for logging. The log4net
// level then sets the level that we actually log at.
logging.AddLog4Net();
logging.SetMinimumLevel(LogLevel.Debug);
})
.Build();
```
## Special thanks
Thank you very much to all contributors & users by its collaboration, and specially to:
* [@twenzel](https://github.com/twenzel) by his great job on adapting the library to the new logging recomendations for .NET Core 2.
* [@sBoff](https://github.com/sBoff) by the fix of the mutiple calls to XmlConfigurator.Configure issue.
* [@kastwey](https://github.com/kastwey) by the feature to allow to replace values of log4net.config using the *Microsoft.Extensions.Configuration*.