gpt4 book ai didi

c# - 如何设置 NLOG 以使用多个数据库

转载 作者:行者123 更新时间:2023-11-30 23:05:41 26 4
gpt4 key购买 nike

在 MVC 项目中,有 5 个独立的区域。以及同一解决方案中的其他两个独立项目。

需要有三个 MVC 区域将 NLOG 与一个数据库一起使用,另外两个区域将 NLOG 与其他数据库一起使用。此外,同一解决方案中的其他两个项目也需要使用具有不同数据库的 NLOG。

因此,作为解决方案,我将在 SLN 中创建单独的 NLOG 项目,并且需要设置单独的 NLOG 项目以允许不同的数据库根据来自相关 MVC 区域或项目的请求进行日志记录。

如何实现?

谢谢

最佳答案

NLogs 默认行为是可能的。我们必须快速看一下 NLog:

NLog是如何记录日志的?

记录器

NLog 通过名称定义 Loggers。如果 Logger 必须写入日志消息,NLog 会检查应应用哪些规则。

规则

对于每一个log-message,所有的规则都会被检查。如果 Logger-Name 和最小 LogLevel 匹配,log-message 将被写入 Target .

目标

目标 可以是日志文件、数据库或保存日志消息 的其他内容。

1。你如何使用 NLog?

通常,您通过从 LogManager 请求 DefaultClassLogger 来创建您的 Logger。这将创建一个名为“Namespace.SubnameSpace.ClassName”的 Logger。或者,您可以通过调用 LogManager.GetLogger("YourLoggerName") 请求具有自定义名称的 Logger

如何使用两个Target?

如果您想以相同的 LogLevel 记录到两个 Targets,您必须使用两个具有不同名称的 Loggers。这些仅在您的规则中定义。

  1. 根据您的类(class)或您的自定义名称设置两个带有记录器名称的规则。使用“*”作为通配符:“NameSpace1.*”
  2. 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.MyClassDb2Lib.MyClass。如果您想设置记录器以将每个 DLL 记录到专用数据库中,您应该将第一个记录器命名为“Db1Lib*”,将第二个命名为“Db2Lib*”。这样 LogManager.GetCurrentClassLogger() 将正确命名记录器。但这仅在您的数据库位于不同的命名空间/类中时才有效。

关于c# - 如何设置 NLOG 以使用多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com