Наконец-то я нашел решение, которое удовлетворяет мои потребности.
Я поделюсь этим, если кто-то еще захочет сделать то же самое.
Как я уже предполагал, есть возможность достичь этого с помощью входа в область видимости.
Свойства области должны быть установлены для того, чтобы их можно было использовать для входа в другой файл.
Для удобства я написал метод расширения:
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);
}
}
А теперь в сервисе я могу использовать:
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, так как я хочу войти в другой файл, если ключ установлен. Поэтому я добавил нового приложения с фильтром для свойства Key = ServiceLogger и значения = MyServiceServiceLogger.
Обратите внимание, что если эти журналы должны быть только в одном файле журнала, мы должны установить фильтр игнорирования в общем приложении для ключа свойства = 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>