c# - 同一进程中的多个应用程序使用具有不同目标的 NLog

标签 c# sharepoint logging nlog

我有两个 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");

其他作业的配置:

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("Wiki");
logger.Info("bla bla bla");

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

最佳答案

所以我终于找到了解决方案。首先,将 NLog 配置为直接在 LogManager.Configuration 上工作是不可能的,我必须获得一个引用,在该引用上完成我的工作,最后设置 LogManager.Configuration。其次,我必须重命名目标,它们都被命名为"file",并且它们必须具有不同的名称。

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

var config = LogManager.Configuration;

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

LogManager.Configuration = config;

关于c# - 同一进程中的多个应用程序使用具有不同目标的 NLog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20245402/

相关文章:

c# - Application_Start 是否在 Web.config 文件转换之前执行?

sharepoint - 一次可以将多少个文件上传到 SharePoint 文档库?

c# - SPList.GetItems(view) 在尝试获取项目标题时返回异常

logging - 如何处理 RabbitMQ 日志?

python - Django 记录器 - 正确输出到 stdout 和 stderr

c# - 在 EF6 上模拟 DbSet 和 ApplicationDbContext 时,第二个 Service.AllAsync() 返回空的 ICollection

c# - 为什么画在面板上的文字会消失?

javascript - SharePoint 加载项 JSOM 创建列表项错误。 "this"未定义

ruby-on-rails - 如何将 Rails 中的 sql 语句重定向到 log/development.log 以外的地方?

c# - 如何检查 Unicode 字符是否在 .Net 中有变音符号?