【问题标题】:log4net logger not writing my logs to file, but ASP.NET log messages are writtenlog4net 记录器没有将我的日志写入文件,但写入了 ASP.NET 日志消息
【发布时间】:2020-08-02 20:30:13
【问题描述】:

我有一个 ASP.NET Core 3.1 Razor 页面网站,我正在尝试向其中添加 log4net,但无法让日志记录正常工作。我已经引用了Microsoft.Extensions.Logging.Log4Net.AspNetCore Nuget 包和相关的依赖项。

我添加了一个 log4net.config 文件...

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <appender name="RollingFileAppender"
            type="log4net.Appender.RollingFileAppender">
    <param name="File"
           value="MyWebSite.log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="2" />
    <maximumFileSize value="5MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-7level %logger - %message%newline%exception" />
    </layout>
  </appender>
  <appender name="Console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
    </layout>
  </appender>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFileAppender" />
  </root>
</log4net>

我将 Program.cs 更改为如下所示...

  public class Program {
    public static void Main(string[] args) =>
      CreateHostBuilder(args).Build().Run();

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

我尝试在网站首页使用这个,如下...

 public class IndexModel : PageModel {
    private readonly ILogger<IndexModel> _logger;

    public IndexModel(ILogger<IndexModel> logger) {
      _logger = logger;
    }

    public void OnGet() {
      _logger.LogDebug("Home page loading");
    }
  }

但是,日志文件不包含我添加的消息。

我可以看到日志记录在一定程度上起作用,因为创建了日志文件,前三行是...

2020-10-18 16:27:59,052 信息 Microsoft.Hosting.Lifetime.? [?] - 消息:应用程序已启动。按 Ctrl+C 关闭。

2020-10-18 16:27:59,065 信息 Microsoft.Hosting.Lifetime.? [?] - 消息:托管环境:开发

2020-10-18 16:27:59,066 信息 Microsoft.Hosting.Lifetime.? [?] - 消息:内容根路径:

...但是我没有得到任何其他东西。

为了检查所有设置是否正确,我在 Onget() 方法中添加了以下几行...

      ILoggerRepository repository = log4net.LogManager.GetAllRepositories().FirstOrDefault();
      RollingFileAppender appender = repository.GetAppenders().OfType<RollingFileAppender>().FirstOrDefault();
      string logFile = appender.File;

在运行时,logFile 变量被正确设置为预期日志文件的路径,所以看起来它已经初始化好了。

我尝试使用老式的根并按如下方式更新记录器的实例...

log4NetLogger = LogManager.GetLogger(typeof(IndexModel));

...效果很好。

所以,我可以记录,但只能通过手动创建记录器,而不是通过注入。

有人知道我在这里做错了什么吗?谢谢

更新刚刚了解了如何调试 log4net,我在 StartupcsConfigureServices 方法中添加了以下行...

log4net.Util.LogLog.InternalDebugging = true;

这导致以下内容被发送到输出面板...

log4net: log4net assembly [log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. (.NET Framework [.NET Core 3.1.4] on Microsoft Windows 10.0.18363)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d]
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] Loaded From [Not supported on .NET Core]
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] does not have a RepositoryAttribute specified.
log4net: Assembly [Microsoft.Extensions.Logging.Log4Net.AspNetCore, Version=3.1.0.0, Culture=neutral, PublicKeyToken=5d1104efbd0e675d] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using XML element
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [DEBUG].
log4net: Logger [root] level set to [name="DEBUG",value=30000].
log4net: Loading Appender [RollingFileAppender] type: [log4net.Appender.RollingFileAppender]
log4net: Setting Property [File] to String value [MyWebSite.log]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [LockingModel] to object [log4net.Appender.FileAppender+MinimalLock]
log4net: Setting Property [RollingStyle] to RollingMode value [Size]
log4net: Setting Property [MaxSizeRollBackups] to Int32 value [2]
log4net: Setting Property [MaximumFileSize] to String value [5MB]
log4net: Setting Property [StaticLogFileName] to Boolean value [True]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date [%thread] %-7level %logger - %message%newline%exception]
log4net: Converter [date] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=7,max=2147483647,leftAlign=True]
log4net: Converter [literal] Option [ ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [logger] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [exception] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Searched for existing files in [PATHTOPROJECT]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [PATHTOPROJECT\MyWebSite.log] append [True]
log4net: Created Appender [RollingFileAppender]
log4net: Adding appender named [RollingFileAppender] to logger [root].
log4net: Hierarchy Threshold []
Microsoft.Hosting.Lifetime: Information: Application started. Press Ctrl+C to shut down.
Microsoft.Hosting.Lifetime: Information: Hosting environment: Development
Microsoft.Hosting.Lifetime: Information: Content root path: PATHTOPROJECT

不确定这是否有帮助,因为它似乎没有显示任何错误。路径正确,指向写入的日志文件。

【问题讨论】:

    标签: asp.net-core dependency-injection log4net


    【解决方案1】:

    您是否已将 appSettings.json 中设置的默认日志记录级别更改为“调试”?如果设置为“信息”,则不会显示调试日志消息。

    【讨论】:

    • 呃,这太明显了!谢谢,这就是问题?
    猜你喜欢
    • 2016-06-30
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2012-11-11
    • 2012-11-03
    相关资源
    最近更新 更多