ASP.NET Ядро 5.0 реализация nlog не работает

#asp.net-core #asp.net-web-api #nlog

Вопрос:

Я работаю над приложением, в котором я хочу зарегистрировать исключение, но оно не работает. Ошибка, которую я хочу зарегистрировать, в основном связана с validateToken Я хочу знать, какое исключение я получаю. Вот моя реализация, я добавил весь код, который я использую для NLog.

Program.cs

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args).UseNLog()
            .ConfigureLogging((hostingContext, logging) =>
            {
                // Remove all the default logging providers
                logging.ClearProviders();
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                logging.AddNLog().SetMinimumLevel(LogLevel.Error);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
 

Вот скриншот nlog.config файла:

nlog.config

appSetting.json файл настроек:

 "NLogConnection": {
    "DbProvider": "sqlserver",
    "DbHost": "SQL5103.site4now.net",
    "Database": "db_a7b629_testdatabase",
    "User": "db_a7b629_testdatabase_admin",
    "Password": "Ad*******"
  },
 

Вот где я хочу зарегистрировать исключение

 public class UserProfileInfo : IUserProfileInfo
{
    private readonly IHttpNetClientService _apiService;
    protected readonly IOptions<AppSettingDTO.AppSettingDTO> _appSetting;
    private readonly ILogger<UserProfileInfo> _logger;

    public UserProfileInfo(ILogger<UserProfileInfo> logger, IHttpNetClientService HttpClient, IOptions<AppSettingDTO.AppSettingDTO> AppSettings)
    {
        _apiService = HttpClient;
        _appSetting = AppSettings;
        this._logger = logger;
    }
    
    public bool ValidateToken(string token)
    {
        var tokenHandler = new JwtSecurityTokenHandler();

        try
        {
            tokenHandler.ValidateToken(token, new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                ValidateIssuer = true,
                ValidateAudience = false,
                ValidateLifetime = true,
                ValidIssuer = _appSetting.Value.Jwt.Issuer,
                ValidAudience = _appSetting.Value.Jwt.Audience,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSetting.Value.Jwt.Key)),
                ClockSkew = TimeSpan.Zero
            }, out SecurityToken validatedToken);
        }
        catch (Exception ex)
        {
            // this where I want to log an exception but it is not working .. and always log me an error in the txt file generated in c:temp folder 
            this._logger.LogError($"---- Token Error ----", ex.Message);
            return false;
        }

        return true;
    }
}
 

Журнал ошибок в текстовом файле

 2021-10-26 13:38:28.8797 Info Message Template Auto Format enabled
2021-10-26 13:38:28.8797 Info Loading assembly: NLog.Web.AspNetCore
2021-10-26 13:38:28.9069 Info Adding target DatabaseTarget(Name=database)
2021-10-26 13:38:28.9335 Info Validating config: TargetNames=database, ConfigItems=33, FilePath=C:Kamran  Don't DeleteSAUFIKProject FilesGMDGMDAPIGMDApibinDebugnet5.0NLog.config
2021-10-26 13:38:28.9582 Info Configuration initialized.
2021-10-26 13:38:28.9582 Info NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 4.7.9.12899. Product version: 4.7.9 e8712e62842e2d74d60fdf37cf74d743750e5ca2. GlobalAssemblyCache: False
 

Вышеупомянутая ошибка, которая регистрируется в txt-файле по умолчанию, когда есть исключение, но ничего в базе данных, которую я не знаю, может быть, что-то не так с моим классом UserProfileinfo.

Ответ №1:

Правила ведения журнала определяют, куда следует записывать выходные данные регистратора. В ваших правилах ведения журнала указано, что ТОЛЬКО регистраторы с именем database должны быть записаны в database -target:

 <rules>
   <logger name="database" minlevel="error" writeto="database" />
</rules>
 

Но в вашем коде, который вы используете ILogger<UserProfileInfo> , он будет иметь имя регистратора на основе typeof(UserProfileInfo).Name .

Если вы просто хотите, чтобы ВСЕ ошибки не зависели от имени регистратора, тогда просто используйте * -wildcard:

 <rules>
   <logger name="*" minlevel="error" writeto="database" />
</rules>
 

Смотрите также: https://github.com/NLog/NLog/wiki/Tutorial

Смотрите также: https://github.com/nlog/NLog/wiki/Configuration-file#rules

Смотрите также: https://github.com/NLog/NLog .Расширения.Ведение журнала /wiki /NLog-GetCurrentClassLogger-and-Microsoft-ILogger