NLog 2 文件记录将在两个文件中记录相同的信息
NLog 2 files logging will log same info in both files
所以我有一个相当简单的问题,但似乎我遗漏了什么。我有一个 WPF 应用程序 (.NET Core 5.0)。
我正在尝试使用 2 个文件进行日志记录,但每当我检索一个记录器并写入一条消息时,我都会在两个文件中得到相同的日志。
这是我的代码。
private void SetupLogger()
{
// Step 1. Create configuration object
var config = new LoggingConfiguration();
// Step 2. Create targets
var firstTarget = new FileTarget()
{
Name = "FirstLogger",
FileName = Path.Combine(basePath, "log1.txt"),
Layout = "${longdate} ${level} ${message} ${exception}"
};
var secondTarget = new FileTarget()
{
Name = "SecondLogger",
FileName = Path.Combine(basePath, "log2.txt"),
Layout = "${longdate} ${level} ${message}"
};
config.AddTarget("FirstLogger", firstTarget );
config.AddTarget("SecondLogger", secondTarget );
var ruleInfo1 = new LoggingRule("*", NLog.LogLevel.Trace, firstTarget );
var ruleInfo2= new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
// Step 3. Define rules
config.LoggingRules.Add(ruleInfo1);
config.LoggingRules.Add(ruleInfo2);
// Step 4. Activate the configuration
LogManager.Configuration = config;
// Example usage
var logger = LogManager.GetLogger("FirstLogger");
logger.Info("App starting...");
}
在另一个文件中我有第二个日志
public void Start()
{
//initialize app
var logger = LogManager.GetLogger("FirstLogger");
logger.Info("App finished initializing...");
}
现在我在两个文件中看到了两个日志。
LE:我试过了,它仍然记录到两个文件。
var ruleInfo1 = new LoggingRule("FirstLogger", LogLevel.Trace, firstTarget )
{
Final = true
};
var ruleInfo2 = new LoggingRule("*", LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleInfo1);
config.LoggingRules.Add(ruleInfo2);
没错。
两个记录器之间的唯一区别是异常。
您没有抛出任何异常,因此 none 将被记录。
带有通配符 *
的记录器名称的记录器规则将匹配所有记录器:
// Step 3. Define rules
var ruleInfo1 = new LoggingRule("*", NLog.LogLevel.Trace, firstTarget );
config.LoggingRules.Add(ruleInfo1);
var ruleInfo2 = new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleInfo2);
也许改成这样:
// Step 3. Define rules
var ruleErrors = new LoggingRule("*", NLog.LogLevel.Warn, firstTarget );
config.LoggingRules.Add(ruleErrors);
var ruleUsers = new LoggingRule("UserLog", NLog.LogLevel.Trace, firstTarget );
config.LoggingRules.Add(ruleUsers);
var ruleAll = new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleAll);
现在 3 条规则将确保:
- ruleErrors - 将重定向 warnings/errors 到 firstTarget(在 LogLevel 上过滤)
- ruleUsers - 将写入
LogManager.GetLogger("UserLog")
的事件重定向到 firstTarget(根据 Logger-name 过滤)
- ruleAll - 将所有事件重定向到 secondTarget(没有任何过滤器)
另请参阅:https://github.com/NLog/NLog/wiki/Configuration-file#rules
所以我有一个相当简单的问题,但似乎我遗漏了什么。我有一个 WPF 应用程序 (.NET Core 5.0)。
我正在尝试使用 2 个文件进行日志记录,但每当我检索一个记录器并写入一条消息时,我都会在两个文件中得到相同的日志。
这是我的代码。
private void SetupLogger()
{
// Step 1. Create configuration object
var config = new LoggingConfiguration();
// Step 2. Create targets
var firstTarget = new FileTarget()
{
Name = "FirstLogger",
FileName = Path.Combine(basePath, "log1.txt"),
Layout = "${longdate} ${level} ${message} ${exception}"
};
var secondTarget = new FileTarget()
{
Name = "SecondLogger",
FileName = Path.Combine(basePath, "log2.txt"),
Layout = "${longdate} ${level} ${message}"
};
config.AddTarget("FirstLogger", firstTarget );
config.AddTarget("SecondLogger", secondTarget );
var ruleInfo1 = new LoggingRule("*", NLog.LogLevel.Trace, firstTarget );
var ruleInfo2= new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
// Step 3. Define rules
config.LoggingRules.Add(ruleInfo1);
config.LoggingRules.Add(ruleInfo2);
// Step 4. Activate the configuration
LogManager.Configuration = config;
// Example usage
var logger = LogManager.GetLogger("FirstLogger");
logger.Info("App starting...");
}
在另一个文件中我有第二个日志
public void Start()
{
//initialize app
var logger = LogManager.GetLogger("FirstLogger");
logger.Info("App finished initializing...");
}
现在我在两个文件中看到了两个日志。
LE:我试过了,它仍然记录到两个文件。
var ruleInfo1 = new LoggingRule("FirstLogger", LogLevel.Trace, firstTarget )
{
Final = true
};
var ruleInfo2 = new LoggingRule("*", LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleInfo1);
config.LoggingRules.Add(ruleInfo2);
没错。
两个记录器之间的唯一区别是异常。
您没有抛出任何异常,因此 none 将被记录。
带有通配符 *
的记录器名称的记录器规则将匹配所有记录器:
// Step 3. Define rules
var ruleInfo1 = new LoggingRule("*", NLog.LogLevel.Trace, firstTarget );
config.LoggingRules.Add(ruleInfo1);
var ruleInfo2 = new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleInfo2);
也许改成这样:
// Step 3. Define rules
var ruleErrors = new LoggingRule("*", NLog.LogLevel.Warn, firstTarget );
config.LoggingRules.Add(ruleErrors);
var ruleUsers = new LoggingRule("UserLog", NLog.LogLevel.Trace, firstTarget );
config.LoggingRules.Add(ruleUsers);
var ruleAll = new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleAll);
现在 3 条规则将确保:
- ruleErrors - 将重定向 warnings/errors 到 firstTarget(在 LogLevel 上过滤)
- ruleUsers - 将写入
LogManager.GetLogger("UserLog")
的事件重定向到 firstTarget(根据 Logger-name 过滤) - ruleAll - 将所有事件重定向到 secondTarget(没有任何过滤器)
另请参阅:https://github.com/NLog/NLog/wiki/Configuration-file#rules