Создайте файлы журнала с определенным именем для другого экземпляра класса - PullRequest
0 голосов
/ 05 ноября 2018

Я использую NLog с nlog.config без программирования, все хорошо, и один из классов будет создан с несколькими экземплярами, прежде чем они поделятся статическим logger:

public class MyClass
{
    static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("nameDefinedInConfigFile");
    ...
    ...
}

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

public class MyClass
{
    private ILog logger = null;
    public MyClass(string color)
    {
        this.logger = createSpecializedLogFileWithNamePrefix(color);
        this.logger.Debug("I can see this line of logging");
    }

    public void DoingRealWork()
    {
        this.logger.Debug("Never can see this line of logging");
    }
}

после некоторого исследования я все еще не мог выполнить это простое требование, поскольку журнал просто остановился в DoingReadWork(), это мой код тестирования:

        private Logger createSpecializedLogFileWithNamePrefix(string privateLogFileName)
        {
            // Step 1. Get configuration object 
            var config = NLog.LogManager.LoadConfiguration("nlog.config").Configuration;

            // Step 2. Create targets                
            var fileTarget = new FileTarget("target2" + privateLogFileName)
            {
                FileName = "log\\" + privateLogFileName + "_${date:format = yyyyMMdd}.log",
                Layout = "${date:format=HH\\:mm\\:ss.fff} [${threadid}:${level:uppercase=true}]${logger} - ${message} ${exception}"
            };
            config.AddTarget(fileTarget);

            // Step 3. Define rules
            config.AddRuleForOneLevel(LogLevel.Trace, "target2" + privateLogFileName, "private" + privateLogFileName); // only errors to file
            config.AddRuleForOneLevel(LogLevel.Debug, "target2" + privateLogFileName, "private" + privateLogFileName);
            config.AddRuleForOneLevel(LogLevel.Info, "target2" + privateLogFileName, "private" + privateLogFileName);
            //config.AddRuleForAllLevels(consoleTarget); // all to console

            // Step 4. Activate the configuration
            LogManager.Configuration = config;

            // Example usage
            Logger logger = LogManager.GetLogger("private" + privateLogFileName);
            return logger;
        }

кроме того, просто интересно, что на самом деле вернул LogManager.GetLogger(string loggerName), даже если я передаю несуществующее имя, почему оно все еще возвращает Logger? ПРИМЕЧАНИЕ. В моем nlog.config.

не настроен регистратор *.

1 Ответ

0 голосов
/ 05 ноября 2018

В NLog нет ничего, что называется ILog, поэтому не уверен, что это такое.

При загрузке конфигурации NLog возникают огромные издержки. Это следует делать только при первоначальном запуске приложения, а НЕ при создании объекта Logger.

При назначении LogManager.Configuration все предыдущие изменения в конфигурациях NLog будут потеряны (все предыдущие частные объекты FileTarget станут неактивными).

Я понятия не имею, что вы ожидаете, когда у вас есть две операции отладки-регистрации в одном классе (MyClass). И ожидать, что один будет зарегистрирован, а другой нет. Как NLog должен знать разницу? Если вы пытаетесь сказать, что первоначальный оператор Debug работает, но следующий игнорируется, то это, вероятно, потому что присваивание LogManager.Configuration.

Вместо добавления FileTarget во время выполнения, вы можете сделать это:

<targets>
    <target name="privateFile" xsi:type="File" fileName="log\\${replace:searchFor=Private_:replaceWith=:inner=${logger}}_${date:format=yyyyMMdd}.log" />
    <target name="logconsole" xsi:type="Console" />
</targets>

<rules>
    <logger name="Private_*" minlevel="Trace" writeTo="privateFile" final="true" />
    <logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>

Тогда вам просто нужно создать Logger следующим образом:

var logger = LogManager.GetLogger("Private_" + privateLogFileName);

Если вы хотите, чтобы несколько конфигураций NLog работали одновременно, то вам необходимо иметь изолированную LogFactory для каждой конфигурации:

https://github.com/NLog/NLog/wiki/Configure-component-logging

...