Какие параметры логиорвания можно извлечь?

Какие параметры логиорвания можно извлечь?

Пример: Имеется решение из несокльких DLL+AppUI.
В некоторых классах по некоторым методам установлны выражения для логиорвания.

Можно извлечь все или некторые перечисленые ниже праметры логирования, используя средства библиотеки для логирования?
Какую библиотеку использовать, которая сможет это выполнить?
Или надо использовать библиотеку для логирования + самому кодить(фрагмнты кода см. ниже)?

Ожидаемые параметры:
- ДатаВремя;
- ИмяПроект где срабатывает логирование;
- ИмяКласс где срабатывает логирование;
- ИмяМетод где срабатывает логирование;
- Номер строки где срабатывает логирование;
- Длительность выполнения между шагами.

Под "Длительность выполнения между шагами" понимаю:

logger.Info("Пройден Шаг-1 - {Длительность Шаг-1}");

// код.....
logger.Info("Пройден Шаг-2 - {Длительность Шаг-2}");

Или

logger.Info("Пройден Шаг-1 - {Длительность Шаг-0}");

// код.....
logger.Info("Пройден Шаг-2 - {Длительность Шаг-1}");

Условно код. (условно с использованием NLog)

public class ProductService
{
    
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    public ProductService()
    {
       logger.Info("Start ProductService");
    } 
    
    public void CreateProduct()
    {        
        try
        {
            // код.....
            logger.Info("Пройден Шаг-1");

            // код.....
            logger.Info("Пройден Шаг-2");

            // код.....
            int i = 5;
            logger.Info($"int i = {i}");
        }
        catch (Exception ex)
        {
            logger.Info($"ex.Message -- {ex.Message}");
        }
    } 
}

Фрагменты

using System.Diagnostics;
...

var st = new StackTrace();
var sf = st.GetFrame(0);

var currentMethodName = sf.GetMethod();

Or, if you'd like to have a helper method:

[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetCurrentMethod()
{
    var st = new StackTrace();
    var sf = st.GetFrame(1);

    return sf.GetMethod().Name;
}
 this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;
string method = string.Format("{0}.{1}", 
                            MethodBase.GetCurrentMethod().DeclaringType.FullName,
//using System.Runtime.CompilerServices;
public void SendError(string Message, [CallerMemberName] string callerName = "") 
{ 
    Console.WriteLine(callerName + "called me."); 
} 

Определение вызывающего абонента во время компиляции

static void Log(object message, 
[CallerMemberName] string memberName = "",
[CallerFilePath] string fileName = "",
[CallerLineNumber] int lineNumber = 0)
{
    // we'll just use a simple Console write for now    
    Console.WriteLine("{0}({1}):{2} - {3}", fileName, lineNumber, memberName, message);
}

Определение вызывающего абонента с помощью стека

static void Log(object message)
{
    // frame 1, true for source info
    StackFrame frame = new StackFrame(1, true);
    var method = frame.GetMethod();
    var fileName = frame.GetFileName();
    var lineNumber = frame.GetFileLineNumber();

    // we'll just use a simple Console write for now    
    Console.WriteLine("{0}({1}):{2} - {3}", fileName, lineNumber, method.Name, message);
}

Сравнение двух подходов

Time for 1,000,000 iterations with Attributes: 196 ms
Time for 1,000,000 iterations with StackTrace: 5096 ms

Как видите, использование атрибутов происходит намного быстрее! Фактически почти в 25 раз быстрее.


internal static void WriteInformation<T>(string text, [CallerMemberName]string method = "")
{
    Console.WriteLine(DateTime.Now.ToString() + " => " + typeof(T).FullName + "." + method + ": " + text);
}

При этом будут напечатаны текущие дата и время, за которыми следуют «Пространство имен.Имякласса.Имя метода» и заканчивается «: текст».
Пример вывода:

6/17/2016 12:41:49 PM => WpfApplication.MainWindow..ctor: MainWindow initialized

Пример использования:

Logger.WriteInformation<MainWindow>("MainWindow initialized");

Ответы (0 шт):