CMDB02/单例模式、资产采集参考命令、日志处理

1. 单例模式

1.1 多例模式

  • 代码示例

    class Foo(object):
    def __init__(self,name,age):
    self.name = name
    self.age = age def func(self):
    msg = "%s-%s" %(self.name,self.age) obj1 = Foo("张三",18) # Foo的一个对象/Foo类的一个实例
    obj1.func() obj2 = Foo("李四",19)
    obj2.func()

1.2 单例模式

  • 代码示例/以前:

    class Foo(object):
    instance = None
    def __init__(self,name,age):
    self.name = name
    self.age = age def __new__(cls,*arg,**kawrgs):
    if not cls.instance:
    cls.instance = object.__new__(cls)
    return cls.instance
    class Singleton(object):
    instance = None def __init__(self):
    self.name = None def __new__(cls, *arg, **kawrgs):
    if not cls.instance:
    cls.instance = object.__new__(cls)
    return cls.instance
  • 应用场景:

    • django配置文件,只要加载一次,以后使用都用同一份值。

      class Singleton(object):
      instance = None def __init__(self):
      self.k0 = 0
      self.k1 = 1
      self.k2 = 2
      ... def __new__(cls, *arg, **kawrgs):
      if not cls.instance:
      cls.instance = object.__new__(cls)
      return cls.instance obj1 = Singleton()
      obj2 = Singleton()
      obj3 = Singleton()
    • django的admin,在注册models中用,希望所有的model类注册到同一个列表中。

1.2.1 单例模式/错误
  • 代码示例:

    class Singleton(object):
    instance = None def __init__(self):
    self.name = None def __new__(cls, *arg, **kawrgs):
    if not cls.instance:
    cls.instance = object.__new__(cls)
    return cls.instance
1.2.2 单例模式 new/正确
  • 代码示例:

    import time
    import threading class Singleton(object):
    instance = None
    lock = threading.RLock() def __new__(cls, *arg, **kwargs):
    if cls.instance:
    return cls.instance
    with cls.lock:
    if not cls.instance:
    cls.instance = object.__new__(cls)
    return cls.instance obj1 = Singleton()
    obj2 = Singleton()
1.2.3 单例模式之文件导入/正确,在源码中的应用
  • 代码示例1:

    # xx.py
    
    class Site(object):
    def __init__(self):
    self.names = [] def xx(self):
    pass
    site = Site()
    import xx
    
    print(xx.site)
  • 代码示例2:

    # xx.py 
    
    class Singleton(object):
    
        def __init__(self):
    self._registry = [] def register(self,model_class):
    self._registry.append(model_class) site = Singleton()
    import xx
    xx.site

1.3 单例模式补充

  • 基于__new__实现单例模式,在init中不设置值。

  • 是单例,但数据会被覆盖

    class Singleton(object):
    instance = None def __init__(self):
    self.registry = [] def __new__(cls, *arg, **kawrgs):
    if not cls.instance:
    cls.instance = object.__new__(cls)
    return cls.instance def register(self, val):
    self.registry.append(val) # {registry:[]}
    obj1 = Singleton()
    # {registry:[x1]}
    obj1.register('x1') # instance = {registry:[x1]}
    # instance = {registry:[]}
    obj2 = Singleton()
    # instance = {registry:[x2]}
    obj2.register('x2') print(obj2.registry)
    print(obj1.registry)
  • 单例模式/数据不会覆盖

    class Singleton(object):
    instance = None
    registry = [] def __new__(cls, *arg, **kawrgs):
    if not cls.instance:
    cls.instance = object.__new__(cls)
    return cls.instance def register(self, val):
    self.registry.append(val) obj1 = Singleton()
    obj1.register('x1') obj2 = Singleton()
    obj2.register('x2') print(obj2.registry)
    print(obj1.registry)

2. 日志

  • 代码示例:

    import logging
    import settings class AutoLogger(object):
    def __init__(self,log_path,log_name):
    file_handler = logging.FileHandler(log_path, 'a', encoding='utf-8')
    fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s")
    file_handler.setFormatter(fmt) self.logger = logging.Logger(log_name, level=logging.DEBUG)
    self.logger.addHandler(file_handler) def log(self,msg):
    self.logger.error(msg) logger = AutoLogger(settings.LOG_FILE_PATH,'cmdb')
  • 获取日志堆栈信息

    import traceback
    
    def run():
    try:
    int('lbzhk')
    except Exception as e:
    print(traceback.format_exc()) if __name__ == '__main__':
    run()

3. 获取资产信息的命令

  • 内存信息

    sudo dmidecode  -q -t 17 2>/dev/null
    
    # 注意:linux上要提前安装 yum install dmidecode
  • 硬盘(安装MegaCli)

    sudo MegaCli  -PDList -aALL
  • 网卡

    sudo ip link show
    sudo ip addr show
  • 主板

    sudo dmidecode -t1
  • CPU

    cat /proc/cpuinfo

4. 数据封装

  • 代码示例:

    class BaseResponse(object):
    def __init__(self):
    self.status = True
    self.data = None
    self.error = None
    @property
    def dict(self):
    return self.__dict__ def process():
    info = BaseResponse()
    try:
    info.status = True
    info.data = "lbzhk"
    except Exception:
    pass
    return info.dict result = process()
    print(result)

5.表关系

总结:

  1. cmdb资产采集后,为什么不直接放到数据库?

    • 单独编写api,为了给其他系统提供数据支持(接口)
    • 维护的数据库连接比较多,修改不方便。
  2. 手写单例模式

    • new+锁
  3. 其他单例模式

    • 使用模块

      class Singleton(object):
      def foo(self):
      pass
      singleton = Singleton()
      from a import singleton
    • 使用装饰器

      def Singleton(cls):
      _instance = {} def _singleton(*args, **kargs):
      if cls not in _instance:
      _instance[cls] = cls(*args, **kargs)
      return _instance[cls] return _singleton @Singleton
      class A(object):
      a = 1
      def __init__(self, m=0):
      self.m = m a1 = A(1)
      a2 = A(2)
    • 使用类 -- 可以防止多线程的时候出问题

      import time
      import threading
      class Singleton(object):
      _instance_lock = threading.Lock() def __init__(self):
      time.sleep(1) @classmethod
      def instance(cls, *args, **kwargs):
      with Singleton._instance_lock:
      if not hasattr(Singleton, "_instance"):
      Singleton._instance = Singleton(*args, **kwargs)
      return Singleton._instance def task(arg):
      obj = Singleton.instance()
      print(obj)
      for i in range(10):
      t = threading.Thread(target=task,args=[i,])
      t.start()
      time.sleep(20)
      obj = Singleton.instance()
      print(obj)
    • 基于__new__实现 ,代码如上

  4. __new__方法返回的是什么

    • 新创建的对象,内部没有数据,需要经过init来进行初始化。
  5. 单利模式应用场景:

    • django的配置文件
    • django的admin
    • 数据库链接池(单例模式)
    • 写日志

CMDB02/ 单例模式、资产采集参考命令、日志处理的更多相关文章

  1. Django项目:CMDB(服务器硬件资产自动采集系统)--12--08CMDB采集硬件数据日志记录

    #settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...

  2. CMDB资产采集方案

    CMDB资产采集方案 CMDB 资产采集的方案总共有四种 Agent SSH类 Saltstack Puttet 方案设计,从性能上考虑 下面前三种是用Python开发的,目标是兼容三种采集方式的软件 ...

  3. CMDB学习之八,完成所有资产采集信息的收集

    #!/usr/bin/env python # -*- coding:utf-8 -*- import traceback from .base import BasePlugin from lib. ...

  4. CMDB03 /今日未采集的资产、资产入库、资产变更记录、资产采集

    CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 目录 CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 1. 获取今日未采集的服务器 2. server资产入库以 ...

  5. 应用Flume+HBase采集和存储日志数据

    1. 在本方案中,我们要将数据存储到HBase中,所以使用flume中提供的hbase sink,同时,为了清洗转换日志数据,我们实现自己的AsyncHbaseEventSerializer. pac ...

  6. CMDB资产采集笔记

    一.资产采集四种方式 1. Agent方式 API:Django接收数据并入库 程序:放置在每台服务器 应用场景:针对服务器较多的公司 步骤一: #执行本地命令的库 import subprocess ...

  7. CMDB资产采集的四种方式

    转 https://www.cnblogs.com/guotianbao/p/7703921.html 资产采集的概念 资产采集的四种方式:Agent.SSH.saltstack.puppet 资产采 ...

  8. [日志分析]Graylog2采集mysql慢日志

    之前聊了一下graylog如何采集nginx日志,为此我介绍了两种采集方法(主动和被动),让大家对graylog日志采集有了一个大致的了解. 从日志收集这个角度,graylog提供了多样性和灵活性,大 ...

  9. CMDB服务器管理系统【s5day91】:资产采集相关问题

    资产采集唯一标识和允许临时修改主机名 class AgentClient(BaseClient): def exec(self): obj = PluginManager() server_dict ...

随机推荐

  1. Python实现DPABI当中“DICOM Sorted”功能

    1. 前言 在对DICOM数据预处理之前很重要的一步是将扫描得到的文件按照不同的扫描序列区分开来.DPABI和PANDA工具包中已经提供了相应的功能模块.但由于是集成的模块,不容易及逆行扩展和调整.这 ...

  2. 如何解决在electron里无法使用puppeteer的evaluate函数

    报错如图,只需要注释掉 index.html 含有 http-equiv="Content-Security-Policy 的 meta 标签就可以了.

  3. 深度学习中环境配置的一些经验总结(conda 常用命令)

    前两个月参加了学校的国创项目,和一个外院的同学组队.课题是基于深度学习的新闻图片中网络暴力元素的检查. 6月末最后一门试考完,正式开始暑假,便有了大把时间搞这个国创项目(反正没有其他事干).两个组凑钱 ...

  4. cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare

    *cb36a_c++_STL_算法_区间的比较equal_mismatch_lexicographical_compare 区间:容器中的全部数据或者部分数据,都叫做区间 equal(b,e,b2), ...

  5. Spring Boot 2 实战:利用Redis的Geo功能实现查找附近的位置

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  6. linux kernel update

    linux内核升级 最近HW行动,报出来的linux系统内核漏洞,环境中全部是2.6.32-431.el6.x86_64的主机,需要全部升级到754版本,这也是第一次进行内核升级操作. 先找了一台和生 ...

  7. 微信小程序-页面跳转与参数传递

    QQ讨论群:785071190 微信小程序页面跳转方式有很多种,可以像HTML中a标签一样添加标签进行跳转,也可以通过js中方法进行跳转. navigator标签跳转 <view class=& ...

  8. 入门大数据---Flink学习总括

    第一节 初识 Flink 在数据激增的时代,催生出了一批计算框架.最早期比较流行的有MapReduce,然后有Spark,直到现在越来越多的公司采用Flink处理.Flink相对前两个框架真正做到了高 ...

  9. 主线程用afxBeginThread()创建多个线程安全退出的办法

    HANDLE hand[]; CCriticalSection m_crisecoin; CEvent m_event; struct Student { int nNO; int nYear; CW ...

  10. Python之浅谈装饰器

    目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...