NLog: запись номера строки и вызова метода при использовании класса-оболочки для NLog - PullRequest
0 голосов
/ 24 мая 2018

Я использую NLog для регистрации и благодаря этим ответам:

Получение имени регистратора в файл Excel с помощью NLog

NLog: Ограничение имен регистраторав Enum или другую структуру

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

  1. Номер белья и вызывающий метод, выводимые с помощью CallSite и CallSite-Linumber, являются вызывающей функцией и номером строки из класса оболочки, а не методом.и номер строки, вызвавшей класс-оболочку.Это не удивительно, и я предполагаю, что это общая проблема.Есть ли простое исправление ИЛИ я могу как-то создать свой собственный вариант макета, который использует номер строки, переданный в метод?Или какие-то другие предложения?

    using System;
    namespace Common.NLogEx
    {
        public enum LoggerNames
        {
        Database,
        Thermal,
        StateMachine,
        App,
        Poll
       }
    
        public enum LogLevel
       {
        Trace,
        Debug,
        Info,
        Warn,
        Error,
        Fatal,
        Off,
        Warning
        }
    
    public static class Logger
    {
    
        public static void Log(LoggerNames name, LogLevel level , string message)
        {
            if (level == LogLevel.Warning)
                level = LogLevel.Warn;
            NLog.LogLevel nLevel = NLog.LogLevel.FromString(level.ToString());
            NLog.LogManager.GetLogger(name.ToString()).Log(nLevel,message);
        }
    
        public static void Log(LoggerNames name, LogLevel level, Exception ex, string message)
        {
            if (level == LogLevel.Warning)
                level = LogLevel.Warn;
            NLog.LogLevel nLevel = NLog.LogLevel.FromString(level.ToString());
            NLog.LogManager.GetLogger(name.ToString()).Log(nLevel, ex, message, null);
        }
    }
    

    }

и файл конфигурации NLog:

<?xml version="1.0" encoding="utf-8" ?>

<target name="logfile" xsi:type="File" fileName="${basedir}/Logs/file.txt" />
<target name="logconsole" xsi:type="Console" />
<target name="excelfile" xsi:type="File" fileName="${cached:cached=true:Inner=${basedir}/Logs/${date:format=yyyy-MM-dd hh.mm.ss}:CacheKey=${shortdate}}.csv" archiveAboveSize="32000000" archiveFileName="${basedir}/Logs/Archives/${date:format=yyyy-MM-dd hh.mm.ss}.{#####}.csv" archiveEvery="Day" archiveNumbering="Sequence" maxArchiveFiles="0">

  <layout xsi:type="CsvLayout">
    <!-- Layout Options -->

    <column name="time" layout="${longdate}" />
    <column name="level" layout="${level}"/>
    <column name="logger" layout="${logger}"/>
    <column name="message" layout="${message}" />
    <column name="callsite" layout="${callsite}" />
    <column name="callsite-linenumber" layout="${callsite-linenumber}" />
    <column name="exception" layout="${exception:format=toString,StackTrace}${newline}" />

  </layout>
</target>
</targets>

<rules>

<logger name="*" minlevel="Debug" writeTo="logconsole" />    
<logger name="*" minlevel="Debug" writeTo="excelfile" />    
</rules>
</nlog>

1 Ответ

0 голосов
/ 24 мая 2018

Понял!Сделал лучший поиск и нашел этот фантастический вопрос и ответ:

Как сохранить информацию о месте вызова при переносе NLog Вам просто нужно передать тип вашего класса-оболочки в метод "Log".

Для всех, кто хочет, вот мой новый класс-обёртка.Последний метод использует идею «typeof».

public static class Logger
{
    private static string _unclassified = "Unclassified";
    [Obsolete("Please supply a LoggerName and LoggerLevel")]
    public static void Log(string message)
    {          
        Log(_unclassified,LogLevel.Info, message,null);
    }
    [Obsolete("Please supply a LoggerName")]
    public static void Log(LogLevel level, string message)
    {
        Log(_unclassified,level,message,null);
    }

    [Obsolete("Please supply a LoggerName and LoggerLevel")]
    public static void Log(Exception ex)
    {          
        Log(_unclassified,LogLevel.Info, "",ex);
    }

    public static void Log(LoggerNames name, LogLevel level , string message)
    {

        NLog.LogLevel nLevel = NLog.LogLevel.FromString(level.ToString());
        Log(name.ToString(), level, message);
    }

    public static void Log(LoggerNames name, LogLevel level, Exception ex, string message)
    {

        NLog.LogLevel nLevel = NLog.LogLevel.FromString(level.ToString());
        Log(name.ToString(),level,message,ex);
    }

    private static void Log(string loggerName, LogLevel level, string message, Exception ex = null)
    {
        if (level == LogLevel.Warning)
            level = LogLevel.Warn;
        NLog.LogLevel nLevel = NLog.LogLevel.FromString(level.ToString());

        LogEventInfo logEvent = new LogEventInfo(nLevel,loggerName,null,message,null,ex);
        NLog.LogManager.GetLogger(loggerName).Log(typeof(Logger), logEvent);
    }
}
...