Два процессора не могут регистрировать информацию одновременно с помощью NLog - PullRequest
1 голос
/ 13 мая 2019

У меня есть два проекта 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 голосов
/ 13 мая 2019

Я не использую nlog , но взгляните на следующее. Вам может потребоваться установить concurrentWrites="true"

Файл назначения

concurrentWrites - включает поддержку оптимизированных одновременных записей в один и тот же файл журнала из нескольких процессов на одном компьютере-хосте, когда используя keepFileOpen = true. Используя специальную технику, которая позволяет держать файлы открытыми от нескольких процессов. Если только один процесс (и один AppDomain) приложение регистрируется, тогда оно быстрее установить в значение concurrentWrites = False. Логическое значение по умолчанию: True. Примечание: в UWP этот параметр должен быть ложным

1 голос
/ 13 мая 2019

Не могли бы вы попробовать это вместо:

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

Btw. если два проекта в одном решении используют один и тот же метод, то вы можете рассмотреть возможность сделать это:

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

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