2015-08-15 3 views
0

Я изучаю log4net и хочу использовать добавочного приложения для отправки сообщений на сервер в будущем. Для этого я сначала попытался создать локальный удаленный сервер .Net и добавить к нему. Мне кажется, что сервер создан, но я не могу получить эти сообщения. (Чтобы проверить это, я пытаюсь получить доступ к серверу, введя localhost: номер порта в моем браузере, до и после запуска моей программы. Он не работает до и принимает соединение позже. Любой лучший способ отладить это?) В любом случае, вот код , Буду признателен за любую помощь. PS: Я вижу файл & Консольные приложения.Проблемы с RemotingAppender. Conn создан, но ничего не добавлено

Клиентский код App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.onfig.Log4NetConfigurationSectionHandler, log4net"/> 
    </configSections> 
    <log4net> 
    <appender name="Console" type="log4net.Appender.ColoredConsoleAppender"> 
     <mapping> 
     <level value="DEBUG"/> 
     <foreColor value="Red, HighIntensity"/> 
     </mapping> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%class %date [%level] - %message%newline"/> 
     </layout> 
    </appender> 

    <appender name="File" type="log4net.Appender.FileAppender"> 
     <file value="logfile.txt"/> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%class %date [%level] - %message%newline"/> 
     </layout> 
    </appender> 

     <appender name="RemotingAppender" type="log4net.Appender.RemotingAppender"> 
     <sink value="tcp://localhost:8086/RemoteLogger"/> 
     <lossy value="false"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%class %date [%level] - %message%newline"/> 
     </layout> 
     <bufferSize value="1"/> 
     <onlyFixPartialEventData value="true"/> 
     </appender> 

    <root> 
     <level value="ALL"/> 
     <appender-ref ref="Console"/> 
    <appender-ref ref="RemotingAppender"/> 
    <appender-ref ref="File"/> 
    </root> 


    </log4net> 

    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 
</configuration> 

Серверный код AppConfig

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

     <system.runtime.remoting> 
     <application name="RemoteLogger"> 
      <channels> 
      <channel name="logging sink" ref="tcp server" port="8086"/> 
      </channels> 
     </application> 
     </system.runtime.remoting> 

</configuration> 

сервера Код

namespace RemoteAPP 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Listening"); 
      var _sink = new RemoteSink(); 
      _sink.EventsReached += (s,a)=> AddLog(a.LoggingEvents); 
      RemotingConfiguration.Configure("RemoteAPP.exe.config", false); 
      //RemotingConfiguration.RegisterWellKnownServiceType(new WellKnownServiceTypeEntry(typeof(RemoteSink), "RemoteLogger", WellKnownObjectMode.SingleCall)); 

      RemotingServices.Marshal(_sink, "RemoteLogger"); 
      Console.ReadLine(); 
     } 

     private static void AddLog(IEnumerable<LoggingEvent> enumerable) 
     { 
      var Logevents = enumerable.ToList(); 
      foreach(var logevent in Logevents) 
      { 
       Console.WriteLine(logevent); 
      } 
     } 
    } 

    public class RemoteSink:MarshalByRefObject,RemotingAppender.IRemoteLoggingSink 
    { 
     public class LoggingArgs:EventArgs 
     { 
      public IEnumerable<LoggingEvent> LoggingEvents; 
     } 
     public EventHandler<LoggingArgs> EventsReached; 

     void RemotingAppender.IRemoteLoggingSink.LogEvents(LoggingEvent[] events) 
     { 
      var ev = EventsReached; 
      if(ev==null) 
      { 
       ev.Invoke(this, new LoggingArgs{LoggingEvents = events}); 
      } 
     } 
    } 
} 

Client Код

class Program 
    { 
     static void Main(string[] args) 
     { 
      Thread.Sleep(10000); 

      log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
      for (int i = 0; i < 1000;i++) 
      { 
       log.Info("Hello world"); 
       log.Debug("This is Debug"); 
       log.Warn("This is Warn"); 
      } 

ответ

0

Ну, я нашел ответ. Правильный код. Оказывается, была некоторая несовместимость между клиентской и серверной частью Log4net. Хотя я установил оба из одного источника (Nuget), что-то изменилось между двумя ссылками. После установки внутреннего свойства debugger log4net в значение true, я наткнулся на это сообщение журнала.

log4net:ERROR [RemotingAppender] ErrorCode: GenericFailure. Failed in SendBufferCallback 

погуглить это привело меня к here и это, где я подозревала что-то неладное. Короче говоря, удалены все ссылки на log4net в RemoteAPP и переустановлены через Nuget.

Это работает сейчас. Если кто-то знает, как это произошло, продолжайте обсуждение.

Смежные вопросы