【发布时间】:2021-11-27 17:37:09
【问题描述】:
所以我有一个相当简单的问题,但似乎我错过了一些东西。我有一个 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);
【问题讨论】:
-
你真正想要实现什么?
-
我有一个记录重要信息的“通用日志文件”。现在我正在尝试为一些更具体的信息添加另一个记录器(我想记录用户操作和时间)。我知道我可以只拥有一个包含所有内容的文件,但对我来说拥有 2 个文件更有意义。简而言之,一个是hole app的通用日志文件,一个是“用户操作记录”的日志文件
-
专业化的
LoggingRule应该在列表中的第一位,并且有一个不同于"*"的过滤器,例如new LoggingRule("FirstLogger",...),并且还将属性Final设置为true。当您设置完所有这些后,将不会调用带有过滤器"*"的其他记录器。 -
检查我的编辑。我找到了解决方案。将让我重要的记录器低级别成为信息。这样我就可以为我的用户交互记录使用跟踪/调试。这可以工作,但我希望我可以在两个文件中记录每个级别,只需从 LogManager 中选择一个不同的记录器。
-
我把我的建议放到了你的方法
SetupLogger上并调用了,“App正在启动”这个文字只出现在log1.txt文件中。我不清楚“我已经尝试过了,它仍然记录到两个文件”是什么意思。