log4j实现的remoteLog

1、log4j配置:

<appender name="remoteFile" class="org.apache.log4j.net.SocketAppender">
   <param name="remoteHost" value="127.0.0.1" /><!-- 这是远程log server -->
   <param name="port" value="4445" /><!-- 这是远程log server port -->
   <param name="Threshold" value="INFO" /><!-- log 级别 -->
   <param name="ReconnectionDelay" value="1000" /><!-- 服务断开后重连 -->
   <param name="LocationInfo" value="true" />
</appender>

<logger name="testRemote2" additivity="false">
   <level value="INFO" />
   <appender-ref ref="remoteFile" />
</logger>
2、server端:

package remotelog;

import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.log4j.Logger;

public class LogSocketServer {
   private static final Logger logger = Logger
         .getLogger(LogSocketServer.class);

   public static void main(String[] args) {
      logger.debug("begin call listen log info .....");
      ServerSocket serverSocket;
      Socket socket = null;
      try {
         // 如果没有配置端口 则抛出异常
         serverSocket = new ServerSocket(4445);

         while (true) {

            logger.info("Waiting to accept a new client.");

            socket = serverSocket.accept();

            InetAddress inetAddress = socket.getInetAddress();

            logger.info("Connected to client at " + inetAddress);

            logger.info("Starting new socket node.");

            new Thread(new LogSocketNode(socket)).start();

         }
      } catch (Exception e) {
         logger.error("error in liston info  ", e);
      }

   }
}

3、client端(略)

bitmap算法

数据量很大时,内存很小(或者说很有限时),通常位图是很合适的选择。 例题:给40亿个不重复的unsignedint的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

import org.apache.commons.lang.StringUtils;
public class TestBitMap {
    /**
     * bitmap(位图)的方式节约空间
     */
    private final int[] bitmap;
    private final int size;
    public TestBitMap(final int size) {
        this.size = size;
        int sLen = ((size%32) == 0) ? size/32 : size/32 1;
        this.bitmap = new int[sLen];
    }
    private static int _Index(final int number ){
        return number / 32;
    }
    private static int _Position(final int number){
        return number % 32;
    }
    private void adjustBitMap(final int index, final int position) {
        int bit = bitmap[index] | (1 << position);
        bitmap[index] = bit;
    }
    public void add(int[] numArr){
        for(int i=0; i<numArr.length; i++)
            add(numArr[i]);
    }
    public void add(int number) {
        adjustBitMap(_Index(number),_Position(number));
    }
    public boolean getIndex(final int index) {
        if(index > size) return false;
        int bit = (bitmap[_Index(index)] >> _Position(index)) & 0x0001;
        return (bit == 1);
    }
    /**
     * 造成堆内存溢出,要分配2147483647个字节(很大)
     * @return
     */
    @Override
    public String toString() {
        StringBuffer sbf = new StringBuffer(size);
        for(Integer i : bitmap) {
            StringBuffer tmp = new StringBuffer(32);
            String bits = Integer.toBinaryString(i);
            for(int b=0; b<32-bits.length(); b++)
                tmp.append(0);
            tmp.append(bits);
            sbf.append(tmp.reverse());
        }
        String s = sbf.substring(0, size).toString();
        return StringUtils.reverse(s);
    }
    public static void main(String[] args) {
        TestBitMap bm = new TestBitMap(Integer.MAX_VALUE);
        int searchNum = 999;
        int[] numArr = {19644556054282233440185450492920314730241750573355212227453191749245152427356539614612235248393921111};
        bm.add(numArr);
        for(int i : numArr)
            System.out.println(bm.getIndex(i));
        System.out.println(bm.getIndex(searchNum));         //查询是否存在
    }
}