aierda 2023-07-16 15:14 采纳率: 72.1%
浏览 177
已结题

Microsoft.Extensions.Logging.ILogger实现按类名写入不同的日志文件

问题描述:记得以前使用Log4net时,可以在config文件中配置多个Appender,
每一个类对应一个Appender,即每个类产生的日志会写入到不同的日志文件中,
可避免日志堆累在一起。
目前环境有所变化,使用的是ABP框架,日志使用的类为Microsoft.Extensions.Logging.ILogger
首先我定义了两个Appender, 其目的就是不同的类日志写入到不同的Appender所定义的日志文件中去

<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <appender name="DataSyncServices" type="log4net.Appender.RollingFileAppender">
        <file value="../../../App_Data/Logs/日志文件1.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10000KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
        </layout>
    </appender>
    <appender name="DataSyncTwoServices" type="log4net.Appender.RollingFileAppender">
        <file value="../../../App_Data/Logs/日志文件2.txt" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="10" />
        <maximumFileSize value="10000KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
        </layout>
    </appender>-->
    <root>
        <appender-ref ref="DataSyncServices" />
        <appender-ref ref="DataSyncTwoServices" />
        <level value="DEBUG" />
    </root>
    <logger name="NHibernate">
        <level value="WARN" />
    </logger>
</log4net>

代码内容如下

private readonly ILogger<DataSyncServices> _logger;
public class DataSyncServices : AMSApiServiceBase, IDataSyncServices
{
    public DataSyncServices(ILogger<DataSyncServices> logger,。。。。)
    {
        _logger = logger; //这里是大家都知道的,应用了依赖注入去实例化日志类
    }

    private void Method()
    {
        ....
        /*
        这里输出至日志文件
        奇怪的是,日志内容会同时写入到日志文件1.txt 和 日志文件2.txt两个文件中,与目的可谓是南辕北辙
        */
        _logger.LogInformation("写入DataSyncServices类产生的日志"); 
    }
}


private readonly ILogger<DataSyncTwoServices> _logger;
public class DataSyncTwoServices : AMSApiServiceBase, IDataSyncTwoServices
{
    public DataSyncTwoServices(ILogger<DataSyncTwoServices> logger,。。。。)
    {
        _logger = logger; //这里是大家都知道的,应用了依赖注入去实例化日志类
    }

    private void Method()
    {
        ....
        /*
        这里输出至日志文件
        奇怪的是,日志内容会同时写入到日志文件1.txt 和 日志文件2.txt两个文件中,与目的可谓是南辕北辙
        */
        _logger.LogInformation("写入DataSyncTwoServices类产生的日志"); 
    }
}



提出问题:我的目的是将不同的类产生的日志输入到不同的文件中去,但是按照上面的做法,
结果相反,一个类的日志内容似乎会往两个日志文件中写入。
对于.net core6的Microsoft.Extensions.Logging.ILogger使用,怎样才能实现不同的类产生的日志
输入到不同的文件中去? 有什么好的建议或代码片断可供参考吗?
期待得到各位的指点,感谢!

  • 写回答

11条回答 默认 最新

  • 田猿笔记 2023-07-16 15:54
    关注
    获得2.00元问题酬金

    当使用 Microsoft.Extensions.Logging 日志框架时,可以使用 Microsoft.Extensions.Logging.File 提供程序来将不同类产生的日志输入到不同的文件中。下面是一个完整的示例代码,展示了如何配置和使用该提供程序:

    首先,确保在项目中引用以下 NuGet 包:

    • Microsoft.Extensions.Logging
    • Microsoft.Extensions.Logging.File

    接下来,创建一个名为 "LoggingConfig.cs" 的配置类,用于配置日志提供程序和日志过滤器:

    using Microsoft.Extensions.Logging;
    
    public static class LoggingConfig
    {
        public static void ConfigureLoggerFactory(LoggerFactory loggerFactory)
        {
            // 添加文件日志提供程序
            loggerFactory.AddFile("MyClass.log");
            loggerFactory.AddFile("AnotherClass.log");
    
            // 添加过滤器,将不同类的日志写入不同文件
            loggerFactory.AddFilter("MyNamespace.MyClass", LogLevel.Information);
            loggerFactory.AddFilter("MyNamespace.AnotherClass", LogLevel.Information);
        }
    }
    

    然后,在程序的入口点(例如 Program.cs 文件中的 Main 方法)中进行日志配置:

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    
    public static class Program
    {
        public static void Main()
        {
            // 创建服务集合
            var services = new ServiceCollection();
    
            // 添加日志
            services.AddLogging(builder =>
            {
                builder.ClearProviders(); // 清除默认的日志提供程序
    
                // 配置日志提供程序
                builder.Services.AddSingleton<ILoggerProvider, FileLoggerProvider>();
    
                // 配置 LoggerFactory
                builder.Services.AddSingleton<ILoggerFactory>(loggerFactory =>
                {
                    var factory = new LoggerFactory();
    
                    // 调用自定义的配置方法
                    LoggingConfig.ConfigureLoggerFactory(factory);
    
                    return factory;
                });
            });
    
            // 构建服务提供程序
            var serviceProvider = services.BuildServiceProvider();
    
            // 获取 ILoggerFactory 实例
            var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    
            // 创建 MyClass 实例并使用日志记录
            var myClass = new MyClass(loggerFactory.CreateLogger<MyClass>());
            myClass.DoSomething();
    
            // 创建 AnotherClass 实例并使用日志记录
            var anotherClass = new AnotherClass(loggerFactory.CreateLogger<AnotherClass>());
            anotherClass.DoSomethingElse();
        }
    }
    

    在上述示例中,我们创建了一个静态类 LoggingConfig 用于配置日志提供程序和过滤器。在 ConfigureLoggerFactory 方法中,我们添加了 FileLoggerProvider 提供程序并配置了两个日志文件("MyClass.log" 和 "AnotherClass.log")。然后,我们通过添加过滤器,将 MyClass 类的日志写入 "MyClass.log" 文件中,将 AnotherClass 类的日志写入 "AnotherClass.log" 文件中。

    在程序的入口点,我们使用 ServiceCollectionServiceProvider 配置和构建服务提供程序。然后,我们获取 ILoggerFactory 实例并创建 MyClassAnotherClass 的实例,为它们创建对应的日志记录器。

    请注意,根据实际的命名空间和类名,你需要相应地修改代码中的命名空间和类名,以及文件名和路径。

    评论

报告相同问题?

问题事件

  • 系统已结题 7月24日
  • 创建了问题 7月16日