Пишем логи на C# (.NET). Легкий способ.

Пишем логи на C# (.NET). Легкий способ.

При написании небольших служб на C# бывает необходимость писать логи работы программы. В этой статье я опишу быстрый и удобный способ логирования ошибок и исключений в программе не C#. Постановка задачи Нужен класс (Log) с одним статическим методом (Write), в который передается объект класса Exception. Метод Write должен записать в файл с логом строчку со следующей информацией:
  1. Дата/Время
  2. Полное имя метода, в котором возникло исключение
  3. Свойство Message объекта исключения
Первое найти не проблема: DateTime.Now Полное имя метода можно получить из свойства объекта исключения TargetSite: string className = ex.TargetSite.DeclaringType; string methodName = ex.TargetSite.Name; Теперь сводим все вместе с один класс: 

using System;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Reflection;

namespace LogHelper
{
  public class Log
  {
    private static object sync = new object();
    public static void Write(Exception ex)
    {
      try
      {
        // Путь .\\Log
        string pathToLog = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log");
        if (!Directory.Exists(pathToLog))
        Directory.CreateDirectory(pathToLog); // Создаем директорию, если нужно
        string filename = Path.Combine(pathToLog, string.Format("{0}_{1:dd.MM.yyy}.log",
        AppDomain.CurrentDomain.FriendlyName, DateTime.Now));
        string fullText = string.Format("[{0:dd.MM.yyy HH:mm:ss.fff}] [{1}.{2}()] {3}\r\n",
        DateTime.Now, ex.TargetSite.DeclaringType, ex.TargetSite.Name, ex.Message);
        lock (sync)
        {
          File.AppendAllText(filename, fullText, Encoding.GetEncoding("Windows-1251"));
        }
      }
      catch
      {
        // Перехватываем все и ничего не делаем
      }
    }
  }
}
 
Вывод:
 
    private  void FuncName() {
            try
            {
            }
            catch (Exception msg)
            {
               Write(msg);                      //запись в лог
               MessageBox.Show(msg.ToString()); //Вывод сообщения на экран, можно исключить              
               throw;
            }
 
Собственно, при возникновении ошибки создается папка Log. Внутри неё лежит тестовый файл лога 
 -----------------------------------------------------------------------

Второй способ (используем NLog)

Скачиваем NLog.
Добавляем в ссылки NLog.dll.
Прописывем  using NLog;
В папке  где и сборка создаем файл 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">
    <targets>
        <target name="console" xsi:type="Console" layout="${date:format=HH\:mm\:ss}|${level}|${message}" />
        <target name="file"  xsi:type="File" fileName="${basedir}/nlog.txt" layout="${date}|${level}|${message}" />
    </targets>
    <rules>
        <logger name="*" minlevel="Debug" writeTo="console" />
        <logger name="*" minlevel="Trace" writeTo="file" />
    </rules>
</nlog>

В программе вставляем следущее  
private static Logger logger = LogManager.GetCurrentClassLogger();


         public partial class Form1 : Form
        {
          private static Logger logger = LogManager.GetCurrentClassLogger(); 
             public Form1()
                   {
                  InitializeComponent();
                   } 

Использовать можно в любом месте кода:
     logger.Debug("log {0}", this.Text);
Либо:
            try
            {
            }
            catch (Exception msg)
            {
                logger.Debug(msg.ToString()); 
            }  
Файл с логом создается в той же папке где лежит сборка. Имя nlog.txt
 
 

Популярные сообщения из этого блога

Учебник yii2

Авторизация yii 2 из базы