NLogs 默认行为是可能的。我们必须快速浏览一下 NLog:
NLog 是如何记录的?
记录器
NLog 通过名称定义Loggers。如果Logger 必须写入日志消息,NLog 会检查应该应用哪些规则。
规则
对于每个log-message,都会检查所有规则。如果Logger-Name 和最小LogLevel 匹配,则log-message 将被写入Target。
目标
Targets 可以是日志文件、数据库或其他保存 log-messages 的东西。
1。您如何使用 NLog?
通常,您通过从LogManager 请求DefaultClassLogger 来创建您的Logger。这将创建一个名为“Namespace.SubnameSpace.ClassName”的Logger。
或者,您可以通过调用 LogManager.GetLogger("YourLoggerName") 请求具有自定义名称的 Logger。
如何使用两个 Target?
如果你想同时登录两个TargetsLogLevel,你必须使用两个不同名称的Loggers。这些仅在您的规则中定义。
- 根据您的类或您的自定义名称使用记录器名称设置两条规则。使用“*”作为通配符:“NameSpace1.*”
- 从
LogManager 请求正确的Loggers
示例
示例配置:
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile1" xsi:type="File" fileName="file1.txt" />
<target name="logfile2" xsi:type="File" fileName="file2.txt" />
<target name="logfileAllLogs" xsi:type="File" fileName="fileAllLogs.txt" />
</targets>
<rules>
<logger name="Logger1" minlevel="Info" writeTo="logfile1" />
<logger name="Logger2" minlevel="Info" writeTo="logfile2" />
<logger name="*" minlevel="Info" writeTo="logfileAllLogs" /> <!-- Will be asked for all names because of the wildcard '*' -->
</rules>
</nlog>
以编程方式
// Create your targets
FileTarget fileTarget1 = new FileTarget() { FileName = "file1.txt", Name = "logfile1" };
FileTarget fileTarget2 = new FileTarget() { FileName = "file2.txt", Name = "logfile2" };
FileTarget fileTargetAll = new FileTarget() { FileName = "fileAll.txt", Name = "logfileAll" };
// Create your rules
LoggingRule rule1 = new LoggingRule("Logger1", LogLevel.Info, fileTarget1); // This will be used only Logged to Loggers with the name "Logger1". Attention: Case-sensitive!
LoggingRule rule2 = new LoggingRule("Logger2", LogLevel.Info, fileTarget2);
LoggingRule ruleAll = new LoggingRule("*", LogLevel.Info, fileTargetAll); // This will be used by all existing loggers, because of the wildcard "*"
// create a configuration to introduce the rules and targets to the LogManager.
LoggingConfiguration config = new LoggingConfiguration();
// Add targets to the config
config.AddTarget(fileTarget1.Name, fileTarget1); // don't know why i have to give the name separately
config.AddTarget(fileTarget2.Name, fileTarget2);
config.AddTarget(fileTargetAll.Name, fileTargetAll);
// Add rules to the config
config.LoggingRules.Add(rule1);
config.LoggingRules.Add(rule2);
config.LoggingRules.Add(ruleAll);
// Set the config as current config
LogManager.Configuration = config;
// Let's log.. Get your loggers..
Logger logger1 = LogManager.GetLogger("Logger1");
Logger logger2 = LogManager.GetLogger("Logger2");
// Log something..
logger1.Error("Test Logger1a");
logger2.Error("Test Logger2a");
logger1.Error("Test Logger1b");
logger2.Error("Test Logger2b");
示例日志:
Logger logger1 = LogManager.GetLogger("Logger1");
Logger logger2 = LogManager.GetLogger("Logger2");
logger1.Error("Test Logger1a");
logger2.Error("Test Logger2a");
logger1.Error("Test Logger1b");
logger2.Error("Test Logger2b");
预期结果:
// ---------- file1.txt ----------
// Test Logger1a
// Test Logger1b
// -------------------------------
//
// ---------- file2.txt ----------
// Test Logger2a
// Test Logger2b
// -------------------------------
//
// ---------- fileAll.txt ----------
// Test Logger1a
// Test Logger2a
// Test Logger1b
// Test Logger2b
// -------------------------------
在您的示例中,您可能得到了两个具有不同命名空间的 DLL。类似于Db1Lib.MyClass 和Db2Lib.MyClass。
如果要设置 Logger 以将每个 DLL 记录到专用数据库中,则应将第一个 Logger 命名为“Db1Lib*”,将第二个 Logger 命名为“Db2Lib*”。
这样LogManager.GetCurrentClassLogger() 将正确命名记录器。但这仅在您的数据库位于不同的命名空间/类中时才有效。