RemotingAppender问题.创建了Conn,但未附加任何内容 [英] RemotingAppender problems. Conn created but nothing appended

查看:133
本文介绍了RemotingAppender问题.创建了Conn,但未附加任何内容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have been learning log4net and wish to use the remoting appender to log messages onto a server sometime in the future. To do this, I first tried creating a local .Net remoting server and appending to it. It seems to me that the server has been created but I cannot receive these messages. (To check this, I try accessing the server by entering localhost:portnumber in my browser, before and after running my program. It fails before and accepts the connection later. Any better way to debug this?) Anyway, here is the code. I would appreciate any help. PS: I can see the File & Console appenders work.

客户代码 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的客户端和服务器端之间存在一些不兼容.尽管我从相同的来源(Nuget)安装了两者,但是两个引用之间还是有所变化.将log4net的内部调试器属性设置为true后,我偶然发现了此日志消息.

Well, I found the answer. The code above is correct. Turns out there was some incompatibility between the client and server side of Log4net. Although I installed both from the same source (Nuget), something changed between the two references. After setting log4net's internal debugger property to true, I stumbled across this log message.

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

在Google上进行搜索后,我进入了此处,而我怀疑这是在哪里不对劲.长话短说,在RemoteAPP中删除了对log4net的所有引用,并通过Nuget重新安装.

Googling it led me to here and this is where I suspected something was amiss. Long story short, removed all references to log4net in RemoteAPP and reinstalled via Nuget.

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

It works now. If someone knows how this occurred, please continue the discussion.

这篇关于RemotingAppender问题.创建了Conn,但未附加任何内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆