如何在 Asp.net 核心 2.0 中使用 log4net
How to use log4net in Asp.net core 2.0
我在我的 asp.net 核心 2.0 应用程序中配置 log4net
,如本文所述 LINK
program.cs
public static void Main(string[] args)
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
BuildWebHost(args).Run();
}
家庭控制器
public class HomeController : Controller
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));
public IActionResult Error()
{
log.Info("Hello logging world!");
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingFile" />
</root>
<appender name="RollingFile" type="log4net.Appender.FileAppender">
<file value="C:\Temp\app.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
倒霉!我没有看到在C:\Temp\app.log
目录中生成任何文件。会出现什么错误?如何为 asp.net 核心 2.0 配置 log4net
?
我可以使用以下代码成功记录文件
public static void Main(string[] args)
{
XmlDocument log4netConfig = new XmlDocument();
log4netConfig.Load(File.OpenRead("log4net.config"));
var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
typeof(log4net.Repository.Hierarchy.Hierarchy));
log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
BuildWebHost(args).Run();
}
log4net.config 在网站根目录
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="C:\Temp\" />
<datePattern value="yyyy-MM-dd.'txt'"/>
<staticLogFileName value="false"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level App %newline %message %newline %newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
There is a third-party log4net adapter for the ASP.NET Core logging interface.
您唯一需要做的就是将 ILoggerFactory
传递给您的 Startup
class,然后调用
loggerFactory.AddLog4Net();
并进行配置。所以您不必编写任何样板代码。
根据 Irfan 的回答,我在 OSX 上使用 .NET Core 2.1.300 进行了以下 XML 配置,它正确记录并附加到 ./log
文件夹以及安慰。请注意 log4net.config
必须存在于解决方案根目录中(而在我的例子中,我的应用程序根目录是一个子文件夹)。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="logs/" />
<datePattern value="yyyy-MM-dd.'txt'"/>
<staticLogFileName value="false"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level App %newline %message %newline %newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
<appender-ref ref="ConsoleAppender"/>
</root>
</log4net>
另请注意,在 app.config
中设置 XML 的传统方法不起作用:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net> ...
由于某种原因,通过log4netConfig["log4net"]
访问XML文档时找不到log4net节点。
您需要安装 Microsoft.Extensions.Logging.Log4Net.AspNetCore NuGet 包并将 log4net.config 文件添加到您的应用程序。那么这应该有效:
public class Program
{
private readonly ILogger<Program> logger;
public Program()
{
var services = new ServiceCollection()
.AddLogging(logBuilder => logBuilder.SetMinimumLevel(LogLevel.Debug))
.BuildServiceProvider();
logger = services.GetService<ILoggerFactory>()
.AddLog4Net()
.CreateLogger<Program>();
}
static void Main(string[] args)
{
Program program = new Program();
program.Run();
Console.WriteLine("\n\nPress any key to continue...");
Console.ReadKey();
}
private void Run()
{
logger.LogInformation("Logging is working");
}
}
还在寻找解决方案吗?我从这个 link 得到了我的。
我所要做的就是在 "program class" 中的 "public static void Main" 方法的顶部添加这两行代码。
var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));
是的,你必须添加:
- Microsoft.Extensions.Logging.Log4Net.AspNetCore 使用 NuGet。
- 一个名为 log4net.config 的文本文件,并将文件的 属性(复制到输出目录)更改为 "Copy if Newer" 或 "Copy always".
您还可以配置 asp.net 核心应用程序,使输出控制台中记录的所有内容都将记录在您选择的附加程序中。
您也可以从 github 下载此示例代码,看看我是如何配置它的。
点击here了解如何在.NET Core 2.2中实现log4net
以下步骤取自上述link,分解如何将log4net添加到.NET Core 2.2项目中。
首先,运行 在 Package-Manager 控制台中执行以下命令:
Install-Package Log4Net_Logging -Version 1.0.0
然后使用以下信息添加 log4net.config(请对其进行编辑以匹配您的设置):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logfile.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
<root>
<!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<level value="ALL" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>
然后,将以下代码添加到控制器中(这是一个示例,请在将其添加到您的控制器之前对其进行编辑):
public ValuesController()
{
LogFourNet.SetUp(Assembly.GetEntryAssembly(), "log4net.config");
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
LogFourNet.Info(this, "This is Info logging");
LogFourNet.Debug(this, "This is Debug logging");
LogFourNet.Error(this, "This is Error logging");
return new string[] { "value1", "value2" };
}
然后调用相关的控制器操作(使用上面的示例,使用 HTTP GET 调用 /Values/Get
),您将收到匹配以下内容的输出:
2019-06-05 19:58:45,103 [9] INFO-[Log4NetLogging_Project.Controllers.ValuesController.Get:23] - This is Info logging
我发现问题是 loggerFactory.AddLog4Net() 中的命名空间不明确。以下是我如何将 log4Net 添加到我的 Asp.Net 核心项目的简要总结。
- 添加块包Microsoft.Extensions.Logging。Log4Net.AspNetCore
在您的根应用程序文件夹中添加 log4net.config 文件
打开 Startup.cs 文件并更改 Configure 方法以使用此行添加 log4net 支持 loggerFactory.AddLog4Net
首先你必须使用 Microsoft.Extensions.Logging 导入包;使用 using 语句
这是整个方法,您必须在 ILoggerFactory 接口前加上命名空间
public void Configure(IApplicationBuilder app, IHostingEnvironment env, NorthwindContext context, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory)
{
loggerFactory.AddLog4Net();
....
}
我可以通过以下方法回复:
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...
}
祝你好运。
我正在将 .Net Framework 控制台应用程序移植到 .Net Core 并发现在某些情况下无法创建日志文件的类似问题。
使用“CreateRepository”时,.net 框架和 .net 标准之间似乎存在差异。
在 .Net Framework 下,这可以使用来自 log4net.config
的相同 属性 创建一个具有自己文件名的唯一日志实例
GlobalContext.Properties["LogName"] = LogName;
var loggerRepository = LogManager.CreateRepository(LogName);
XmlConfigurator.Configure(loggerRepository);
在 .Net Standard 下这不起作用,如果您打开跟踪,您会发现它找不到配置文件“.config”。它没有加载以前已知的配置。一旦我将配置添加到配置器,它仍然没有记录,同时也没有抱怨它。
为了让它在 .Net Standard 下以与以前类似的行为工作,这就是我所做的。
var loggerRepository = LogManager.CreateRepository(LogName);
XmlConfigurator.Configure(loggerRepository,new FileInfo("log4net.config"));
var hierarchy = (Hierarchy) loggerRepository;
var appender = (RollingFileAppender)hierarchy.Root.GetAppender("RollingLogFileAppender");
appender.File = Path.Combine(Directory.GetCurrentDirectory(), "logs", $"{LogName}.log");
我不想为每个 repo 创建一个配置文件,所以这个可行。也许有更好的方法可以像以前一样获得 .Net Framework 的行为,如果有,请在下面告诉我。
我在我的 asp.net 核心 2.0 应用程序中配置 log4net
,如本文所述 LINK
program.cs
public static void Main(string[] args)
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
BuildWebHost(args).Run();
}
家庭控制器
public class HomeController : Controller
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));
public IActionResult Error()
{
log.Info("Hello logging world!");
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="RollingFile" />
</root>
<appender name="RollingFile" type="log4net.Appender.FileAppender">
<file value="C:\Temp\app.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d{hh:mm:ss} %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
倒霉!我没有看到在C:\Temp\app.log
目录中生成任何文件。会出现什么错误?如何为 asp.net 核心 2.0 配置 log4net
?
我可以使用以下代码成功记录文件
public static void Main(string[] args)
{
XmlDocument log4netConfig = new XmlDocument();
log4netConfig.Load(File.OpenRead("log4net.config"));
var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
typeof(log4net.Repository.Hierarchy.Hierarchy));
log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
BuildWebHost(args).Run();
}
log4net.config 在网站根目录
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="C:\Temp\" />
<datePattern value="yyyy-MM-dd.'txt'"/>
<staticLogFileName value="false"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level App %newline %message %newline %newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
There is a third-party log4net adapter for the ASP.NET Core logging interface.
您唯一需要做的就是将 ILoggerFactory
传递给您的 Startup
class,然后调用
loggerFactory.AddLog4Net();
并进行配置。所以您不必编写任何样板代码。
根据 Irfan 的回答,我在 OSX 上使用 .NET Core 2.1.300 进行了以下 XML 配置,它正确记录并附加到 ./log
文件夹以及安慰。请注意 log4net.config
必须存在于解决方案根目录中(而在我的例子中,我的应用程序根目录是一个子文件夹)。
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %-5level %logger - %message%newline" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="logs/" />
<datePattern value="yyyy-MM-dd.'txt'"/>
<staticLogFileName value="false"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="100"/>
<maximumFileSize value="15MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level App %newline %message %newline %newline"/>
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
<appender-ref ref="ConsoleAppender"/>
</root>
</log4net>
另请注意,在 app.config
中设置 XML 的传统方法不起作用:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net> ...
由于某种原因,通过log4netConfig["log4net"]
访问XML文档时找不到log4net节点。
您需要安装 Microsoft.Extensions.Logging.Log4Net.AspNetCore NuGet 包并将 log4net.config 文件添加到您的应用程序。那么这应该有效:
public class Program
{
private readonly ILogger<Program> logger;
public Program()
{
var services = new ServiceCollection()
.AddLogging(logBuilder => logBuilder.SetMinimumLevel(LogLevel.Debug))
.BuildServiceProvider();
logger = services.GetService<ILoggerFactory>()
.AddLog4Net()
.CreateLogger<Program>();
}
static void Main(string[] args)
{
Program program = new Program();
program.Run();
Console.WriteLine("\n\nPress any key to continue...");
Console.ReadKey();
}
private void Run()
{
logger.LogInformation("Logging is working");
}
}
还在寻找解决方案吗?我从这个 link 得到了我的。
我所要做的就是在 "program class" 中的 "public static void Main" 方法的顶部添加这两行代码。
var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));
是的,你必须添加:
- Microsoft.Extensions.Logging.Log4Net.AspNetCore 使用 NuGet。
- 一个名为 log4net.config 的文本文件,并将文件的 属性(复制到输出目录)更改为 "Copy if Newer" 或 "Copy always".
您还可以配置 asp.net 核心应用程序,使输出控制台中记录的所有内容都将记录在您选择的附加程序中。 您也可以从 github 下载此示例代码,看看我是如何配置它的。
点击here了解如何在.NET Core 2.2中实现log4net
以下步骤取自上述link,分解如何将log4net添加到.NET Core 2.2项目中。
首先,运行 在 Package-Manager 控制台中执行以下命令:
Install-Package Log4Net_Logging -Version 1.0.0
然后使用以下信息添加 log4net.config(请对其进行编辑以匹配您的设置):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logfile.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p - %m%n" />
</layout>
</appender>
<root>
<!--LogLevel: OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL -->
<level value="ALL" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>
然后,将以下代码添加到控制器中(这是一个示例,请在将其添加到您的控制器之前对其进行编辑):
public ValuesController()
{
LogFourNet.SetUp(Assembly.GetEntryAssembly(), "log4net.config");
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
LogFourNet.Info(this, "This is Info logging");
LogFourNet.Debug(this, "This is Debug logging");
LogFourNet.Error(this, "This is Error logging");
return new string[] { "value1", "value2" };
}
然后调用相关的控制器操作(使用上面的示例,使用 HTTP GET 调用 /Values/Get
),您将收到匹配以下内容的输出:
2019-06-05 19:58:45,103 [9] INFO-[Log4NetLogging_Project.Controllers.ValuesController.Get:23] - This is Info logging
我发现问题是 loggerFactory.AddLog4Net() 中的命名空间不明确。以下是我如何将 log4Net 添加到我的 Asp.Net 核心项目的简要总结。
- 添加块包Microsoft.Extensions.Logging。Log4Net.AspNetCore
在您的根应用程序文件夹中添加 log4net.config 文件
打开 Startup.cs 文件并更改 Configure 方法以使用此行添加 log4net 支持 loggerFactory.AddLog4Net
首先你必须使用 Microsoft.Extensions.Logging 导入包;使用 using 语句
这是整个方法,您必须在 ILoggerFactory 接口前加上命名空间
public void Configure(IApplicationBuilder app, IHostingEnvironment env, NorthwindContext context, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { loggerFactory.AddLog4Net(); .... }
我可以通过以下方法回复:
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...
}
祝你好运。
我正在将 .Net Framework 控制台应用程序移植到 .Net Core 并发现在某些情况下无法创建日志文件的类似问题。
使用“CreateRepository”时,.net 框架和 .net 标准之间似乎存在差异。
在 .Net Framework 下,这可以使用来自 log4net.config
的相同 属性 创建一个具有自己文件名的唯一日志实例GlobalContext.Properties["LogName"] = LogName;
var loggerRepository = LogManager.CreateRepository(LogName);
XmlConfigurator.Configure(loggerRepository);
在 .Net Standard 下这不起作用,如果您打开跟踪,您会发现它找不到配置文件“.config”。它没有加载以前已知的配置。一旦我将配置添加到配置器,它仍然没有记录,同时也没有抱怨它。
为了让它在 .Net Standard 下以与以前类似的行为工作,这就是我所做的。
var loggerRepository = LogManager.CreateRepository(LogName);
XmlConfigurator.Configure(loggerRepository,new FileInfo("log4net.config"));
var hierarchy = (Hierarchy) loggerRepository;
var appender = (RollingFileAppender)hierarchy.Root.GetAppender("RollingLogFileAppender");
appender.File = Path.Combine(Directory.GetCurrentDirectory(), "logs", $"{LogName}.log");
我不想为每个 repo 创建一个配置文件,所以这个可行。也许有更好的方法可以像以前一样获得 .Net Framework 的行为,如果有,请在下面告诉我。