在用 .Net Core 6.0 编写的 REST API 中实现 log4net

Implementing log4net in REST API written in .Net Core 6.0

提问人:Marianne Seggerman 提问时间:7/25/2023 最后编辑:jpsMarianne Seggerman 更新时间:11/7/2023 访问量:66

问:

我需要向 REST API 添加日志记录。它是用 .NET Core 编写的,将在 .Net Core 6.0 上运行。我创建了一个log4net.config文件,如下所示

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
      </configSections>
      <log4net>
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
          <param name="File" value="C:\CMApps\Log\CMS.Folder.API.MyApp.txt" />
          <param name="AppendToFile" value="true" />
          <param name="MaxSizeRollBackups" value="10" />
          <param name="MaximumFileSize" value="50000KB" />
          <param name="RollingStyle" value="Size" />
          <param name="StaticLogFileName" value="true" />
          <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
          </layout>
        </appender>
        <root>
          <level value="ALL" />
          <appender-ref ref="LogFileAppender" />
        </root>
        <logger name="MyApp" additivity="false">
          <level value="ALL" />
          <appender-ref ref="LogFileAppender" />
        </logger>    
      </log4net>  
    </configuration>

谷歌搜索说添加构建器

var builder = WebApplication.builder

在程序.cs中 - 但是我的应用程序不知道Web应用程序 所以我在 Program.cs 中使用了以下内容

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
            // added this
            .ConfigureLogging(builder =>
            {
                builder.AddLog4Net("log4net.config");
            });

我的控制器有这个

        namespace SecureVault.Controllers
        {
        [ApiController]
        [Route("API/[controller]/{id?}")]
    
        public class MyAppController : ControllerBase
        {
            //  private static readonly log4net.ILog log = log4net.LogManager.GetLogger
          (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            private static readonly log4net.ILog log = 
             log4net.LogManager.GetLogger("MyApp");
    
            [HttpGet]
            public string Get(int id)
            {
                log.Info("remove before Production");
    
                return id.ToString();
            }

当我查看日志对象时 - 没有 Appenders 我需要做些什么才能让它工作

其余 .net-core log4net

评论

0赞 Marianne Seggerman 7/26/2023
想通了 - 编辑 log4net.config,删除 <(tm) xml 行、configuration 和 configSections,以便仅保留 </log4net> 的 <log4net>

答:

0赞 Marianne Seggerman 7/26/2023 #1

log4net 应该只是元素

  <log4net>
    <root>
      <level value="ALL" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="C:\CMApps\Log\CMS.BaseTech.API.SecureVault.txt" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="MaximumFileSize" value="50000KB" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>
  </log4net>

控制器中的这一行

private static readonly log4net.ILog log = 
             log4net.LogManager.GetLogger("MyApp");

应该改为

        private readonly ILogger<MyAppController> _logger;
        public MyAppController(ILogger<MyAppController> logger)
        {
            _logger = logger;
            _logger.LogInformation("remove before production - Info");
            _logger.LogDebug("remove before production - Debug");
            _logger.LogWarning("remove before production - Warning");
            _logger.LogError("remove before production - Error");
        }