NLOG: создание нескольких экземпляров одного и того же класса записи журнала в один и тот же файл - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь привыкнуть к NLOG и затрудняюсь в настройке файлов журналов для нескольких экземпляров одного и того же класса. Каждый класс создается в отдельном потоке. Ниже приведен пример кода:

    {
        ILogger mLogger;
        public string Name { get; set; }
        public string SecondName { get; set; }
        private string mFilePath = @"C:\Logs\";
        public test(string name, string secondname)
        {
            var target = new FileTarget(name) { FileName = mFilePath + name + ".txt" };
            var config = new LoggingConfiguration();
            config.AddRule(LogLevel.Info, LogLevel.Info, target);
            LogManager.Configuration = config;
            mLogger = LogManager.GetLogger(name);
            LogManager.ReconfigExistingLoggers();
            mLogger.Info("Hi from :" + name);
        }
    }
    static void Main(string[] args)
        {
            new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
            new Thread(new ThreadStart(() =>
            {
                new test("John", "Smith");
            })).Start();
            new Thread(new ThreadStart(() =>
            {
                new test("Virat", "Kohli");
            })).Start();
            new Thread(new ThreadStart(() =>
            {
                new test("Christiano", "Ronaldo");
            })).Start();

            new Thread(new ThreadStart(() =>
                {
                    new test("Pat", "cummins");
                })).Start();
            Console.Read();
        }

и вывод: 2020-03-03 11: 36: 56.9404 | INFO | Christiano | Привет из: Christiano 2020-03-03 11:36 : 56.9404 | INFO | Stuart | Привет от: Stuart 2020-03-03 11: 36: 56.9404 | INFO | John | Привет от: John 2020-03-03 11: 36: 56.9404 | INFO | Virat | Привет от: Virat 2020 -03-03 11: 36: 56.9404 | INFO | Pat | Привет от: Pat

из одного файла Christiano.txt

Может кто-нибудь помочь мне в настройке этого?

Спасибо.

1 Ответ

2 голосов
/ 03 марта 2020

LogManager.Configuration - это переменная состояния c. Когда вы назначаете его, вы влияете на всех остальных.

Вместо этого дайте уникальный Logger для каждого потока. Одна и та же FileTarget может обрабатывать несколько регистраторов.

{
    ILogger mLogger;
    public string Name { get; set; }
    public string SecondName { get; set; }
    public test(string name, string secondname)
    {
        mLogger = LogManager.GetLogger(name);
        mLogger.Info("Hi from :" + name);
    }
}
static void Main(string[] args)
    {
        string mFilePath = @"C:\Logs\";
        var target = new FileTarget(name) { FileName = Path.Combine(mFilePath, "${logger}.txt") };
        var config = new LoggingConfiguration();
        config.AddRule(LogLevel.Info, LogLevel.Info, target);
        LogManager.Configuration = config;

        new Thread(new ThreadStart(() => { new test("Stuart", "Broad"); })).Start();
        new Thread(new ThreadStart(() =>
        {
            new test("John", "Smith");
        })).Start();
        new Thread(new ThreadStart(() =>
        {
            new test("Virat", "Kohli");
        })).Start();
        new Thread(new ThreadStart(() =>
        {
            new test("Christiano", "Ronaldo");
        })).Start();

        new Thread(new ThreadStart(() =>
            {
                new test("Pat", "cummins");
            })).Start();
        Console.Read();
    }

Альтернативно, тогда вы можете назначать имена потокам и использовать NLog ${threadname} вместо ${logger} в FileName- Layout.

Еще одна альтернатива - создать область с помощью NLog MappedDiagnosticsLogicalContext.SetScoped ("TestName", name) и использовать ${mdlc:TestName} в FileName-Layout. Это также позволит вам передавать исходный контекст в asyn c Tasks.

...