Друзья, я так рада снова видеть вас на моем блоге. Сегодня я покажу вам, как добавить ведение журнала в ваши основные приложения asp net и почему вы должны это делать. Я покажу вам основные аспекты ведения журнала приложений с помощью Serilog, однако я уверен, что эта статья поможет вам, даже если у вас уже есть некоторые знания о работе с Serilog или ведением журнала приложений в целом.

О чем будет этот пост 📝

  • Что такое ведение журнала
  • Почему это так важно
  • Что такое Серилог
  • Установка Серилога
  • Конфигурация Serilog
  • Реализация входа в ваш код

Что такое ведение журнала? 🪵

Проще говоря, ведение журнала — это практика записи событий и действий, происходящих в приложении. Эти события могут включать такие вещи, как ошибки, предупреждения и информационные сообщения, которые можно использовать для диагностики проблем при их возникновении.

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

Почему логирование так важно? ⚠️

Ведение журнала имеет решающее значение по нескольким причинам:

Отладка 🪲

Когда в вашем приложении что-то идет не так, ведение журнала может стать бесценным инструментом для отладки. Просматривая журналы приложений, вы можете лучше понять, что произошло, что привело к проблеме, и точно определить причину.

Устранение неполадок 🛠️

Журналы также можно использовать для устранения неполадок в производственных средах. Когда пользователи сообщают о проблемах, вы можете использовать журналы, чтобы определить источник проблемы и определить наилучший способ ее устранения.

Аналитика 📊

Журналы могут предоставить ценную информацию о том, как пользователи взаимодействуют с вашим приложением. Анализируя свои журналы, вы можете определить модели использования, определить области для улучшения и оптимизировать приложение для повышения производительности.

Что такое Серилог❓

Serilog — это популярная платформа ведения журналов для приложений .NET. Он построен с упором на структурированное ведение журналов, что упрощает поиск, фильтрацию и анализ журналов. Serilog поддерживает различные выходные форматы, такие как текстовые файлы, базы данных и облачные службы, такие как Azure Application Insights.

Клонируйте репозиторий GitHub 🐙

Прежде чем мы начнем кодировать, я рекомендую вам клонировать репозиторий Github из веб-API, с которым мы работали все это время. Убедитесь, что вы клонируете ветку «DatabaseSeeding», которая является последней.

https://github.com/Osempu/BlogAPI

Установка Serilog 👷🏾

Давайте начнем установку Serilog в наш веб-API с помощью dotnet cli.

dotnet add package Serilog.AspNetCore

dotnet add package Serilog.Sinks.Console

dotnet add package Serilog.Sinks.File

dotnet add package Serilog.Enrichers.Thread

Первая команда установит необходимый пакет Serilog для работы с ядром asp net, пакеты sinks.console и sinks.file позволят нам записывать наши журналы на консоль или в файл, чтобы хранить их и обращаться к ним позже, и, наконец, пакет enrichers.thread позволит нам добавить текущий рабочий поток в журналы, чтобы мы могли получить еще больше информации.

Конфигурация Serilog 💻

В наш файл Program.cs добавьте следующий код для настройки serilog

Log.Logger = new LoggerConfiguration()
                    .MinimumLevel.Debug()
                    .Enrich.WithThreadId()
                    .WriteTo.Console()
                    .WriteTo.File("logs/serilogFile.txt",
                                    outputTemplate: "{Timestamp:HH:mm} [{Level}] ({ThreadId}) {Message}{NewLine}{Exception}",
                                    rollingInterval: RollingInterval.Day)
                    .CreateLogger();
...
builder.Host.UseSerilog();

Мы создаем новый экземпляр регистратора с помощью гибкого построителя конфигурации регистратора. Мы указываем фильтр, чтобы видеть только журналы, идущие от отладки и до критических, избегая информационных журналов, затем мы обогащаем наши журналы текущим запущенным потоком и указываем запись журналов в консоль и в файл, затем указываем путь к этот файл и шаблон вывода для наших журналов, и, наконец, мы вызываем UseSerilog.

Вход в действие 🎬

Теперь мы продолжим добавлять некоторые полезные журналы в наши конечные точки API в нашем файле PostsController.cs.

...	
	
	private readonly ILogger<PostsController> logger;
	
	public PostsController(BlogDbContext context, ILogger<PostsController> logger)
	{
	    this.context = context;
	    this.logger = logger;
	}
	
	[HttpGet]
	public IActionResult GetPost()
	{
	    var posts = context.Posts.ToList();
	    logger.LogDebug($"Get method called, got {posts.Count()} results");
	    return Ok(posts);
	}
	
	[HttpGet("{id:int}")]
	public IActionResult GetPost(int id)
	{
	    try
	    {
	        var post = context.Posts.Find(id);
	        return Ok(post);
	    }
	    catch (Exception ex)
	    {
	        logger.LogError(ex, $"Error getting post with id {id}");
	        throw;
	    }
	}
	
	[HttpPost]
	public IActionResult CreatePost(Post post)
	{
	    try
	    {
	        context.Add(post);
	        context.SaveChanges();
	
	        return CreatedAtAction(nameof(GetPost), new { id = post.Id }, null);
	    }
	    catch (Exception ex)
	    {
	        logger.LogError(ex, "Unexpected error on Post method");
	        throw;
	    }
	}
	
	[HttpPut]
	public IActionResult EditPost(int id, [FromBody] Post post)
	{
	    var postToEdit = context.Posts.Find(id);
	
	    if (postToEdit is null)
	    {
	        logger.LogError($"Post with id {id} was not found");
	        throw new NullReferenceException("Post with id {id} was not found");
	    }
	
	    postToEdit.Title = post.Title;
	    postToEdit.Body = post.Body;
	    postToEdit.Author = post.Author;
	
	    context.SaveChanges();
	
	    return NoContent();
	}
	
	[HttpDelete("{id:int}")]
	public IActionResult DeletePost(int id)
	{
	    try
	    {
	        var post = context.Posts.Find(id);
	        context.Posts.Remove(post);
	        context.SaveChanges();
	
	        return NoContent();
	    }
	    catch (Exception ex)
	    {
	        logger.LogError(ex, $"Unexpected error on Delete method trying to delete post with Id {id}");
					throw;
	    }
	}

Первое, в чем мы должны убедиться, — это внедрить наш регистратор serilog через внедрение зависимостей с использованием интерфейса ILogger<T>.

Получить метод

Здесь мы используем ведение журнала, чтобы уведомлять, сколько постов мы извлекаем, это отличный пример того, что ведение журнала используется не только для регистрации ошибок, но и для аналитического использования.

Получить (идентификатор) метод

Теперь в этом методе мы регистрируем ошибку, указывающую, какую публикацию мы пытались получить, поэтому всякий раз, когда мы проверяем журналы приложения, это дает нам подсказку о том, что может быть причиной ошибки.

Почтовый метод

В нашем методе post мы просто уведомляем, что произошла ошибка при попытке вызвать конечную точку публикации.

Поместите метод

Теперь это еще один отличный пример силы ведения журнала. Если пост, который мы пытаемся обновить, имеет значение null, это означает, что он не существует, и мы выходим из него, указав идентификатор поста, который мы пытались вызвать, но он не был найден.

Удалить метод

Наконец, в этом методе, как и в методе публикации, мы регистрируем, что ошибка произошла, когда кто-то пытался вызвать конечную точку удаления, а затем указывает, какую публикацию пытались удалить.

Вывод 📕

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

Вот и все на сегодня! 🌞

Я еще раз благодарю вас за то, что вы прочитали мою статью и нашли время, чтобы проверить ее. Я немного отсутствовал, и это потому, что я все еще пытаюсь быть последовательным в письме, иногда мне кажется, что я не знаю, о чем писать или с чего начать, но я все еще иду вперед, и у меня много планов. чем заняться в моем блоге и что я могу предложить вам, ребята, чтобы вы стали лучше программировать и могли получить работу своей мечты или стать волшебником кода, как я все еще пытаюсь это сделать.

Спасибо и не забывайте поддерживать меня в моем блоге unitcoding.com и на моем канале YouTube Unit Coding. Хорошего дня и продолжайте кодить!