OSSIM项目研究记录(九)

2021SC@SDUSC

os-sim/frameworked源码分析之logger.py


一、库

这一文件的引用非常简单,如下:

import string, logging, os, sys

1.1、logging模块

logging模块是Python内置的标准模块,logging模块给运行中的应用提供了一个标准的信息输出接口。典型的logging机制实现是把要输出的数据简单地写到一个txt文件中去。写log文件的方式是一种常见的打log的方式,而logging模块提供的更,它可以把输出信息输出到所有类文件的对象中去,甚至TCP和UDP的sockets,email服务器,Unix的syslog系统,NT系列的事件log系统,内存的buffer和HTTP服务器,当然还有”真正的”文件中去。主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;
相比print,具备如下优点:

  • 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  • print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;
    logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

它提供了以下几个子模块:loggers,handlers,filters和formatters.Loggers把应用需要直接调用的接口暴露出来.Handlers把log记录发到相应的目的地.Filters决定哪些记录需要发给handler.Formatters定义了log记录的输出格式.
在loggers中几个关键方法需要注意:

debug(log_message, [*args[, **kwargs]])
info(log_message, [*args[, **kwargs]])
warning(log_message, [*args[, **kwargs]])
error(log_message, [*args[, **kwargs]])
critical(log_message, [*args[, **kwargs]])
exception(message[, *args])
log(log_level, log_message, [*args[, **kwargs]])

使用方法如下:

import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
 
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")

运行后结果为:

2016-10-09 19:11:19,434 - __main__ - INFO - Start print log
2016-10-09 19:11:19,434 - __main__ - WARNING - Something maybe fail.
2016-10-09 19:11:19,434 - __main__ - INFO - Finish

1.1、os模块

os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块,本节内容将对os模块提供的函数进行详细的解读。
二、常用的os模块命令

  1. os.name——name顾名思义就是’名字’,这里的名字是指操作系统的名字,主要作用是判断目前正在使用的平台,并给出操作系统的名字,如Windows 返回 ‘nt’; Linux 返回’posix’。注意该命令不带括号。

  2. os.getcwd()——全称应该是’get current work directory’,获取当前工作的目录,如:返回结果为:‘C:\Program Files\Python36’。注意该命令带括号,除了第一个命令不带括号之外,以下命令基本都带括号。

  3. os.listdir(path)——列出path目录下所有的文件和目录名。Path参数可以省略。

  4. os.remove(path)——删除path指定的文件,该参数不能省略。

  5. os.rmdir(path)——删除path指定的目录,该参数不能省略。

  6. os.mkdir(path)——创建path指定的目录,该参数不能省略。

  7. os.path.isfile(path)——判断指定对象是否为文件。是返回True,否则False

  8. os.path.isdir(path)——判断指定对象是否为目录。是True,否则False。例

  9. os.path.exists(path)——检验指定的对象是否存在。是True,否则False.

  10. os.path.split(path)——返回路径的目录和文件名,即将目录和文件名分开,而不是一个整体。此处只是把前后两部分分开而已。就是找最后一个’/’。

  11. os.system(cmd)——执行shell命令。返回值是脚本的退出状态码,0代表成功,1代表不成功

  12. os.chdir(path)——'change dir’改变目录到指定目录

  13. os.path.getsize()——获得文件的大小,如果为目录,返回0

  14. os.path.abspath()——获得绝对路径。

  15. os.path.join(path, name)—连接目录和文件名,与os.path.split(path)相对。

  16. os.path.basename(path)——返回文件名

  17. os.path.dirname(path)——返回文件路径

参考来源blog链接

1.1、sys模块

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分 / 提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数。它始终可用。

常见用法:
sys.argv:命令行参数List,第一个元素是程序本身路径
sys.modules.keys(): 返回所有已经导入的模块列表
sys.exc_info():获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息
sys.exit(n) :退出程序,正常退出时exit(0)
sys.hexversion :获取Python解释程序的版本值,16进制格式如:0x020403F0
sys.version :获取Python解释程序的版本信息
sys.maxint : 最大的Int值
sys.maxunicode:最大的Unicode值
sys.modules :返回系统导入的模块字段,key是模块名,value是模块
sys.path :返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform :返回操作系统平台名称
sys.stdout : 标准输出
sys.stdin :标准输入
sys.stderr : 错误输出
sys.exc_clear() :用来清除当前线程所出现的当前的或最近的错误信息
sys.exec_prefix :返回平台独立的python文件安装的位置
sys.byteorder :本地字节规则的指示器,big-endian平台的值是’big’,little-endian平台的值是’little’
sys.copyright : 记录python版权相关的东西
sys.api_version :解释器的C的API版本
sys.displayhook(value) :如果value非空,这个函数会把他输出到sys.stdout,并且将他保存进__builtin__..指在python的交互式解释器里,’’ 代表上次你输入得到的结果,hook是钩子的意思,将上次的结果钩过来
sys.getdefaultencoding() :返回当前你所用的默认的字符编码格式
sys.getfilesystemencoding() :返回将Unicode文件名转换成系统文件名的编码的名字
sys.setdefaultencoding(name):用来设置当前默认的字符编码,如果name和任何一个可用的编码都不匹配,抛出 LookupError,这个函数只会被site模块的sitecustomize使用,一旦别site模块使用了,他会从sys模块移除
sys.builtin_module_names :Python解释器导入的模块列表
sys.executable :Python解释程序路径
sys.getwindowsversion():获取Windows的版本
sys.stdin.readline() :从标准输入读一行,sys.stdout.write(“a”) 屏幕输出a

二、方法

1.删除流处理程序;(在后台程序模式下启动代理时非常有用)

   def remove_console_handler():
        if Logger.__streamhandler:
            Logger.logger.removeHandler(Logger.__streamhandler)

2.日志到文件(文件应为配置中的日志->文件)

 def _add_file_handler(file, log_level = None):

        dir = file.rstrip(os.path.basename(file))
        if not os.path.isdir(dir):
            try:
                os.makedirs(dir, 0755)
            except OSError, e:
                print "Logger: Error adding file handler,", \
                    "can not create log directory (%s): %s" % (dir, e)
                return

        try:
            handler = logging.FileHandler(file)
        except IOError, e:
            print "Logger: Error adding file handler: %s" % (e)
            return

        handler.setFormatter(Logger.__formatter)
        if log_level: # modify log_level
            handler.setLevel(log_level)
        Logger.logger.addHandler(handler)

    _add_file_handler = staticmethod(_add_file_handler)

3.错误文件处理程序;此处理程序的目的是只记录错误和关键消息

 def add_error_file_handler(file):
        Logger._add_file_handler(file, logging.ERROR)

4.将事件发送到远程系统日志

 def add_syslog_handler(address):
        from logging.handlers import SysLogHandler
        handler = SysLogHandler(address)
        handler.setFormatter(logging.Formatter(Logger.SYSLOG_FORMAT))
        Logger.logger.addHandler(handler)

5.是否显示调试消息;修改全局(记录器,而不是处理程序)阈值级别

 def set_verbose(verbose = 'info'):
        if verbose.lower() == 'debug':
            Logger.logger.setLevel(logging.DEBUG)
        elif verbose.lower() == 'info':
            Logger.logger.setLevel(logging.INFO)
        elif verbose.lower() == 'warning':
            Logger.logger.setLevel(logging.WARNING)
        elif verbose.lower() == 'error':
            Logger.logger.setLevel(logging.ERROR)
        elif verbose.lower() == 'critical':
            Logger.logger.setLevel(logging.CRITICAL)
        else:
            Logger.logger.setLevel(logging.INFO)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值