From f27dfec979c7959c3e56e5e7a05cfbd6101dc410 Mon Sep 17 00:00:00 2001 From: Serkan Kaplan Date: Sun, 4 Aug 2024 03:35:55 +0300 Subject: [PATCH] Response Perfomance Improvement Completed --- .../RepositoryContracts/ICompanyRepository.cs | 6 +- Contracts/ServiceContracts/ICompanyService.cs | 9 +- Entities/Responses/ApiBadRequestResponse.cs | 6 + Entities/Responses/ApiBaseResponse.cs | 6 + Entities/Responses/ApiNotFoundResponse.cs | 6 + Entities/Responses/ApiOkResponse.cs | 6 + Entities/Responses/CompanyNotFoundResponse.cs | 8 + Presentation/Controllers/ApiControllerBase.cs | 27 ++ .../Controllers/AuthenticationController.cs | 2 +- .../Controllers/CompaniesController.cs | 29 +- .../Controllers/CompaniesV2Controller.cs | 12 +- .../Controllers/EmpoyeesController.cs | 2 +- Presentation/Controllers/TokenController.cs | 4 +- .../Extensions/ApiBaseResponseExtensions.cs | 9 + Repository/CompanyRepository.cs | 16 +- Service/CompanyService.cs | 40 ++- Service/EmployeeService.cs | 30 ++- WebAPI/internal_logs/internallog.txt | 253 ++++++++++++++++++ 18 files changed, 419 insertions(+), 52 deletions(-) create mode 100644 Entities/Responses/ApiBadRequestResponse.cs create mode 100644 Entities/Responses/ApiBaseResponse.cs create mode 100644 Entities/Responses/ApiNotFoundResponse.cs create mode 100644 Entities/Responses/ApiOkResponse.cs create mode 100644 Entities/Responses/CompanyNotFoundResponse.cs create mode 100644 Presentation/Controllers/ApiControllerBase.cs create mode 100644 Presentation/Extensions/ApiBaseResponseExtensions.cs diff --git a/Contracts/RepositoryContracts/ICompanyRepository.cs b/Contracts/RepositoryContracts/ICompanyRepository.cs index 6b6742f..797a093 100644 --- a/Contracts/RepositoryContracts/ICompanyRepository.cs +++ b/Contracts/RepositoryContracts/ICompanyRepository.cs @@ -5,8 +5,10 @@ namespace Contracts.RepositoryContracts; public interface ICompanyRepository : IRepositoryBase { - Task> GetAllCompaniesAsync(bool trackChanges); - Task GetCompanyAsync(Guid companyId, bool trackChanges); + // Task> GetAllCompaniesAsync(bool trackChanges); + IEnumerable GetAllCompanies(bool trackChanges); + // Task GetCompanyAsync(Guid companyId, bool trackChanges); + Company GetCompany(Guid companyId, bool trackChanges); void CreateCompany(Company company); Task> GetByIdsAsync(IEnumerable ids, bool trackChanges); void DeleteCompany(Company company); diff --git a/Contracts/ServiceContracts/ICompanyService.cs b/Contracts/ServiceContracts/ICompanyService.cs index f858323..49c79b0 100644 --- a/Contracts/ServiceContracts/ICompanyService.cs +++ b/Contracts/ServiceContracts/ICompanyService.cs @@ -1,12 +1,17 @@  using Entities.DTO; +using Entities.Responses; namespace Contracts.ServiceContracts; public interface ICompanyService { - Task> GetAllCompaniesAsync(bool trackChanges); - Task GetCompanyAsync(Guid companyId, bool trackChanges); + // Task> GetAllCompaniesAsync(bool trackChanges); + ApiBaseResponse GetAllCompanies(bool trackChanges); + // Task GetCompanyAsync(Guid companyId, bool trackChanges); + ApiBaseResponse GetCompany(Guid companyId, bool trackChanges); + + Task CreateCompanyAsync(CompanyForCreationDto company); Task> GetByIdsAsync(IEnumerable ids, bool trackChanges); Task<(IEnumerable companies, string ids)> CreateCompanyCollectionAsync(IEnumerable companyCollection); diff --git a/Entities/Responses/ApiBadRequestResponse.cs b/Entities/Responses/ApiBadRequestResponse.cs new file mode 100644 index 0000000..7db1b36 --- /dev/null +++ b/Entities/Responses/ApiBadRequestResponse.cs @@ -0,0 +1,6 @@ +namespace Entities.Responses; + +public abstract class ApiBadRequestResponse(string message) : ApiBaseResponse(false) +{ + public string Message { get; set; } = message; +} diff --git a/Entities/Responses/ApiBaseResponse.cs b/Entities/Responses/ApiBaseResponse.cs new file mode 100644 index 0000000..a523a42 --- /dev/null +++ b/Entities/Responses/ApiBaseResponse.cs @@ -0,0 +1,6 @@ +namespace Entities.Responses; + +public abstract class ApiBaseResponse(bool success) +{ + public bool Success { get; set; } = success; +} diff --git a/Entities/Responses/ApiNotFoundResponse.cs b/Entities/Responses/ApiNotFoundResponse.cs new file mode 100644 index 0000000..055c630 --- /dev/null +++ b/Entities/Responses/ApiNotFoundResponse.cs @@ -0,0 +1,6 @@ +namespace Entities.Responses; + +public abstract class ApiNotFoundResponse(string message) : ApiBaseResponse(false) +{ + public string Message { get; set; } = message; +} diff --git a/Entities/Responses/ApiOkResponse.cs b/Entities/Responses/ApiOkResponse.cs new file mode 100644 index 0000000..e36c1da --- /dev/null +++ b/Entities/Responses/ApiOkResponse.cs @@ -0,0 +1,6 @@ +namespace Entities.Responses; + +public sealed class ApiOkResponse(TResult result) : ApiBaseResponse(true) +{ + public TResult Result { get; set; } = result; +} diff --git a/Entities/Responses/CompanyNotFoundResponse.cs b/Entities/Responses/CompanyNotFoundResponse.cs new file mode 100644 index 0000000..c3f8939 --- /dev/null +++ b/Entities/Responses/CompanyNotFoundResponse.cs @@ -0,0 +1,8 @@ +namespace Entities.Responses; + +public sealed class CompanyNotFoundResponse : ApiNotFoundResponse +{ + public CompanyNotFoundResponse(Guid id) : base($"Company with id: {id} is not found in db.") + { + } +} \ No newline at end of file diff --git a/Presentation/Controllers/ApiControllerBase.cs b/Presentation/Controllers/ApiControllerBase.cs new file mode 100644 index 0000000..d8b0c1a --- /dev/null +++ b/Presentation/Controllers/ApiControllerBase.cs @@ -0,0 +1,27 @@ +using Entities.ErrorModel; +using Entities.Responses; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; + +namespace Presentation.Controllers; + +public class ApiControllerBase : ControllerBase +{ + public IActionResult ProcessError(ApiBaseResponse baseResponse) + { + return baseResponse switch + { + ApiNotFoundResponse => NotFound(new ErrorDetails + { + Message = ((ApiNotFoundResponse)baseResponse).Message, + StatusCode = StatusCodes.Status404NotFound + }), + ApiBadRequestResponse => BadRequest(new ErrorDetails + { + Message = ((ApiBadRequestResponse)baseResponse).Message, + StatusCode = StatusCodes.Status400BadRequest + }), + _ => throw new NotImplementedException() + }; + } +} \ No newline at end of file diff --git a/Presentation/Controllers/AuthenticationController.cs b/Presentation/Controllers/AuthenticationController.cs index 3d00441..b15af69 100644 --- a/Presentation/Controllers/AuthenticationController.cs +++ b/Presentation/Controllers/AuthenticationController.cs @@ -3,7 +3,7 @@ using Entities.DTO; using Microsoft.AspNetCore.Mvc; -namespace CompanyEmployees.Presentation.Controllers; +namespace Presentation.Controllers; [Route("api/[controller]")] [ApiController] diff --git a/Presentation/Controllers/CompaniesController.cs b/Presentation/Controllers/CompaniesController.cs index 85a30fe..401606d 100644 --- a/Presentation/Controllers/CompaniesController.cs +++ b/Presentation/Controllers/CompaniesController.cs @@ -2,39 +2,46 @@ using CompanyEmployees.Presentation.ModelBinders; using Contracts.ServiceContracts; using Entities.DTO; +using Entities.Responses; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Presentation.Extensions; -namespace CompanyEmployees.Presentation.Controllers; +namespace Presentation.Controllers; [ApiVersion("1.0")] [Route("api/companies")] [ApiController] [ApiExplorerSettings(GroupName = "v1")] -public class CompaniesController(IServiceManager service) : ControllerBase +public class CompaniesController(IServiceManager service) : ApiControllerBase { private readonly IServiceManager _service = service; - /// - /// Gets the list of all companies - /// - /// The companies list - // [HttpHead] [HttpGet] [Authorize] [Authorize(Roles = "Manager")] - public async Task GetCompanies() + // public async Task GetCompanies() + public IActionResult GetCompanies() { - var companies = await _service.CompanyService.GetAllCompaniesAsync(trackChanges: false); + // var companies = await _service.CompanyService.GetAllCompaniesAsync(trackChanges: false); + + var baseResult = _service.CompanyService.GetAllCompanies(trackChanges: false); + // var companies = ((ApiOkResponse>)baseResult).Result; + var companies = baseResult.GetResult>(); return Ok(companies); } [HttpGet("{id:guid}", Name = "CompanyById")] [Authorize(Roles = "Administrator")] - public async Task GetCompany(Guid id) + // public async Task GetCompany(Guid id) + public IActionResult GetCompany(Guid id) { - var company = await _service.CompanyService.GetCompanyAsync(id, trackChanges: false); + // var company = await _service.CompanyService.GetCompanyAsync(id, trackChanges: false); + var baseResult = _service.CompanyService.GetCompany(id, trackChanges: false); + if (!baseResult.Success) return ProcessError(baseResult); + // var company = ((ApiOkResponse)baseResult).Result; + var company = baseResult.GetResult(); return Ok(company); } diff --git a/Presentation/Controllers/CompaniesV2Controller.cs b/Presentation/Controllers/CompaniesV2Controller.cs index 9c038eb..56ddf64 100644 --- a/Presentation/Controllers/CompaniesV2Controller.cs +++ b/Presentation/Controllers/CompaniesV2Controller.cs @@ -1,7 +1,7 @@ using Contracts.ServiceContracts; using Microsoft.AspNetCore.Mvc; -namespace CompanyEmployees.Presentation.Controllers; +namespace Presentation.Controllers; [ApiVersion("2.0", Deprecated = true)] //artık kullanılmayan sürümleri deprecated olarak işaretleyebiliriz. böylece responsun header bölümünde kullanıcı artık bu apinin kullanılmadığını anlar // [Route("api/{v:apiversion}/companies")] //url api versioning için. ama header versioning kullandığımız için yoruma aldık @@ -13,11 +13,13 @@ public class CompaniesV2Controller(IServiceManager service) : ControllerBase private readonly IServiceManager _service = service; [HttpGet] - public async Task GetCompanies() + // public async Task GetCompanies() + public IActionResult GetCompanies() { - var companies = await _service.CompanyService.GetAllCompaniesAsync(trackChanges: false); + // var companies = await _service.CompanyService.GetAllCompaniesAsync(trackChanges: false); // return Ok(companies); - var companiesV2 = companies.Select(x => $"{x.Name} V2"); - return Ok(companiesV2); + // var companiesV2 = companies.Select(x => $"{x.Name} V2"); + var companies = _service.CompanyService.GetAllCompanies(trackChanges: false); + return Ok(companies); } } \ No newline at end of file diff --git a/Presentation/Controllers/EmpoyeesController.cs b/Presentation/Controllers/EmpoyeesController.cs index 900acc7..326b6e0 100644 --- a/Presentation/Controllers/EmpoyeesController.cs +++ b/Presentation/Controllers/EmpoyeesController.cs @@ -6,7 +6,7 @@ using Microsoft.AspNetCore.JsonPatch; using Microsoft.AspNetCore.Mvc; -namespace CompanyEmployees.Presentation.Controllers; +namespace Presentation.Controllers; // Alternatif olarak, /api/employees gibi düz bir yapı da kullanılabilirdi, ancak mevcut yapı daha zengin ve ilişkisel bir API tasarımı sunar. Bu, özellikle karmaşık iş mantığı ve veri ilişkileri olan sistemlerde faydalıdır. [Route("api/companies/{companyId}/[controller]")] diff --git a/Presentation/Controllers/TokenController.cs b/Presentation/Controllers/TokenController.cs index 7ea4f96..2ef93ad 100644 --- a/Presentation/Controllers/TokenController.cs +++ b/Presentation/Controllers/TokenController.cs @@ -3,7 +3,7 @@ using Entities.DTO; using Microsoft.AspNetCore.Mvc; -namespace CompanyEmployees.Presentation.Controllers; +namespace Presentation.Controllers; // tokenın süresi dolmak üzereyse, api/token uç noktasına istekte bulunun ve yeni bir geçerli token alın. [Route("api/[controller]")] @@ -20,4 +20,4 @@ public async Task Refresh([FromBody] TokenDto tokenDto) var tokenDtoToReturn = await _service.AuthenticationService.RefreshToken(tokenDto); return Ok(tokenDtoToReturn); } -} \ No newline at end of file +} diff --git a/Presentation/Extensions/ApiBaseResponseExtensions.cs b/Presentation/Extensions/ApiBaseResponseExtensions.cs new file mode 100644 index 0000000..b494a2f --- /dev/null +++ b/Presentation/Extensions/ApiBaseResponseExtensions.cs @@ -0,0 +1,9 @@ +using Entities.Responses; + +namespace Presentation.Extensions; + +public static class ApiBaseResponseExtensions +{ + public static TResultType GetResult(this ApiBaseResponse apiBaseResponse) + => ((ApiOkResponse)apiBaseResponse).Result; +} \ No newline at end of file diff --git a/Repository/CompanyRepository.cs b/Repository/CompanyRepository.cs index b4776b1..148ae56 100644 --- a/Repository/CompanyRepository.cs +++ b/Repository/CompanyRepository.cs @@ -6,11 +6,19 @@ namespace Repository; public class CompanyRepository(RepositoryContext repositoryContext) : RepositoryBase(repositoryContext), ICompanyRepository { - public async Task> GetAllCompaniesAsync(bool trackChanges) - => await FindAll(trackChanges).OrderBy(c => c.Name).ToListAsync(); - public async Task GetCompanyAsync(Guid companyId, bool trackChanges) - => await FindByCondition(c => c.Id.Equals(companyId), trackChanges).SingleOrDefaultAsync(); + // public async Task> GetAllCompaniesAsync(bool trackChanges) + // => await FindAll(trackChanges).OrderBy(c => c.Name).ToListAsync(); + public IEnumerable GetAllCompanies(bool trackChanges) + => [.. FindAll(trackChanges).OrderBy(c => c.Name)]; + + + // public async Task GetCompanyAsync(Guid companyId, bool trackChanges) + // => await FindByCondition(c => c.Id.Equals(companyId), trackChanges).SingleOrDefaultAsync(); + public Company GetCompany(Guid companyId, bool trackChanges) + => FindByCondition(c => c.Id.Equals(companyId), trackChanges).SingleOrDefault(); + + public async Task> GetByIdsAsync(IEnumerable ids, bool trackChanges) => await FindByCondition(x => ids.Contains(x.Id), trackChanges).ToListAsync(); diff --git a/Service/CompanyService.cs b/Service/CompanyService.cs index f4c95a7..c8ab711 100644 --- a/Service/CompanyService.cs +++ b/Service/CompanyService.cs @@ -5,6 +5,7 @@ using Entities.DTO; using Entities.Exceptions; using Entities.Models; +using Entities.Responses; namespace Service; @@ -14,22 +15,39 @@ internal sealed class CompanyService(IRepositoryManager repository, ILoggerManag private readonly ILoggerManager _logger = logger; private readonly IMapper _mapper = mapper; - public async Task> GetAllCompaniesAsync(bool trackChanges) + // public async Task> GetAllCompaniesAsync(bool trackChanges) + // { + // var companies = await _repository.Company.GetAllCompaniesAsync(trackChanges); + // // var companiesDto = companies.Select(c => new CompanyDto(c.Id, c.Name ?? "", string.Join(' ', c.Address, c.Country))).ToList(); + // var companiesDto = _mapper.Map>(companies); + // return companiesDto; + // } + public ApiBaseResponse GetAllCompanies(bool trackChanges) { - var companies = await _repository.Company.GetAllCompaniesAsync(trackChanges); - // var companiesDto = companies.Select(c => new CompanyDto(c.Id, c.Name ?? "", string.Join(' ', c.Address, c.Country))).ToList(); + var companies = _repository.Company.GetAllCompanies(trackChanges); var companiesDto = _mapper.Map>(companies); - return companiesDto; + return new ApiOkResponse>(companiesDto); } - public async Task GetCompanyAsync(Guid id, bool trackChanges) + + + // public async Task GetCompanyAsync(Guid id, bool trackChanges) + // { + // var company = await GetCompanyAndCheckIfItExists(id, trackChanges); + // var companyDto = _mapper.Map(company); + // return companyDto; + // } + public ApiBaseResponse GetCompany(Guid id, bool trackChanges) { - var company = await GetCompanyAndCheckIfItExists(id, trackChanges); + var company = _repository.Company.GetCompany(id, trackChanges); + if (company is null) return new CompanyNotFoundResponse(id); var companyDto = _mapper.Map(company); - return companyDto; + return new ApiOkResponse(companyDto); } + + public async Task CreateCompanyAsync(CompanyForCreationDto company) { var companyEntity = _mapper.Map(company); @@ -72,21 +90,21 @@ public async Task> GetByIdsAsync(IEnumerable ids, public async Task DeleteCompanyAsync(Guid companyId, bool trackChanges) { - var company = await GetCompanyAndCheckIfItExists(companyId, trackChanges); + var company = GetCompanyAndCheckIfItExists(companyId, trackChanges); _repository.Company.DeleteCompany(company); await _repository.SaveAsync(); } public async Task UpdateCompanyAsync(Guid companyId, CompanyForUpdateDto companyForUpdate, bool trackChanges) { - var company = await GetCompanyAndCheckIfItExists(companyId, trackChanges); + var company = GetCompanyAndCheckIfItExists(companyId, trackChanges); _mapper.Map(companyForUpdate, company); await _repository.SaveAsync(); } - private async Task GetCompanyAndCheckIfItExists(Guid id, bool trackChanges) + private Company GetCompanyAndCheckIfItExists(Guid id, bool trackChanges) { - var company = await _repository.Company.GetCompanyAsync(id, trackChanges) ?? throw new CompanyNotFoundException(id); + var company = _repository.Company.GetCompany(id, trackChanges) ?? throw new CompanyNotFoundException(id); return company; } diff --git a/Service/EmployeeService.cs b/Service/EmployeeService.cs index 3a9725d..0e82e96 100644 --- a/Service/EmployeeService.cs +++ b/Service/EmployeeService.cs @@ -10,7 +10,7 @@ namespace Service; -internal sealed class EmployeeService(IRepositoryManager repository, ILoggerManager logger, IMapper mapper, IDataShaper dataShaper) : IEmployeeService +internal sealed class EmployeeService(IRepositoryManager repository, ILoggerManager logger, IMapper mapper, IDataShaper dataShaper) : IEmployeeService { private readonly IRepositoryManager _repository = repository; private readonly ILoggerManager _logger = logger; @@ -31,22 +31,22 @@ internal sealed class EmployeeService(IRepositoryManager repository, ILoggerMana // public async Task<(IEnumerable employees, MetaData metaData)> GetEmployeesAsync(Guid companyId, EmployeeParameters employeeParameters, bool trackChanges) public async Task<(IEnumerable employees, MetaData metaData)> GetEmployeesAsync(Guid companyId, EmployeeParameters employeeParameters, bool trackChanges) { - if (!employeeParameters.ValidAgeRange) throw new MaxAgeRangeBadRequestException(); + if (!employeeParameters.ValidAgeRange) throw new MaxAgeRangeBadRequestException(); - await CheckIfCompanyExists(companyId, trackChanges); + CheckIfCompanyExists(companyId, trackChanges); var employeesWithMetaData = await _repository.Employee.GetEmployeesAsync(companyId, employeeParameters, trackChanges); var employeesDto = _mapper.Map>(employeesWithMetaData); - var shapedData = _dataShaper.ShapeData(employeesDto,employeeParameters.Fields); + var shapedData = _dataShaper.ShapeData(employeesDto, employeeParameters.Fields); // return (employees: employeesDto, metaData: employeesWithMetaData.MetaData); //shape data ekledik oyuzden bunu yoruma aldık - - return (employees: shapedData, metaData: employeesWithMetaData.MetaData); + + return (employees: shapedData, metaData: employeesWithMetaData.MetaData); } public async Task GetEmployeeAsync(Guid companyId, Guid id, bool trackChanges) { - await CheckIfCompanyExists(companyId, trackChanges); + CheckIfCompanyExists(companyId, trackChanges); var employeeDb = await GetEmployeeForCompanyAndCheckIfItExists(companyId, id, trackChanges); ; var employee = _mapper.Map(employeeDb); @@ -57,7 +57,7 @@ public async Task GetEmployeeAsync(Guid companyId, Guid id, bool tr public async Task CreateEmployeeForCompanyAsync(Guid companyId, EmployeeForCreationDto employeeForCreation, bool trackChanges) { - await CheckIfCompanyExists(companyId, trackChanges); + CheckIfCompanyExists(companyId, trackChanges); var employeeEntity = _mapper.Map(employeeForCreation); _repository.Employee.CreateEmployeeForCompany(companyId, employeeEntity); @@ -72,7 +72,7 @@ public async Task CreateEmployeeForCompanyAsync(Guid companyId, Emp public async Task DeleteEmployeeForCompany(Guid companyId, Guid id, bool trackChanges) { - await CheckIfCompanyExists(companyId, trackChanges); + CheckIfCompanyExists(companyId, trackChanges); var employeeForCompany = await GetEmployeeForCompanyAndCheckIfItExists(companyId, id, trackChanges); _repository.Employee.DeleteEmployee(employeeForCompany); @@ -84,7 +84,7 @@ public async Task DeleteEmployeeForCompany(Guid companyId, Guid id, bool trackCh public async Task UpdateEmployeeForCompany(Guid companyId, Guid id, EmployeeForUpdateDto employeeForUpdate, bool compTrackChanges, bool empTrackChanges) { - await CheckIfCompanyExists(companyId, compTrackChanges); + CheckIfCompanyExists(companyId, compTrackChanges); var employeeEntity = await GetEmployeeForCompanyAndCheckIfItExists(companyId, id, empTrackChanges); @@ -97,7 +97,7 @@ public async Task UpdateEmployeeForCompany(Guid companyId, Guid id, EmployeeForU public async Task<(EmployeeForUpdateDto employeeToPatch, Employee employeeEntity)> GetEmployeeForPatchAsync(Guid companyId, Guid id, bool compTrackChanges, bool empTrackChanges) { - await CheckIfCompanyExists(companyId, compTrackChanges); + CheckIfCompanyExists(companyId, compTrackChanges); var employeeEntity = await GetEmployeeForCompanyAndCheckIfItExists(companyId, id, empTrackChanges); var employeeToPatch = _mapper.Map(employeeEntity); @@ -112,9 +112,13 @@ public async Task SaveChangesForPatchAsync(EmployeeForUpdateDto employeeToPatch, } - private async Task CheckIfCompanyExists(Guid companyId, bool trackChanges) + // private async Task CheckIfCompanyExists(Guid companyId, bool trackChanges) + // { + // _ = await _repository.Company.GetCompanyAsync(companyId, trackChanges) ?? throw new CompanyNotFoundException(companyId); + // } + private void CheckIfCompanyExists(Guid companyId, bool trackChanges) { - _ = await _repository.Company.GetCompanyAsync(companyId, trackChanges) ?? throw new CompanyNotFoundException(companyId); + _ = _repository.Company.GetCompany(companyId, trackChanges) ?? throw new CompanyNotFoundException(companyId); } private async Task GetEmployeeForCompanyAndCheckIfItExists(Guid companyId, Guid id, bool trackChanges) diff --git a/WebAPI/internal_logs/internallog.txt b/WebAPI/internal_logs/internallog.txt index f3b258f..28d1c40 100644 --- a/WebAPI/internal_logs/internallog.txt +++ b/WebAPI/internal_logs/internallog.txt @@ -74,3 +74,256 @@ 2024-08-04 01:10:05.7219 Trace FileTarget(Name=logfile) has 2 layouts 2024-08-04 01:10:05.7219 Trace FileTarget(Name=logfile): Using appenderFactory: NLog.Internal.FileAppenders.SingleProcessFileAppender+Factory 2024-08-04 01:10:05.7378 Info Configuration initialized. +2024-08-04 03:29:28.4236 Debug Message Template Auto Format enabled +2024-08-04 03:29:28.5477 Trace FindReachableObject: +2024-08-04 03:29:28.5477 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:29:28.5477 Debug FileTarget FilePathLayout with FilePathKind.Relative using AppDomain.BaseDirectory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI\bin\Debug\net8.0\ +2024-08-04 03:29:28.5477 Trace FindReachableObject: +2024-08-04 03:29:28.5616 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:29:28.5616 Trace FindReachableObject: +2024-08-04 03:29:28.5616 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:29:28.5616 Trace FindReachableObject: +2024-08-04 03:29:28.5616 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:29:28.5616 Debug Adding target NLog.Targets.FileTarget(Name=logfile) +2024-08-04 03:29:28.5616 Info Registered target NLog.Targets.FileTarget(Name=logfile) +2024-08-04 03:29:28.5616 Trace ParseRulesElement +2024-08-04 03:29:28.5840 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.3.2.2526. Product version: 5.3.2+8d52d4f3fcdbd84beae3442e1fdc8125598ed81f. GlobalAssemblyCache: False +2024-08-04 03:29:28.5840 Debug Start watching file-filter 'nlog.config' in directory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI +2024-08-04 03:29:28.5940 Debug --- NLog configuration dump --- +2024-08-04 03:29:28.5940 Debug Targets: +2024-08-04 03:29:28.5940 Debug FileTarget(Name=logfile) +2024-08-04 03:29:28.5940 Debug Rules: +2024-08-04 03:29:28.5940 Debug logNamePattern: (:All) levels: [ Debug Info Warn Error Fatal ] writeTo: [ logfile ] +2024-08-04 03:29:28.5940 Debug --- End of NLog configuration dump --- +2024-08-04 03:29:28.5940 Trace FindReachableObject: +2024-08-04 03:29:28.6085 Trace Scanning LoggingRule 'logNamePattern: (:All) levels: [ Debug Info Warn Error Fatal ] writeTo: [ logfile ]' +2024-08-04 03:29:28.6085 Trace Scanning Property Targets 'System.Collections.Generic.List`1[NLog.Targets.Target]' System.Collections.Generic.IList`1[NLog.Targets.Target] +2024-08-04 03:29:28.6085 Trace Scanning FileTarget 'FileTarget(Name=logfile)' +2024-08-04 03:29:28.6085 Trace Scanning Property FileName '.\logs\${shortdate}_logfile.txt' NLog.Layouts.Layout +2024-08-04 03:29:28.6085 Trace Scanning SimpleLayout '.\logs\${shortdate}_logfile.txt' +2024-08-04 03:29:28.6085 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:29:28.6085 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.6085 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:29:28.6085 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.6085 Trace Scanning Property Layout '${longdate} ${level:uppercase=true} ${message}' NLog.Layouts.Layout +2024-08-04 03:29:28.6238 Trace Scanning SimpleLayout '${longdate} ${level:uppercase=true} ${message}' +2024-08-04 03:29:28.6238 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:29:28.6238 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:29:28.6238 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.6238 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:29:28.6238 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.6238 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:29:28.6238 Trace Scanning Property ChildRules 'System.Collections.Generic.List`1[NLog.Config.LoggingRule]' System.Collections.Generic.IList`1[NLog.Config.LoggingRule] +2024-08-04 03:29:28.6238 Trace Scanning Property Filters 'System.Collections.Generic.List`1[NLog.Filters.Filter]' System.Collections.Generic.IList`1[NLog.Filters.Filter] +2024-08-04 03:29:28.6238 Info Validating config: TargetNames=logfile, ConfigItems=12, FilePath=C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI\nlog.config +2024-08-04 03:29:28.6238 Debug Unused target checking is started... Rule Count: 1, Target Count: 1 +2024-08-04 03:29:28.6447 Debug Unused target checking is completed. Total Rule Count: 1, Total Target Count: 1, Unused Target Count: 0 +2024-08-04 03:29:28.6447 Trace Initializing Layout Renderer: ${message} +2024-08-04 03:29:28.6447 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:29:28.6447 Trace Initializing Layout Renderer: ${level} +2024-08-04 03:29:28.6447 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:29:28.6447 Trace Initializing Layout Renderer: ${longdate} +2024-08-04 03:29:28.6447 Trace Initializing ${longdate} ${level:uppercase=true} ${message} +2024-08-04 03:29:28.6447 Trace FindReachableObject: +2024-08-04 03:29:28.6546 Trace Scanning SimpleLayout '${longdate} ${level:uppercase=true} ${message}' +2024-08-04 03:29:28.6546 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:29:28.6546 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:29:28.6546 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.6546 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:29:28.6546 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.6546 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:29:28.6719 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:29:28.6973 Trace Initializing Layout Renderer: ${shortdate} +2024-08-04 03:29:28.6973 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:29:28.6973 Trace Initializing .\logs\${shortdate}_logfile.txt +2024-08-04 03:29:28.6973 Trace FindReachableObject: +2024-08-04 03:29:28.6973 Trace Scanning SimpleLayout '.\logs\${shortdate}_logfile.txt' +2024-08-04 03:29:28.7037 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:29:28.7232 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.7232 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:29:28.7232 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:29:28.7232 Trace Initializing FileTarget(Name=logfile) +2024-08-04 03:29:28.7354 Trace FindReachableObject: +2024-08-04 03:29:28.7354 Trace Scanning FileTarget 'FileTarget(Name=logfile)' +2024-08-04 03:29:28.7354 Trace Scanning Property FileName '.\logs\${shortdate}_logfile.txt' NLog.Layouts.Layout +2024-08-04 03:29:28.7354 Trace Scanning Property Layout '${longdate} ${level:uppercase=true} ${message}' NLog.Layouts.Layout +2024-08-04 03:29:28.7354 Trace FileTarget(Name=logfile) has 2 layouts +2024-08-04 03:29:28.7354 Trace FileTarget(Name=logfile): Using appenderFactory: NLog.Internal.FileAppenders.SingleProcessFileAppender+Factory +2024-08-04 03:29:28.7354 Info Configuration initialized. +2024-08-04 03:32:27.8994 Debug Message Template Auto Format enabled +2024-08-04 03:32:27.9596 Trace FindReachableObject: +2024-08-04 03:32:27.9596 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:32:27.9596 Debug FileTarget FilePathLayout with FilePathKind.Relative using AppDomain.BaseDirectory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI\bin\Debug\net8.0\ +2024-08-04 03:32:27.9596 Trace FindReachableObject: +2024-08-04 03:32:27.9596 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:32:27.9690 Trace FindReachableObject: +2024-08-04 03:32:27.9690 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:32:27.9690 Trace FindReachableObject: +2024-08-04 03:32:27.9690 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:32:27.9690 Debug Adding target NLog.Targets.FileTarget(Name=logfile) +2024-08-04 03:32:27.9690 Info Registered target NLog.Targets.FileTarget(Name=logfile) +2024-08-04 03:32:27.9690 Trace ParseRulesElement +2024-08-04 03:32:27.9836 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.3.2.2526. Product version: 5.3.2+8d52d4f3fcdbd84beae3442e1fdc8125598ed81f. GlobalAssemblyCache: False +2024-08-04 03:32:27.9836 Debug Start watching file-filter 'nlog.config' in directory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI +2024-08-04 03:32:27.9836 Debug --- NLog configuration dump --- +2024-08-04 03:32:27.9836 Debug Targets: +2024-08-04 03:32:27.9836 Debug FileTarget(Name=logfile) +2024-08-04 03:32:27.9836 Debug Rules: +2024-08-04 03:32:27.9836 Debug logNamePattern: (:All) levels: [ Debug Info Warn Error Fatal ] writeTo: [ logfile ] +2024-08-04 03:32:27.9836 Debug --- End of NLog configuration dump --- +2024-08-04 03:32:28.0004 Trace FindReachableObject: +2024-08-04 03:32:28.0004 Trace Scanning LoggingRule 'logNamePattern: (:All) levels: [ Debug Info Warn Error Fatal ] writeTo: [ logfile ]' +2024-08-04 03:32:28.0004 Trace Scanning Property Targets 'System.Collections.Generic.List`1[NLog.Targets.Target]' System.Collections.Generic.IList`1[NLog.Targets.Target] +2024-08-04 03:32:28.0004 Trace Scanning FileTarget 'FileTarget(Name=logfile)' +2024-08-04 03:32:28.0004 Trace Scanning Property FileName '.\logs\${shortdate}_logfile.txt' NLog.Layouts.Layout +2024-08-04 03:32:28.0004 Trace Scanning SimpleLayout '.\logs\${shortdate}_logfile.txt' +2024-08-04 03:32:28.0004 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:32:28.0004 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0004 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:32:28.0004 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0004 Trace Scanning Property Layout '${longdate} ${level:uppercase=true} ${message}' NLog.Layouts.Layout +2024-08-04 03:32:28.0004 Trace Scanning SimpleLayout '${longdate} ${level:uppercase=true} ${message}' +2024-08-04 03:32:28.0146 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:32:28.0146 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:32:28.0146 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0146 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:32:28.0146 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0146 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:32:28.0146 Trace Scanning Property ChildRules 'System.Collections.Generic.List`1[NLog.Config.LoggingRule]' System.Collections.Generic.IList`1[NLog.Config.LoggingRule] +2024-08-04 03:32:28.0146 Trace Scanning Property Filters 'System.Collections.Generic.List`1[NLog.Filters.Filter]' System.Collections.Generic.IList`1[NLog.Filters.Filter] +2024-08-04 03:32:28.0146 Info Validating config: TargetNames=logfile, ConfigItems=12, FilePath=C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI\nlog.config +2024-08-04 03:32:28.0146 Debug Unused target checking is started... Rule Count: 1, Target Count: 1 +2024-08-04 03:32:28.0146 Debug Unused target checking is completed. Total Rule Count: 1, Total Target Count: 1, Unused Target Count: 0 +2024-08-04 03:32:28.0146 Trace Initializing Layout Renderer: ${message} +2024-08-04 03:32:28.0311 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:32:28.0311 Trace Initializing Layout Renderer: ${level} +2024-08-04 03:32:28.0311 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:32:28.0311 Trace Initializing Layout Renderer: ${longdate} +2024-08-04 03:32:28.0311 Trace Initializing ${longdate} ${level:uppercase=true} ${message} +2024-08-04 03:32:28.0311 Trace FindReachableObject: +2024-08-04 03:32:28.0311 Trace Scanning SimpleLayout '${longdate} ${level:uppercase=true} ${message}' +2024-08-04 03:32:28.0311 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:32:28.0311 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:32:28.0311 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0311 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:32:28.0311 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0311 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:32:28.0311 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:32:28.0311 Trace Initializing Layout Renderer: ${shortdate} +2024-08-04 03:32:28.0455 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:32:28.0455 Trace Initializing .\logs\${shortdate}_logfile.txt +2024-08-04 03:32:28.0455 Trace FindReachableObject: +2024-08-04 03:32:28.0455 Trace Scanning SimpleLayout '.\logs\${shortdate}_logfile.txt' +2024-08-04 03:32:28.0455 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:32:28.0455 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0455 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:32:28.0455 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:32:28.0455 Trace Initializing FileTarget(Name=logfile) +2024-08-04 03:32:28.0455 Trace FindReachableObject: +2024-08-04 03:32:28.0455 Trace Scanning FileTarget 'FileTarget(Name=logfile)' +2024-08-04 03:32:28.0455 Trace Scanning Property FileName '.\logs\${shortdate}_logfile.txt' NLog.Layouts.Layout +2024-08-04 03:32:28.0455 Trace Scanning Property Layout '${longdate} ${level:uppercase=true} ${message}' NLog.Layouts.Layout +2024-08-04 03:32:28.0455 Trace FileTarget(Name=logfile) has 2 layouts +2024-08-04 03:32:28.0455 Trace FileTarget(Name=logfile): Using appenderFactory: NLog.Internal.FileAppenders.SingleProcessFileAppender+Factory +2024-08-04 03:32:28.0619 Info Configuration initialized. +2024-08-04 03:34:28.4527 Debug Message Template Auto Format enabled +2024-08-04 03:34:28.5103 Trace FindReachableObject: +2024-08-04 03:34:28.5103 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:34:28.5161 Debug FileTarget FilePathLayout with FilePathKind.Relative using AppDomain.BaseDirectory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI\bin\Debug\net8.0\ +2024-08-04 03:34:28.5161 Trace FindReachableObject: +2024-08-04 03:34:28.5161 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:34:28.5161 Trace FindReachableObject: +2024-08-04 03:34:28.5161 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:34:28.5161 Trace FindReachableObject: +2024-08-04 03:34:28.5161 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:34:28.5161 Debug Adding target NLog.Targets.FileTarget(Name=logfile) +2024-08-04 03:34:28.5161 Info Registered target NLog.Targets.FileTarget(Name=logfile) +2024-08-04 03:34:28.5298 Trace ParseRulesElement +2024-08-04 03:34:28.5298 Info NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c. File version: 5.3.2.2526. Product version: 5.3.2+8d52d4f3fcdbd84beae3442e1fdc8125598ed81f. GlobalAssemblyCache: False +2024-08-04 03:34:28.5298 Debug Start watching file-filter 'nlog.config' in directory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI +2024-08-04 03:34:28.5459 Debug --- NLog configuration dump --- +2024-08-04 03:34:28.5459 Debug Targets: +2024-08-04 03:34:28.5459 Debug FileTarget(Name=logfile) +2024-08-04 03:34:28.5459 Debug Rules: +2024-08-04 03:34:28.5459 Debug logNamePattern: (:All) levels: [ Debug Info Warn Error Fatal ] writeTo: [ logfile ] +2024-08-04 03:34:28.5459 Debug --- End of NLog configuration dump --- +2024-08-04 03:34:28.5459 Trace FindReachableObject: +2024-08-04 03:34:28.5459 Trace Scanning LoggingRule 'logNamePattern: (:All) levels: [ Debug Info Warn Error Fatal ] writeTo: [ logfile ]' +2024-08-04 03:34:28.5459 Trace Scanning Property Targets 'System.Collections.Generic.List`1[NLog.Targets.Target]' System.Collections.Generic.IList`1[NLog.Targets.Target] +2024-08-04 03:34:28.5459 Trace Scanning FileTarget 'FileTarget(Name=logfile)' +2024-08-04 03:34:28.5459 Trace Scanning Property FileName '.\logs\${shortdate}_logfile.txt' NLog.Layouts.Layout +2024-08-04 03:34:28.5459 Trace Scanning SimpleLayout '.\logs\${shortdate}_logfile.txt' +2024-08-04 03:34:28.5609 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:34:28.5609 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5609 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:34:28.5609 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5609 Trace Scanning Property Layout '${longdate} ${level:uppercase=true} ${message}' NLog.Layouts.Layout +2024-08-04 03:34:28.5609 Trace Scanning SimpleLayout '${longdate} ${level:uppercase=true} ${message}' +2024-08-04 03:34:28.5609 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:34:28.5609 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:34:28.5609 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5609 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:34:28.5609 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5609 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:34:28.5609 Trace Scanning Property ChildRules 'System.Collections.Generic.List`1[NLog.Config.LoggingRule]' System.Collections.Generic.IList`1[NLog.Config.LoggingRule] +2024-08-04 03:34:28.5609 Trace Scanning Property Filters 'System.Collections.Generic.List`1[NLog.Filters.Filter]' System.Collections.Generic.IList`1[NLog.Filters.Filter] +2024-08-04 03:34:28.5609 Info Validating config: TargetNames=logfile, ConfigItems=12, FilePath=C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI\nlog.config +2024-08-04 03:34:28.5609 Debug Unused target checking is started... Rule Count: 1, Target Count: 1 +2024-08-04 03:34:28.5814 Debug Unused target checking is completed. Total Rule Count: 1, Total Target Count: 1, Unused Target Count: 0 +2024-08-04 03:34:28.5814 Trace Initializing Layout Renderer: ${message} +2024-08-04 03:34:28.5814 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:34:28.5814 Trace Initializing Layout Renderer: ${level} +2024-08-04 03:34:28.5814 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:34:28.5814 Trace Initializing Layout Renderer: ${longdate} +2024-08-04 03:34:28.5814 Trace Initializing ${longdate} ${level:uppercase=true} ${message} +2024-08-04 03:34:28.5814 Trace FindReachableObject: +2024-08-04 03:34:28.5814 Trace Scanning SimpleLayout '${longdate} ${level:uppercase=true} ${message}' +2024-08-04 03:34:28.5814 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:34:28.5814 Trace Scanning LongDateLayoutRenderer 'Layout Renderer: ${longdate}' +2024-08-04 03:34:28.5814 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5814 Trace Scanning LevelLayoutRenderer 'Layout Renderer: ${level}' +2024-08-04 03:34:28.5924 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5924 Trace Scanning MessageLayoutRenderer 'Layout Renderer: ${message}' +2024-08-04 03:34:28.5924 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:34:28.5924 Trace Initializing Layout Renderer: ${shortdate} +2024-08-04 03:34:28.5924 Trace Initializing Layout Renderer: ${literal} +2024-08-04 03:34:28.5924 Trace Initializing .\logs\${shortdate}_logfile.txt +2024-08-04 03:34:28.5924 Trace FindReachableObject: +2024-08-04 03:34:28.5924 Trace Scanning SimpleLayout '.\logs\${shortdate}_logfile.txt' +2024-08-04 03:34:28.5924 Trace Scanning Property LayoutRenderers 'NLog.LayoutRenderers.LayoutRenderer[]' System.Collections.Generic.IEnumerable`1[NLog.LayoutRenderers.LayoutRenderer] +2024-08-04 03:34:28.5924 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5924 Trace Scanning ShortDateLayoutRenderer 'Layout Renderer: ${shortdate}' +2024-08-04 03:34:28.5924 Trace Scanning LiteralLayoutRenderer 'Layout Renderer: ${literal}' +2024-08-04 03:34:28.5924 Trace Initializing FileTarget(Name=logfile) +2024-08-04 03:34:28.5924 Trace FindReachableObject: +2024-08-04 03:34:28.5924 Trace Scanning FileTarget 'FileTarget(Name=logfile)' +2024-08-04 03:34:28.5924 Trace Scanning Property FileName '.\logs\${shortdate}_logfile.txt' NLog.Layouts.Layout +2024-08-04 03:34:28.5924 Trace Scanning Property Layout '${longdate} ${level:uppercase=true} ${message}' NLog.Layouts.Layout +2024-08-04 03:34:28.6085 Trace FileTarget(Name=logfile) has 2 layouts +2024-08-04 03:34:28.6085 Trace FileTarget(Name=logfile): Using appenderFactory: NLog.Internal.FileAppenders.SingleProcessFileAppender+Factory +2024-08-04 03:34:28.6085 Info Configuration initialized. +2024-08-04 03:34:59.9952 Info AppDomain Shutting down. LogFactory closing... +2024-08-04 03:34:59.9988 Debug Stop watching file-filter 'nlog.config' in directory: C:\Users\serka\OneDrive\Desktop\CompanyEmployees\WebAPI +2024-08-04 03:34:59.9988 Trace Flushing all 1 targets... +2024-08-04 03:34:59.9988 Trace ForEachItemInParallel() 1 items +2024-08-04 03:34:59.9988 Trace FileTarget(Name=logfile): FlushAsync +2024-08-04 03:34:59.9988 Trace Continuation invoked: +2024-08-04 03:34:59.9988 Trace Parallel task completed. 0 items remaining +2024-08-04 03:34:59.9988 Debug Flush completed +2024-08-04 03:35:00.0152 Trace FileTarget(Name=logfile): FlushAsync Done +2024-08-04 03:35:00.0152 Debug Closing logging configuration... +2024-08-04 03:35:00.0152 Trace Closing FileTarget(Name=logfile) +2024-08-04 03:35:00.0152 Debug FileTarget(Name=logfile): Closing... +2024-08-04 03:35:00.0152 Debug FileTarget(Name=logfile): Closed. +2024-08-04 03:35:00.0152 Trace Closing .\logs\${shortdate}_logfile.txt +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${literal} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${shortdate} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${literal} +2024-08-04 03:35:00.0152 Trace Closing ${longdate} ${level:uppercase=true} ${message} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${longdate} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${literal} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${level} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${literal} +2024-08-04 03:35:00.0152 Trace Closing Layout Renderer: ${message} +2024-08-04 03:35:00.0299 Debug Finished closing logging configuration. +2024-08-04 03:35:00.0299 Info LogFactory has been closed.