【问题标题】:RemotingAppender problems. Conn created but nothing appendedRemotingAppender 问题。 Conn 创建但没有附加任何内容
【发布时间】:2015-08-15 23:48:59
【问题描述】:

我一直在学习 log4net,并希望在将来的某个时候使用远程附加程序将消息记录到服务器上。为此,我首先尝试创建一个本地 .Net 远程服务器并附加到它。在我看来,服务器已创建,但我无法收到这些消息。 (要检查这一点,我尝试在运行程序之前和之后在浏览器中输入 localhost:portnumber 来访问服务器。它之前失败并稍后接受连接。有更好的调试方法吗?) 无论如何,这是代码。我将不胜感激任何帮助。 PS:我可以看到文件和控制台附加程序工作。

客户端代码 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});
            }
        }
    }
}

客户端代码

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

【问题讨论】:

    标签: log4net remoting log4net-appender


    【解决方案1】:

    嗯, 我找到了答案。上面的代码是正确的。原来 Log4net 的客户端和服务器端之间存在一些不兼容。尽管我从同一个源(Nuget)安装了两者,但两个引用之间发生了一些变化。在将 log4net 的内部调试器属性设置为 true 后,我偶然发现了这条日志消息。

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

    谷歌搜索将我带到here,这就是我怀疑有什么不对劲的地方。长话短说,删除 RemoteAPP 中对 log4net 的所有引用并通过 Nuget 重新安装。

    现在可以了。如果有人知道这是怎么发生的,请继续讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2020-11-17
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多