【问题标题】:How to setup NLOG to use multiple database如何设置 NLOG 以使用多个数据库
【发布时间】:2018-07-16 16:32:43
【问题描述】:

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

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

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

如何做到这一点?

谢谢

【问题讨论】:

标签: c# .net asp.net-mvc logging nlog


【解决方案1】:

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。这些仅在您的规则中定义。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2011-11-06
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多