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模块命令
-
os.name——name顾名思义就是’名字’,这里的名字是指操作系统的名字,主要作用是判断目前正在使用的平台,并给出操作系统的名字,如Windows 返回 ‘nt’; Linux 返回’posix’。注意该命令不带括号。
-
os.getcwd()——全称应该是’get current work directory’,获取当前工作的目录,如:返回结果为:‘C:\Program Files\Python36’。注意该命令带括号,除了第一个命令不带括号之外,以下命令基本都带括号。
-
os.listdir(path)——列出path目录下所有的文件和目录名。Path参数可以省略。
-
os.remove(path)——删除path指定的文件,该参数不能省略。
-
os.rmdir(path)——删除path指定的目录,该参数不能省略。
-
os.mkdir(path)——创建path指定的目录,该参数不能省略。
-
os.path.isfile(path)——判断指定对象是否为文件。是返回True,否则False
-
os.path.isdir(path)——判断指定对象是否为目录。是True,否则False。例
-
os.path.exists(path)——检验指定的对象是否存在。是True,否则False.
-
os.path.split(path)——返回路径的目录和文件名,即将目录和文件名分开,而不是一个整体。此处只是把前后两部分分开而已。就是找最后一个’/’。
-
os.system(cmd)——执行shell命令。返回值是脚本的退出状态码,0代表成功,1代表不成功
-
os.chdir(path)——'change dir’改变目录到指定目录
-
os.path.getsize()——获得文件的大小,如果为目录,返回0
-
os.path.abspath()——获得绝对路径。
-
os.path.join(path, name)—连接目录和文件名,与os.path.split(path)相对。
-
os.path.basename(path)——返回文件名
-
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)