zoukankan      html  css  js  c++  java
  • log4net RemotingAppender 的配置

    Before you even start trying any of the alternatives provided, ask yourself whether you really need to have multiple processes log to the same file, then don't do it ;-).

    FileAppender offers pluggable locking models for this usecase but all existing implementations have issues and drawbacks.

    By default the FileAppender holds an exclusive write lock on the log file while it is logging. This prevents other processes from writing to the file. This model is known to break down with (at least on some versions of) Mono on Linux and log files may get corrupted as soon as another process tries to access the log file.

    MinimalLock only acquires the write lock while a log is being written. This allows multiple processes to interleave writes to the same file, albeit with a considerable loss in performance.

    InterProcessLock doesn't lock the file at all but synchronizes using a system wide Mutex. This will only work if all processes cooperate (and use the same locking model). The acquisition and release of a Mutex for every log entry to be written will result in a loss of performance, but the Mutex is preferable to the use of MinimalLock.

    If you use RollingFileAppender things become even worse as several process may try to start rolling the log file concurrently. RollingFileAppendercompletely ignores the locking model when rolling files, rolling files is simply not compatible with this scenario.

    A better alternative is to have your processes log to RemotingAppenders. Using the RemoteLoggingServerPlugin (or IRemoteLoggingSink) a process can receive all the events and log them to a single log file. One of the examples shows how to use the RemoteLoggingServerPlugin.

    原于这段话, 大致的是文件方式写日志,会遇到多个process同时写入同一个日志文件的问题.最后提到最好的方法是使用RemotingAppender。 之后花了一点时间研究了一下。主要想讲几个注意点。客户端的配置

    <appender name="RemotingAppender" type="log4net.Appender.RemotingAppender" >
        <sink value="tcp://localhost:8085/LoggingSink" />
        <lossy value="false" />
        <bufferSize value="95" />
        <onlyFixPartialEventData value="true" />
    </appender>
    注意:bufferSize 是表示一个缓存区大小,remotingappender不是立即就把日志发送给服务端的,等到缓冲区满了设置的大小之后才会发,如果想立即发送请把这个值设成0
    当然remotingappender 和其他的appender一样都可以设置日志格式的。
    主要是讲一下 服务端
    首先注册信道, 客户端配置了tcp 所以服务器端也使用TcpChannel 注册的时候  ChannelServices.RegisterChannel(channel, false); 注意第二个参数要是设置成false;
    (我就在这里花了很多时间)。
    注册远程对象 使用  RemotingServices.Marshal (注log4net 内部使用的是接口方式激活远程对象)
    远程对象必须继承 RemotingAppender.IRemoteLoggingSink借口
    第二种发布方式,使用log4net 提供的 RemoteLoggingServerPlugin 插件
    log4net.LogManager.GetRepository().PluginMap.Add(new log4net.Plugin.RemoteLoggingServerPlugin("LoggingSink"))
    其中“LoggingSink”是远程对象发布的名称
    使用第二种方式,不需要自己实现远程对象,log4net中帮我们实现好了一个远程对象。要获取日志信息,只要在服务器端在配置一个appender 就可以了!
  • 相关阅读:
    oracle 调优3
    ifconfig找不到命令的帖子 精选
    执行计划中各字段各模块描述
    oracle统计信息
    oracle中 rownum与rowid的理
    触发器
    开园第一天
    Asp.net生成htm静态文件的两种途径
    避免刷新页面,自动跳回到页面顶部的办法
    ASP.NET二级域名站点共享Session状态
  • 原文地址:https://www.cnblogs.com/xgq2014/p/5052546.html
Copyright © 2011-2022 走看看