两个处理器不能使用NLog同时记录信息

时间:2019-05-13 09:34:09

标签: c# nlog

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

如果A首先将loginfo写入日志文件,则B永不记录日志。而且,如果B首先将loginfo写到日志文件中,那么A永远不会记录日志。

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

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

//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 个答案:

答案 0 :(得分:2)

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

File target

  

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

答案 1 :(得分:1)

您可以尝试以下方法吗?

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);
}