【问题标题】:Two processors can't log the information at the same time by using NLog两个处理器不能同时使用 NLog 记录信息
【发布时间】:2019-05-13 09:34:09
【问题描述】:

我有两个项目 A 和 B,它们都使用 NLog 库。现在我有一个问题:

如果 A 先将 loginfo 写入日志文件,则 B 永远不会记录。如果 B 先将 loginfo 写入日志文件,则 A 永远不会记录。

由于 A 和 B 使用相同的 NLog 库,因此它们使用相同的 Nlog Config,但它们将构建在两个处理器中,这是配置信息。

有人对这个问题有什么好主意吗?

//Set NLog Config by:
//https://github.com/nlog/NLog/wiki/Configuration-API
private static Logger GenerateLogInstance()
{
    // Step 1. Create configuration object 
    var config = new LoggingConfiguration();
    // Step 2. Create targets
    var fileTarget = new FileTarget()
    {
        FileName = @"C:\Logs\${shortdate}.log",
        Layout = @"${longdate} ${uppercase:${level}} ${message}${onexception:${newline}EXCEPTION\: ${exception:format=ToString}}"

    };
    //var wrapper = new AsyncTargetWrapper(fileTarget, 5000, AsyncTargetWrapperOverflowAction.Discard);

    // Step 3. Define rules
    config.AddTarget("myprojectLog", fileTarget);
    config.LoggingRules.Add(new NLog.Config.LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
    // Step 4. Activate the configuration
    var factory = new LogFactory(config);

    return factory.GetLogger("myprojectLog");
}

【问题讨论】:

  • 您的问题一开始是“处理器”建议线程,但实际上它听起来像是 2 个应用程序。听起来可能有 2 个应用程序没有写入同一个文件,因为它可能会用锁打开文件。

标签: c# nlog


【解决方案1】:

我不使用nlog,但请看以下内容。您可能需要设置concurrentWrites="true"

File target

concurrentWrites - 启用对优化并发写入的支持 来自同一机器主机上多个进程的相同日志文件,当 使用 keepFileOpen = true。通过使用一种特殊的技术,让它 保持文件从多个进程打开。如果只有单个进程 (和单个 AppDomain)应用程序正在记录,那么它会更快 设置为 concurrentWrites = False。布尔默认值:真。注意:在 UWP 中 这个设置应该是假的

【讨论】:

  • 感谢您的建议,我检查了 NLog,concurrentWrites 默认值为 true :(
【解决方案2】:

你可以试试这个吗:

private static LogFactory GenerateLogFactory()
{
    // Step 0. Create isolated LogFactory
    var logFactory = new LogFactory();
    // Step 1. Create configuration object 
    var config = new LoggingConfiguration(logFactory);
    // Step 2. Create targets
    var fileTarget = new FileTarget()
    {
        FileName = @"C:\Logs\${shortdate}.log",
        Layout = @"${longdate} ${uppercase:${level}} ${message}${onexception:${newline}EXCEPTION\: ${exception:format=ToString}}"
    };
    // Step 3. Define rules
    config.AddTarget("myprojectLog", fileTarget);
    config.LoggingRules.Add(new NLog.Config.LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
    // Step 4. Activate the configuration
    logFactory.Configuration = config;
    return logFactory;
}

private static Logger GenerateLogInstance()
{
    return GenerateLogFactory().GetLogger("myprojectLog");
}

顺便说一句。如果同一个解决方案中的两个项目使用相同的方法,那么您可以考虑这样做:

Lazy<LogFactory> LazyLogFactory = new Lazy<LogFactory>(() => GenerateLogFactory());

private static Logger GenerateLogInstance(string loggerName = "myprojectLog")
{
    return LazyLogFactory.Value.GetLogger(loggerName);
}

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多