NLog добавление логирования в .NET Core WEB приложение C#

Пример добавления логирования в WEB приложение на .NET Core на основе NLog.

Первоначально добавляем через Nuget пакет:

NLog.Web.AspNetCore



Затем добавляем в корень проекта файл nlog.config следующего содержания:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="info"
      internalLogFile="internal-nlog.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <!-- the targets to write to -->
    <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="logs/nlog-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="logs/nlog-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />

        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxLevel="Info" final="true" />
        <!-- BlackHole without writeTo -->
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>


В данном файле содержатся настройки логирования, куда и как и что сохранять. Обязательно для данного файла необходимо выставить в параметрах свойство Copy to output directory: Copy Always.

Подробнее

Чистка логов базы данных MSSQL

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

Сама проблема:

The transaction log for database 'база_данных' is full due to 'LOG_BACKUP'. 


Проблему разумеется надо решать.

И вот как это делается:

Для обрезки лога используется вот эта команда:

DBCC SHRINKFILE(база_данных_log, 100);


При выполнении этой команды, LOG файл будет обрезан до 100 мегабайт.

Подробнее

Switch Expressions - Выражения переключатели - Новинка в C# 8

Хорошая новость, теперь можно реализовать SWITCH по новому.
В C# 8 версии вводятся выражения-переключатели, которые реализуют более краткий синтаксис возвращения значения.

Вот синтаксис выражения SWITCH на примере:

static string Display(object o) => o switch
{
    Point { X: 0, Y: 0 }         => "origin",
    Point { X: var x, Y: var y } => $"({x}, {y})",
    _                            => "unknown"
};


В этом примере сначала проверяется соответствие шаблону типа Point, а затем шаблону свойств внутри {фигурных скобок}.
Затем символ подчеркивания "_" Описывает шаблон сброса, аналогичный «default:» для операторов switch.

Подробнее

Класс для транслитерации предложений на Русском по ГОСТ и ISO на C# под .NET Core

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

В этой публикации будет приведен пример класса который реализует функционал транслитерации в двух стандартах: ГОСТ и ISO. При желании, разобравшись в коде (он довольно прост и компактен) можно легко добавить и другие стандарты, но приведенные два мне кажутся наиболее используемыми.

Подробнее

Crop Image - Пример вырезания изображения с изменением размера и использованием библиотеки SixLabors.ImageSharp на .NET Core C#

Простой пример класса с методом для получения квадратного превью изображения в .NET Core, при помощи библиотеки SixLabors.ImageSharp.

Пример:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.PixelFormats;
using System;
using SixLabors.ImageSharp.Formats.Jpeg;

namespace TransformImage.Methods
{
    public static class ImgActions
    {
        public static void CropImage(string path, string path_in, int size)
        {
            try
            {
                // Открывает файл, определяет тип файла и декодирует
                using (Image<Rgba32> image = Image.Load(path)) 
                {
                    // Теперь изображение находится в независимой от формата файла структуре в памяти как серия Rgba32 пикселей
                    
                    int line = image.Height < image.Width ? image.Height : image.Width;
                    
                    // Вырезаем часть изображения (квадрат по минимальной стороне)
                    
                    image.Mutate(tx => tx.Crop(line, line));
                    
                    // Изменяем размер изображения
                    
                    image.Mutate(ctx => ctx.Resize(size, size)); 

                    // Записываем в заданном формате с указанным качеством, без метаданных для экономии места
                    
                    image.Save(path_in,new JpegEncoder{Quality = 100, IgnoreMetadata = true}); 
                }
            }
            catch (Exception ex)
            {
                Program.logger.Error(ex, ex.Message);
            }
        }

    }
}



Сама библиотека находится здесь.

Вот и всё.

Подробнее

Пример настройки Web приложения .NET Core в Ubuntu под Apache C#

Сейчас компания Microsoft всё больше сил уделяет .NET Core, который является по настоящему кроссплатформенным и универсальным. Поэтому не лишним будет зафиксировать процесс настройки доступа к сайту написанному на .NET Core в Ubuntu Linux с использованием Apache.

Итак приступим.

Если у вас не установлен dot-net на Ubuntu, то предварительно устанавливаем его:
Подключаем репозиторий (В нашем случае для версии Ubuntu 16.04, для разных версий можно посмотреть здесь)

wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb


Устанавливаем компоненты

sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-2.2
Подробнее

Устранение ошибки Not Found [IP: 213.180.204.183 80]

Чтобы устранить ошибку Not Found [IP: 213.180.204.183 80], при выполнении установки любого приложения, надо первым делом выполнить команду:

apt-get update


или

sudo apt-get update



Вероятнее всего после выполнения данной команды ошибка пройдет сама собой.

Подробнее

Пример синхронного AJAX запроса на JQuery и .NET Core C#

В данной публикации приведен пример того как выполнить асинхронный запрос к серверу без перезагрузки текущей страницы, с помощью JQuery на .NET Core.

Итак приступим.

Для начала нам потребуется создать проект Web сайта на .NET Core, например как здесь: https://babakov.net/programming/cs/138-cscorevs.html

Теперь модифицировать или создать новый контроллер Home с двумя методами:
Index — отображает страницу
GetInfo — обрабатывает запрос и возвращает ответ в формате JSON

Подробнее

Пример MERGE в MSSQL T-SQL

Простой пример MERGE для TSQL.

В примере подразумевается, что мы оперируем двумя одинаковыми по структуре таблицами (в реальной жизни это условие вовсе не обязательно).
Таблицы TargetTableи SourceTable — состоят всего из двух полей:
Id — некий идентификатор.
Name — Название объекта.

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


MERGE TargetTable AS target  -- таблица которую будем менять, таблица приемник

USING (SELECT Id, Name FROM SourceTable) AS source 

ON (target.Id = source.Id)  -- условие по которому сопоставляем источник и приемник

WHEN MATCHED AND target.Name!=source.Name -- Если такой уже есть, то проверяем не совпадает ли Name и если не совпадает то меняем

    THEN UPDATE SET target.Name = source.Name -- обновляем

WHEN NOT MATCHED  -- если такого Id нет в таблице target то добавляем

    THEN INSERT VALUES(source.Id, source.Name) -- добавление записи



Вот и всё.

Подробнее

Авторизация в приложении через Вконтакте VK на C#

Данная публикация написана как простая инструкция для себя, на память, чтобы не забыть.

Предложенный вариант использовался для авторизации через токен VK в серверном приложении.

Для начала создадим метод отправки HTTP запроса и получения ответа от сервера:

/// <summary>
        /// Отправляем запрос на получение 
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        private static string GetRequest(string host, string req)
        {
            string str = "";

            var Vk = new HttpClient();
            Vk.DefaultRequestHeaders.Add("Connection", "close");

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(req);
            request.UseDefaultCredentials = true;
            request.PreAuthenticate = true;
            request.Credentials = CredentialCache.DefaultCredentials;
            request.Method = "GET";
            request.Host = host;
            request.UserAgent = "RM";
            request.ContentType = "application/x-www-form-urlencoded";
            request.KeepAlive = false;

            using (HttpWebResponse responsevk = (HttpWebResponse)request.GetResponse())
            using (var stream = responsevk.GetResponseStream())
            using (var streamReader = new StreamReader(stream, Encoding.UTF8))
            {
                str = streamReader.ReadToEnd();
            }
            return str;
        }


Подробнее