为 .Net Core 3.1 应用程序配置 log4net 的最简单正确方法
Simplest correct way to configure log4net for a .Net Core 3.1 application
我正在努力理解配置 log4net 以在 .Net Core 3.1 应用程序中使用的最简单方法。该应用程序使用 log4net 2.0.8。所以:
有没有办法使用 application.runtimeconfig.json 文件来进行配置?如果是这样,我将向应用程序添加什么代码以告诉它使用这些设置 - 类似于:
log4net.Config.XmlConfigurator.Configure();
如果这不可能,那么添加配置文件(例如 log4net.xml 并告诉应用程序使用它)的最简单方法是什么?
我想暂时将所有日志记录定向到一个文件,比如说 Temp.log。我看过很多 log4net 页面,但他们要么谈论使用 Assembly.Info.cs,这在新的 .Net Core 3.1 项目中不存在,要么似乎以编程方式设置我想避免的 log4net 配置。我原以为这很容易,所以如果我错过了一个明显的方法,我深表歉意。
稍微编辑一下我的回答,以明确 Core 不包含开箱即用的普通文件记录器。我的错。 (截至 2020 年 5 月 19 日)
我建议使用 Microsoft 的日志记录扩展而不是 log4net,但这应该适合你。 Core 现在带有一个记录器,它非常好并且很容易插入 DI,并使用 appsettings.json。如果你愿意,我也可以提供一个样本。但这是 log4net 基本示例。
从文件(文件设置为始终复制)加载配置的示例控制台应用程序
using log4net.Repository;
using System;
using System.IO;
using System.Reflection;
namespace ConsoleApp1Core
{
class Program
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static void Main(string[] args)
{
try
{
ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetCallingAssembly());
var fileInfo = new FileInfo(@"log4net.config");
log4net.Config.XmlConfigurator.Configure(repository, fileInfo);
log.Info("test");
Console.WriteLine("press any key");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Press any key to exit");
Console.ReadLine();
}
}
}
}
使用 Microsoft.Extensions.Logging。Log4Net.AspNetCore 很容易配置。
参考:https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore
我可以通过以下方法回复:
1-Install-Package log4net
2-Install-Package MicroKnights.Log4NetAdoNetAppender
3-Install-Package System.Data.SqlClient
首先,我创建了一个数据库,Table 使用以下代码:
CREATE DATABSE Log4netDb
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)
其次,
我在程序中创建了 log4net.config 文件。
这是一个简单的配置,没有对日志消息进行自定义:
<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
<!-- definition of the RollingLogFileAppender goes here -->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs/WebApp.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!-- Format is [date/time] [log level] [thread] message-->
<conversionPattern value="[%date] [%level] [%thread] %m%n" />
</layout>
</appender>
<appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
<connectionStringName value="log4net" />
<connectionStringFile value="appsettings.json" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
<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="@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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
第三,我将下面的代码替换为 IHostBuilder
:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
// clear default logging providers
logging.ClearProviders();
logging.AddConsole();
logging.AddDebug();
logging.AddEventLog();
// add more providers here
})
.UseStartup<Startup>();
第四,在appsettings.json
我插入了这段代码:
{
"connectionStrings": {
"log4net": "Server=MICKO-PC;Database=Log4netDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
最后,我已经使用这些命令享受登录了
public class ValuesController : Controller
{
private static readonly ILog log = LogManager.GetLogger(typeof(ValuesController));
[HttpPost]
public async Task<IActionResult> Login(string userName, string password)
{
log.Info("Action start");
// More code here ...
log.Info("Action end");
}
// More code here...
}
祝你好运。
对我来说,唯一有用的是安装额外的 Nuget 包:
Serilog.Extensions.Logging.File
当然包括Microsoft.Extensions.Logging.Log4Net.AspNetCore
我正在努力理解配置 log4net 以在 .Net Core 3.1 应用程序中使用的最简单方法。该应用程序使用 log4net 2.0.8。所以:
有没有办法使用 application.runtimeconfig.json 文件来进行配置?如果是这样,我将向应用程序添加什么代码以告诉它使用这些设置 - 类似于:
log4net.Config.XmlConfigurator.Configure();
如果这不可能,那么添加配置文件(例如 log4net.xml 并告诉应用程序使用它)的最简单方法是什么?
我想暂时将所有日志记录定向到一个文件,比如说 Temp.log。我看过很多 log4net 页面,但他们要么谈论使用 Assembly.Info.cs,这在新的 .Net Core 3.1 项目中不存在,要么似乎以编程方式设置我想避免的 log4net 配置。我原以为这很容易,所以如果我错过了一个明显的方法,我深表歉意。
稍微编辑一下我的回答,以明确 Core 不包含开箱即用的普通文件记录器。我的错。 (截至 2020 年 5 月 19 日)
我建议使用 Microsoft 的日志记录扩展而不是 log4net,但这应该适合你。 Core 现在带有一个记录器,它非常好并且很容易插入 DI,并使用 appsettings.json。如果你愿意,我也可以提供一个样本。但这是 log4net 基本示例。
从文件(文件设置为始终复制)加载配置的示例控制台应用程序
using log4net.Repository;
using System;
using System.IO;
using System.Reflection;
namespace ConsoleApp1Core
{
class Program
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static void Main(string[] args)
{
try
{
ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetCallingAssembly());
var fileInfo = new FileInfo(@"log4net.config");
log4net.Config.XmlConfigurator.Configure(repository, fileInfo);
log.Info("test");
Console.WriteLine("press any key");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("Press any key to exit");
Console.ReadLine();
}
}
}
}
使用 Microsoft.Extensions.Logging。Log4Net.AspNetCore 很容易配置。
参考:https://github.com/huorswords/Microsoft.Extensions.Logging.Log4Net.AspNetCore
我可以通过以下方法回复:
1-Install-Package log4net
2-Install-Package MicroKnights.Log4NetAdoNetAppender
3-Install-Package System.Data.SqlClient
首先,我创建了一个数据库,Table 使用以下代码:
CREATE DATABSE Log4netDb
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)
其次, 我在程序中创建了 log4net.config 文件。 这是一个简单的配置,没有对日志消息进行自定义:
<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
<!-- definition of the RollingLogFileAppender goes here -->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs/WebApp.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<!-- Format is [date/time] [log level] [thread] message-->
<conversionPattern value="[%date] [%level] [%thread] %m%n" />
</layout>
</appender>
<appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data" />
<connectionStringName value="log4net" />
<connectionStringFile value="appsettings.json" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
<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="@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="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
第三,我将下面的代码替换为 IHostBuilder
:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
// clear default logging providers
logging.ClearProviders();
logging.AddConsole();
logging.AddDebug();
logging.AddEventLog();
// add more providers here
})
.UseStartup<Startup>();
第四,在appsettings.json
我插入了这段代码:
{
"connectionStrings": {
"log4net": "Server=MICKO-PC;Database=Log4netDb;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
最后,我已经使用这些命令享受登录了
public class ValuesController : Controller
{
private static readonly ILog log = LogManager.GetLogger(typeof(ValuesController));
[HttpPost]
public async Task<IActionResult> Login(string userName, string password)
{
log.Info("Action start");
// More code here ...
log.Info("Action end");
}
// More code here...
}
祝你好运。
对我来说,唯一有用的是安装额外的 Nuget 包:
Serilog.Extensions.Logging.File
当然包括Microsoft.Extensions.Logging.Log4Net.AspNetCore