C# 如何在Asp.net core 2.0中使用log4net

C# 如何在Asp.net core 2.0中使用log4net,c#,asp.net,log4net,asp.net-core-2.0,log4net-configuration,C#,Asp.net,Log4net,Asp.net Core 2.0,Log4net Configuration,如本文所述,我在asp.net core 2.0应用程序中配置了log4net program.cs public static void Main(string[] args) { var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

如本文所述,我在asp.net core 2.0应用程序中配置了
log4net

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 core 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>

您只需将
iLogger工厂
传递给
启动
类,然后调用

loggerFactory.AddLog4Net();
并且有一个配置。因此,您不必编写任何锅炉铭牌代码


根据Irfan的回答,我在OSX上使用.NET Core 2.1.300进行了以下XML配置,它正确地记录并附加到
/log
文件夹以及控制台。注意
log4net.config
必须存在于解决方案根目录中(而在我的情况下,我的应用程序根目录是一个子文件夹)

由于某些原因,通过
log4netConfig[“log4net”]

访问XMLDocument时,找不到log4net节点。您需要安装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");
    }
}
公共类程序
{
专用只读ILogger记录器;
公共计划()
{
var services=newservicecolection()
.AddLogging(logBuilder=>logBuilder.SetMinimumLevel(LogLevel.Debug))
.BuildServiceProvider();
logger=services.GetService()
.AddLog4Net()文件
.CreateLogger();
}
静态void Main(字符串[]参数)
{
程序=新程序();
program.Run();
Console.WriteLine(“\n\n按任意键继续…”);
Console.ReadKey();
}
私家车
{
logger.LogInformation(“日志正在工作”);
}
}

仍在寻找解决方案吗?我从这里得到了我的

我所要做的就是在“程序类”中的“publicstaticvoidmain”方法的顶部添加这两行代码

是的,您必须添加:

  • 使用NuGet的Microsoft.Extensions.Logging.Log4Net.AspNetCore
  • 一个名为log4net.config的文本文件,并将该文件的属性(复制到输出目录)更改为“更新时复制”或“始终复制”
  • 您还可以配置asp.net核心应用程序,使输出控制台中记录的所有内容都记录在您选择的appender中。 您还可以从下载此示例代码,并查看我是如何配置它的。

    单击以了解如何在.NET Core 2.2中实现log4net

    下面的步骤来自上面的链接,详细介绍了如何将log4net添加到.NETCore2.2项目中

    首先,在Package Manager控制台中运行以下命令:

    Install-Package Log4Net_Logging -Version 1.0.0
    
    然后添加包含以下信息的log4net.config(请编辑它以匹配您的设置):

    
    
    然后,将以下代码添加到控制器中(这是一个示例,请在将其添加到控制器之前对其进行编辑):

    public values控制人()
    {
    SetUp(Assembly.GetEntryAssembly(),“log4net.config”);
    }
    //获取api/值
    [HttpGet]
    公共行动结果获取()
    {
    LogFourNet.Info(这是“信息日志”);
    Debug(这是“调试日志”);
    LogFourNet.Error(这是“错误日志”);
    返回新字符串[]{“value1”,“value2”};
    }
    
    然后调用相关的控制器操作(使用上述示例,使用HTTP Get调用
    /Values/Get
    ),您将收到与以下内容匹配的输出:

    2019-06-05 19:58:45103[9]信息-[Log4NetLogging_Project.Controllers.ValuesController.Get:23]-这是信息日志


    我已经找出了问题所在,loggerFactory.AddLog4Net()中的名称空间含糊不清。下面是我如何将log4Net添加到我的Asp.Net核心项目中的一个简短摘要

  • 添加nugget包Microsoft.Extensions.Logging.Log4Net.AspNetCore
  • 在根应用程序文件夹中添加log4net.config文件

  • 打开Startup.cs文件并更改Configure方法,以使用此行loggerFactory.AddLog4Net添加log4net支持

  • 首先,您必须使用Microsoft.Extensions.Logging导入包;使用using语句

    这是整个方法,您必须在ILoggerFactory接口前面加上名称空间

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, NorthwindContext context, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { loggerFactory.AddLog4Net(); .... } public void Configure(IApplicationBuilder应用程序、IHostingEnvironment环境、NorthwindContext上下文、Microsoft.Extensions.Logging.iLogger工厂loggerFactory) { loggerFactory.AddLog4Net(); .... }
    我能够用以下方法作出回应:

    1-Install-Package log4net
    
    首先,我使用以下代码创建数据库和表:

    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>
    
    最后,, 使用这些命令可以享受登录的乐趣

    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...
    } 
    
    公共类值控制器:控制器
    {
    private static readonly ILog log=LogManager.GetLogger(typeof(valuescocontroller));
    [HttpPost]
    公共异步任务登录(字符串用户名、字符串密码)
    {
    日志信息(“操作开始”);
    //更多代码在这里。。。
    日志信息(“操作结束”);
    }
    //更多代码在这里。。。
    } 
    

    祝你好运。

    我正在将.Net Framework控制台应用程序移植到.Net Core,发现在某些情况下无法创建日志文件存在类似问题

    当使用“CreateRepository”时,与.net f
    2-Install-Package MicroKnights.Log4NetAdoNetAppender
    
    3-Install-Package System.Data.SqlClient
    
    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
    )
    
    <?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>
    
    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>();
    
    {
      "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...
    } 
    
    GlobalContext.Properties["LogName"] = LogName;
    var loggerRepository = LogManager.CreateRepository(LogName);
    XmlConfigurator.Configure(loggerRepository);
    
    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");