Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft.Extensions.Logging.Abstracts登录到多个日志文件_C#_Logging_Nunit_Abstraction - Fatal编程技术网

C# 使用Microsoft.Extensions.Logging.Abstracts登录到多个日志文件

C# 使用Microsoft.Extensions.Logging.Abstracts登录到多个日志文件,c#,logging,nunit,abstraction,C#,Logging,Nunit,Abstraction,我想根据iformation登录到不同的日志文件 应用程序日志文件应包含有关应用程序或服务行为和异常的一般信息 在服务内部,我想登录到应用程序日志文件,对于不适合一般日志文件的内容,我想登录到服务日志文件。服务日志文件的一个示例可能是串行端口的通信 我有一个.net核心应用程序,我在其中初始化Log4Net记录器: public void Configure(..., ILoggerFactory loggerFactory, ...) { ... loggerFactory.A

我想根据iformation登录到不同的日志文件

应用程序日志文件应包含有关应用程序或服务行为和异常的一般信息

在服务内部,我想登录到应用程序日志文件,对于不适合一般日志文件的内容,我想登录到服务日志文件。服务日志文件的一个示例可能是串行端口的通信

我有一个.net核心应用程序,我在其中初始化Log4Net记录器:

public void Configure(..., ILoggerFactory loggerFactory, ...)
{
    ...
    loggerFactory.AddLog4Net();
    ...
}
应用程序日志的log4net.config如下所示:

 <log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="logs/application.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
  <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
  <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
 </log4net>

内置记录器不支持文件日志记录(尽管我认为有人基于Azure提供商进行了扩展?)我的建议是,如果您需要该级别的日志记录,请坚持使用Log4Net。最后,我找到了一个满足我需要的解决方案。 我会分享它,以防其他人也这么做

正如我所想的那样,通过在范围中进行日志记录可以实现这一点。 必须设置作用域属性,以便使用它们登录到其他文件

为了方便起见,我编写了一个扩展方法:

private const string PropertyKey = "ServiceLogger";
private const string ValueSuffix = "ServiceLogger";

public static void ServiceLog<TCategoryName>(this ILogger<TCategoryName> logger, LogLevel level, string message)
{
    using (logger.BeginScope(new[] { new KeyValuePair<string, object>(PropertyKey, $"{typeof(TCategoryName).Name}{ValueSuffix}") }))
    {
        logger.Log(level, message);
    }
}
private const string PropertyKey=“ServiceLogger”;
private const string ValueSuffix=“ServiceLogger”;
公共静态void ServiceLog(此ILogger记录器,日志级别,字符串消息)
{
使用(logger.BeginScope(new[]{newkeyvaluepair(PropertyKey,$“{typeof(TCategoryName.Name}{ValueSuffix}”)})
{
logger.Log(级别、消息);
}
}
现在在服务中,我可以使用:

public void MyService(ILogger<MyService> logger)
{
   // application log file
   logger.Log(LogLevel.Information, $"application log info");
   // service log file
   logger.ServiceLog(LogLevel.Information, $"service log info");
}
public void MyService(ILogger记录器)
{
//应用程序日志文件
logger.Log(LogLevel.Information,$“应用程序日志信息”);
//服务日志文件
logger.ServiceLog(LogLevel.Information,$“服务日志信息”);
}
为了使其正常工作,必须调整log4net配置,因为如果设置了密钥,我希望登录到不同的文件。因此,我添加了一个新的appender,其中包含属性Key=ServiceLogger和value=MyServiceServiceLogger的过滤器

注意:如果此日志应仅位于一个日志文件中,则必须在常规附加器上为属性Key=ServiceLogger和包含ServiceLogger的值设置忽略筛选器

配置示例:

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="app_logger" />
    <appender-ref ref="service_myservice_logger" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
  <appender name="app_logger" type="log4net.Appender.RollingFileAppender">
    <file value="logs/application.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <filter type="log4net.Filter.PropertyFilter">
      <key value="ServiceLogger" />
      <regexToMatch value="ServiceLogger" />
      <acceptOnMatch value="false" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
  <appender name="service_myservice_logger" type="log4net.Appender.RollingFileAppender">
    <file value="logs/my_service.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <filter type="log4net.Filter.PropertyFilter">
      <Key value="ServiceLogger" />
      <StringToMatch value="MyServiceServiceLogger" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
</log4net>

内置记录器是什么意思?我已经使用log4Net登录到一个文件。但是,我不想在我的服务项目中直接引用log4net,因为这限制了我的服务在不同日志提供商中的使用。
public void MyService(ILogger<MyService> logger)
{
   // application log file
   logger.Log(LogLevel.Information, $"application log info");
   // service log file
   logger.ServiceLog(LogLevel.Information, $"service log info");
}
<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="app_logger" />
    <appender-ref ref="service_myservice_logger" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
  <appender name="app_logger" type="log4net.Appender.RollingFileAppender">
    <file value="logs/application.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <filter type="log4net.Filter.PropertyFilter">
      <key value="ServiceLogger" />
      <regexToMatch value="ServiceLogger" />
      <acceptOnMatch value="false" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
  <appender name="service_myservice_logger" type="log4net.Appender.RollingFileAppender">
    <file value="logs/my_service.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="-yyyyMMdd" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="5MB" />
    <preserveLogFileNameExtension value="true" />
    <staticLogFileName value="false" />
    <filter type="log4net.Filter.PropertyFilter">
      <Key value="ServiceLogger" />
      <StringToMatch value="MyServiceServiceLogger" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%2thread] %-5level %.50logger - %message%newline" />
    </layout>
  </appender>
</log4net>