2015-08-24 2 views
0

есть способ (NDC, Properties, ...?), Чтобы иметь имя/идентификатор для каждой формы, которая включена во все сообщения log4net, поэтому я могу различать формы во всех сообщениях журнала?log4net: Как отличить разные формы от одного и того же потока пользовательского интерфейса?

У меня есть много методов обслуживания и т. Д., Которые используются во всех моих формах, и я хотел бы видеть, например. что услуга была вызвана в результате ввода пользователем в какой форме (подумайте о нескольких немодальных похожих формах (один и тот же класс), работающих в одном и том же потоке пользовательского интерфейса, содержащем кнопку, а в клик-событии кнопки вызывается метод службы. Внутри метода службы есть протокольные вызовы. В сообщениях журнала я хотел бы иметь свойство, содержащее информацию о том, в каком именно экземпляре формы нажата кнопка).

Я не хочу изменять ВСЕ вызовы регистрации. В примерах в Интернете для контекстов журналов/NDC все говорят только о нескольких клиентах/asp.net-запросах и т. Д., А не о нескольких формах в 1 потоке.

Спасибо, Tim

+0

Side мысль: Одно из возможных обходного пути будет поместить каждую форму в своей Apartement-нити, и различать событие журнала через нарезание имя. Но тогда мне нужно будет синхронизировать/«нить-очистить» все межформные события, не так ли? Это может быть обслуживание PITA ... у кого-то есть лучшая идея? –

ответ

0

Чтобы сделать это, установите свойства в активированном событии формы к тому, что вы хотите войти:

private void Form1_Activated(object sender, System.EventArgs e) 
{ 
    // for example 
    log4net.GlobalContext.Properties["Name"] = this.GetType().Name; 
    log4net.GlobalContext.Properties["Id"] = this.Id; 
} 

ИН конфигурации протоколирования, вы можете ссылаться на свойства в PatternLayout для каждого Appender:

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{Name} : %property{Id} : [%level]- %message%newline" /> 
</layout> 

Редактировать: сохранить несколько значений, используют стек, так как в этом тесте блок, который выводит:

Сейчас в TestClass1 Сейчас в TestClass2

using log4net.Appender; 
using log4net.Config; 
using log4net.Core; 
using log4net.Layout; 
using NUnit.Framework; 

namespace log4net.Tests 
{ 
    [TestFixture] // A NUnit test 
    public class log4net_Stacks 
    { 
     [SetUp] 
     public void Setup() 
     { 
      ConsoleAppender ca = new ConsoleAppender 
      { 
       Layout = new PatternLayout("%property{demo}"), 
       Threshold = Level.All 
      }; 

      ca.ActivateOptions(); 
      BasicConfigurator.Configure(ca); 
     } 

     [Test] 
     public void Stacks_Demo() 
     { 
      new TestClass1().Method1(); 
      LogManager.GetLogger("logger").Debug(""); 
      ThreadContext.Stacks["demo"].Clear(); 
     } 

     private abstract class BaseTestClass 
     { 
      protected static void AddToStack(string message) 
      { 
       ThreadContext.Stacks["demo"].Push(message); 
      } 
     } 

     private class TestClass1 : BaseTestClass 
     { 
      public void Method1() 
      { 
       AddToStack("Now in " + GetType().Name); 
       var tc2 = new TestClass2(); 
       tc2.Method2(); 
      } 
     } 

     private class TestClass2 : BaseTestClass 
     { 
      public void Method2() 
      { 
       AddToStack("Now in " + GetType().Name); 
      } 
     }  
    } 
} 
+0

thx, да, это решает прямую проблему, но у меня также есть случаи, когда событие GUI в одной форме обрабатывается (косвенно) в нескольких из этих форм (например, в форме происхождения события и одной другой форме). В таком случае я все еще не вижу, что происходит в какой форме. Есть ли возможность различать в этих более сложных случаях? –

+0

@ Dr.TimdosSantos в этом случае вы, вероятно, используете свойство Stacks [ThreadContext класса] (https://logging.apache.org/log4net/release/sdk/log4net.ThreadContext.html) – stuartd

+0

не могли бы вы рассказать о том, как используйте ThreadContext.Stacks, чтобы сделать это, без необходимости использовать 'using (ThreadContext.Stacks [" Foo "]. Push (" Blah ")) {...}' вызов в каждом обработчике событий пользовательского интерфейса ? –