关于文章 ip

city ip log tornado

tornado 异步日志统计获取IP地址和对应城市

异步日志统计获取IP地址和对应城市

ip转城市

直接贴代码

class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class SearchIp(metaclass=Singleton):
    def __init__(self):
        try:
            dbpath = os.path.abspath("./utils/ip/ip2region.db")
            self.search = Ip2Region(dbpath)
        except IOError:
            log.error("err connect db",IOError.errno)
        else:
            log.info("db connect success")

    def getSession(self):
        return self.search
    def searchCity(self,ip):
        try:
            if self.getSession().isip(ip):
                city =  self.getSession().btreeSearch(ip=ip).get("region","火星").decode("utf-8")
            else:
                city = "火星"
        except IOError:
            log.error(IOError)
            city = "火星"
            return city
        else:
            return city
    def close(self):
        self.search.close()

单例模式 然后ip转城市

异步存到mongodb

class baseHttp (tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(100)

        @tornado.web.asynchronous
        @tornado.gen.coroutine
        def initialize(self):
            yield self.logsave()

        @run_on_executor
        def logsave(self):
            ipDao.saveLog(self.request.remote_ip,self.request.uri,self.request.headers.get("User-Agent","鬼知道"))

似乎还凑活~~