【问题标题】:How to use log4net in Asp.net core 2.0如何在 Asp.net core 2.0 中使用 log4net
【发布时间】:2018-02-20 12:23:18
【问题描述】:

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

程序.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

【问题讨论】:

  • 运气好吗?我希望实现类似的目标?
  • 你也面临同样的问题吗?
  • 是的,它支持!
  • 可能与原始问题有点无关,但可能对其他人有所帮助。请注意,log4net 在 ASP.NET Core 2.0 中没有可用的 ADO.NET Appender(根据文档 logging.apache.org/log4net/release/framework-support.html),因此如果您想登录到数据库,请尝试其他方法。
  • 接受的答案是错误的。正确答案是任何一个使用nuget.org/packages/…

标签: c# asp.net log4net asp.net-core-2.0 log4net-configuration


【解决方案1】:

There is a third-party log4net adapter for the ASP.NET Core logging interface.

您只需将ILoggerFactory 传递给您的Startup 类,然后调用

loggerFactory.AddLog4Net();

并有一个适当的配置。所以你不必编写任何样板代码。

More info here

【讨论】:

  • 好的,但是你如何使用这个记录器呢?我也没有在提供的链接中找到使用示例。例子?
  • @Przemek。一旦你这样做了,然后在你需要的地方注入ILoggerILogger&lt;T&gt;,所有的调用都将被转发到log4net实现。 docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/…
  • Log4Net 中的 .NetCore3.0 是否提供 EventLogAppender 支持?
  • 你如何拥有多个基于 dev 或 prod 的 log4net 配置文件并在它们之间切换?
  • 从 log4net.config 中删除 部分。如果您使用现有的 log4net.config
【解决方案2】:

我可以使用以下代码成功记录文件

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>

【讨论】:

  • 根设置正确,但任何子记录器的级别为空,并且没有设置附加程序。
  • 我不知道儿童记录器,你能分享代码和示例,以便我可以包含在我的答案中。
  • 仍然无法正常工作(参考 ASP.NET Core 2.1 框架)。未创建日志文件。读取 log4.net.config,但似乎没有创建附加程序(日志有空的附加程序列表)。调用 XmlConfigurator。 log4net.config 与原始帖子中的完全相同。有什么想法吗?
【解决方案3】:

仍在寻找解决方案?我从这个link 得到了我的。

我所要做的就是在“程序类”的“public static void Main”方法的顶部添加这两行代码。

 var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
 XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));

是的,您必须添加:

  1. Microsoft.Extensions.Logging.Log4Net.AspNetCore 使用 NuGet。
  2. 名称为 log4net.config 的文本文件,并将文件的属性(复制到输出目录)更改为“如果较新则复制”或“始终复制”。

您还可以配置您的 asp.net 核心应用程序,以便在输出控制台中记录的所有内容都将记录在您选择的附加程序中。 你也可以从github下载这个示例代码,看看我是怎么配置的。

【讨论】:

  • 这仍然是 .NET Core 3.0 上最好的(也是需要的)解决方案吗?
  • 对我来说效果很好;无需像下一个答案所示那样弄乱 ServiceCollections。
【解决方案4】:

您需要安装 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");
    }
}

【讨论】:

    【解决方案5】:

    根据 Irfan 的回答,我在带有 .NET Core 2.1.300 的 OSX 上有以下 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"]访问XMLDocument时找不到log4net节点。

    【讨论】:

    • 警告,调试器在子文件夹中查找文件,而不是根目录。
    【解决方案6】:

    我发现问题是 loggerFactory.AddLog4Net() 中的命名空间不明确。以下是我如何将 log4Net 添加到我的 Asp.Net Core 项目的简要总结。

    1. 添加块包 Microsoft.Extensions.Logging.Log4Net.AspNetCore
    2. 在您的根应用程序文件夹中添加 log4net.config 文件

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

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

    这是整个方法,你必须在 ILoggerFactory 接口前加上命名空间

    公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment 环境,NorthwindContext 上下文,Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { loggerFactory.AddLog4Net(); …… }

    【讨论】:

    【解决方案7】:

    我可以通过以下方式回复:

    1-Install-Package log4net
    
    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
    )
    

    第二, 我在程序中创建 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...
    } 
    

    祝你好运。

    【讨论】:

    【解决方案8】:

    点击here了解如何在.NET Core 2.2中实现log4net

    以下步骤取自上述链接,并分解如何将 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] - 这是信息记录

    【讨论】:

      【解决方案9】:

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

      使用“CreateRepository”时,.net 框架和 .net 标准之间似乎存在差异。

      在 .Net 框架下这可以使用 log4net.config 中的相同属性创建一个具有自己文件名的唯一 Log 实例

      GlobalContext.Properties["LogName"] = LogName;
      var loggerRepository = LogManager.CreateRepository(LogName);
      XmlConfigurator.Configure(loggerRepository);
      

      在 .Net 标准下这不起作用,如果您打开跟踪,您会发现它找不到配置文件“.config”。它没有加载以前已知的配置。一旦我将配置添加到配置器中,它仍然没有记录,同时也没有抱怨它。

      为了让它在 .Net 标准下以与以前类似的行为运行,我就是这样做的。

      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 的行为,如果有,请在下面告诉我。

      【讨论】:

        猜你喜欢
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 2018-10-08
        相关资源
        最近更新 更多