Я использую 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
.
не настроен регистратор
*
.