NLog: запись в две разные цели на основе имени регистратора и группировки журналов Quartz - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть веб-проект ASP. NET 4.7, в котором реализован планировщик Quartz. NET. Я читал, что Quartz. NET использует абстракцию Common.Logging, но я не знаю, что это на самом деле означает ...

Во избежание спама в журнале приложений по умолчанию из сообщений Quartz Я программно настроил параметры NLog следующим образом:

        var config = new NLog.Config.LoggingConfiguration();
        var logfile = new NLog.Targets.FileTarget("logfile")
        {
            FileName = "${basedir}/Logs/${logger}_${shortdate}.log",
            Layout = "${longdate}|${level:uppercase=true}|${aspnet-request-ip}|${aspnet-request-url}|${callsite}|${message}|${exception:format=tostring}"
        };
        var logfileQ = new NLog.Targets.FileTarget("logfile")
        {
            FileName = "${basedir}/Logs/Quartz_${shortdate}.log",
            Layout = "${longdate}|${level:uppercase=true}||${message}"
        };

        config.AddTarget(logfile);
        config.AddTarget(logfileQ);

        config.AddRule(LogLevel.Error, LogLevel.Fatal, logfileQ, "Quartz*", true);
        config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");

        // Apply config           
        NLog.LogManager.Configuration = config;
        NLog.LogManager.ReconfigExistingLoggers();

Затем я добавляю журналы приложений со следующим кодом:

public class MyApiController : ApiController
{
    private static NLog.Logger logger = NLog.LogManager.GetLogger("Application");

    [HttpPost]
    [Authorize]
    public IHttpActionResult Post(DataModel.MyModel m)
    {
        logger.Warn("Unable to add point {0}: localization missing", m.Name);
    }
}

Поэтому NLog создает "application_yyyy- Файл MM-dd.log ", а также файл" Quartz_yyyy-MM-dd.log ", содержащий только уровни ошибок и фатальных сообщений.

Проблема заключается в том, что он также создает следующие три файла для Quartz, содержащие все уровни:

  1. Quartz.Core.JobRunShell_2020-04-28.log
  2. Quartz.Core.QuartzSchedulerThread_2020-04-28.log
  3. Quartz.Simpl. SimpleJobFactory_2020-04-28.log

Похоже, что final = true первого правила игнорируется.

Как правильно его настроить? Должен ли я что-то отключить в Кварце?

1 Ответ

1 голос
/ 28 апреля 2020

Я наконец понял это.

Добавленные правила должны рассматриваться как фильтры, что не соответствует фильтру go следующему правилу.

Последнее похоже на «Возьми все, что раньше не соответствовало ...»

Основная проблема в моих правилах - это первая, которая соответствует только уровням Error и Fatal, но все остальные уровни сообщения Quartz переходят в следующий. Правило, которое записывает файл журнала.

Поэтому правила должны быть такими:

config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");

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

Чтобы не записывать след или информационный уровень Кварца, я должен добавить третье правило, чтобы захватить их и поместить перед правилом "захватить все":

config.AddRule(LogLevel.Warn, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Info, noLogging, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");

Где noLogging - цель, которая никуда не пишет или только в консоль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...