Создайте файлы журнала с определенным именем для другого экземпляра класса

Я использую 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 ответ

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

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

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

Я понятия не имею, что вы ожидаете, когда две операции Debug-logging находятся в одном классе (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

Другие вопросы по тегам