C# 使用不同目标的NLog在同一过程中实现多个应用

C# 使用不同目标的NLog在同一过程中实现多个应用,c#,sharepoint,logging,nlog,C#,Sharepoint,Logging,Nlog,我有两个SharePoint计时器作业同时存在于同一进程中。这些作业彼此无关,不应共享NLog配置。但是,它们往往会相互重叠配置,并记录在彼此的文件中 所有配置都是通过代码完成的。目标已命名,记录器已命名。我确保获得当前LogManager.Configuration的引用并重新加载它 第一个计时器作业中的配置: if (LogManager.Configuration == null) { LogManager.Configuration = new LoggingConfigurat

我有两个SharePoint计时器作业同时存在于同一进程中。这些作业彼此无关,不应共享NLog配置。但是,它们往往会相互重叠配置,并记录在彼此的文件中

所有配置都是通过代码完成的。目标已命名,记录器已命名。我确保获得当前LogManager.Configuration的引用并重新加载它

第一个计时器作业中的配置:

if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

var fileTarget = new FileTarget();
LogManager.Configuration.AddTarget("file", fileTarget);

fileTarget.Encoding = Encoding.UTF8;
fileTarget.FileName = "C:/OTDPLog/Log-{0}.txt"._Format(DateTime.Now.ToString("dd-MM-yyyy_hhmmss"));
fileTarget.Layout = "${date:format=HH\\:mm\\:ss} ${logger} ${event-context:item=Dev} [${level:uppercase=true}]\t${message}.  ${exception:format=ToString,StackTrace}";

var async = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Block);
var rule = new LoggingRule("OTDP", LogLevel.Debug, async);
LogManager.Configuration.LoggingRules.Add(rule);

LogManager.Configuration.Reload();
用法:

var logger = LogManager.GetLogger("OTDP");

logger.Info("bla bla bla");
var logger = LogManager.GetLogger("Wiki");
logger.Info("bla bla bla");
其他作业的配置:

if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

var fileTarget = new FileTarget();
LogManager.Configuration.AddTarget("file", fileTarget);

fileTarget.Encoding = Encoding.UTF8;
fileTarget.FileName = "C:/WikiLog/Log-{0}.txt"._Format(DateTime.Now.ToString("dd-MM-yyyy_hhmmss"));
fileTarget.Layout = "${date:format=HH\\:mm\\:ss} ${logger} ${event-context:item=Dev} [${level:uppercase=true}]\t${message}.  ${exception:format=ToString,StackTrace}";

var async = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Block);
var rule = new LoggingRule("Wiki", LogLevel.Debug, async);
LogManager.Configuration.LoggingRules.Add(rule);

LogManager.Configuration.Reload();
用法:

var logger = LogManager.GetLogger("OTDP");

logger.Info("bla bla bla");
var logger = LogManager.GetLogger("Wiki");
logger.Info("bla bla bla");

如何在同一过程中为不同的应用程序设置记录器?

因此我最终找到了解决方案。首先,在配置NLog以直接在LogManager.Configuration上工作时是不可能的,我必须获得一个引用,在该引用上执行我的工作,最后设置LogManager.Configuration。其次,我必须重命名目标,它们都被命名为“文件”,并且它们必须有不同的名称

if (LogManager.Configuration == null)
{
    LogManager.Configuration = new LoggingConfiguration();
}

var config = LogManager.Configuration;

// Do my stuff, add targets and rules...

LogManager.Configuration = config;
“倾向于重叠”是什么意思?有时会发生,有时不会?可能是代码中的某个错误导致记录器不正确?