python 打印top的信息到log

本文详细介绍了在Linux环境下如何正确使用top命令进行系统监控,包括解决执行脚本时遇到的TERM环境变量未设置的问题,以及如何通过管道和批次处理获取并解析top命令的输出数据,实现内存和CPU利用率的监测。
管道,批次,
def echo_in_log(metric,threshold):
    top1_info = subprocess.Popen(["top", "-n", "1","-b"],stdout=subprocess.PIPE)
    top_info = subprocess.Popen(["head","-n","30"],stdin=top1_info.stdout,stdout=subprocess.PIPE)
    out, err = top_info.communicate() 
    #output info get from console has many unicode escape character ,such as \x1b(B\x1b[m\x1b[39;49m\x1b[K\n\x1b(B\x1b[m
    #use decode('unicode-escape') to process 
    out_info = out.decode('unicode-escape') 

    topLogger.info("now this {metric} is lower than the threshold{threshold}, now top_info is {top_info}".format(metric=metric,threshold=threshold,top_info=out_info))

top 是 动态查看,
n 设置退出前屏幕刷新的次数
b 将top输出编排成适合输出到文件的格式,可以使用这个选项创建进程日志
这里用 top -n 1 -b,
其中, 执行脚本报错 TERM environment variable not set. 用 top -b 就解决了

使用top命令报错的原因是:在Linux下使用top命令需要指定终端类型,也就是一个“TERM” 的环境变量。

可执行如下命令:

# top
TERM environment variable not set.
日志格式

out_info = out.decode(‘unicode-escape’) 是因为得到的 top 信息里含有二进制格式,需要去除。 
有的看起来正常,但是vim 查看就有问题, 有的直接用脚本执行的时候就报错, 有的cat查看就报错。

管道,

由于 top -n 1 -b 的信息太长,需要截取下, 所以使用了 PIPE,
这里就曾走过很多弯路。

status,data = subprocess.getstatusoutput(" top -n 1 -b | head -n 30 ")  
这里得到的data格式错误,
data = subprocess.call(" top -n 1 -b | head -n 30 ") 
这里得到的data 不能保存,只能显示在屏幕上,
还有的subprocess 不接受 (" top -n 1 -b | head -n 30 ")  中的 "| " ,所以报错。
 
int把字符转数字,

idle_mem = int(idle_mem) ## 这里 用,long,float, 不知道为什么, python3 执行的时候,总是报错

def idles_mem_cpu():
    sta1,total_mem=subprocess.getstatusoutput("top -n 1 -b| grep 'Mem :' | awk '{print $4}'")
    sta2,idle_mem=subprocess.getstatusoutput("top -n 1 -b | grep 'Mem :' | awk '{print $6}'")
    #print("total_mem,idle_mem ",total_mem,sta1,sta2,idle_mem)


    idle_mem = int(idle_mem)   ## 这里 用,long,float, 不知道为什么, python3 执行的时候,总是报错
    total_mem = int(total_mem)
    mem_id=idle_mem*100/total_mem

    mem_id=float(mem_id)
    sta3,cpu_id=subprocess.getstatusoutput("top -n 1 -b| grep Cpu | awk -F' ' '{print $8}' ")
    #print(cpu_id)

    cpu_id=float(cpu_id)
    #print(mem_id,cpu_id)
    return mem_id,cpu_id
在使用 NumPy 时,我们经常需要将矩阵(二维数组)以清晰、可读的方式进行 **log 打印**,尤其是在调试或监控模型输入/输出时。直接打印大矩阵会自动省略部分内容,影响调试效率。 下面是如何正确地对 `np.array` 矩阵进行日志记录的完整方法。 --- ### ✅ 正确 log 打印 NumPy 矩阵的方法 #### 1. 基础配置:设置 NumPy 打印选项 ```python import numpy as np import logging # 配置日志格式(显示文件名和行号) logging.basicConfig( level=logging.INFO, format='%(levelname)s:%(filename)s:%(lineno)d - %(message)s' ) logger = logging.getLogger(__name__) # 设置 NumPy 打印选项,避免省略内容 np.set_printoptions( precision=6, # 小数点后保留位数 suppress=True, # 禁用科学计数法 linewidth=150, # 每行最大字符宽度 threshold=np.inf # 显示所有元素(无省略) ) ``` --- #### 2. 打印矩阵示例 ```python # 创建一个 4x4 的浮点矩阵 matrix = np.array([ [1.123456789, 2.987654321], [3.141592653, 4.444444444] ]) logger.info("Matrix:\n%s", matrix) ``` 输出: ``` INFO:test.py:15 - Matrix: [[1.123457 2.987654] [3.141593 4.444444]] ``` > ✅ 使用 `%s` 格式化并换行 `\n` 可保证矩阵结构清晰显示。 --- #### 3. 控制精度与格式(更美观) 如果你希望进一步控制输出格式(如固定列宽、对齐),可以自定义格式化函数: ```python def format_matrix(arr, title="Matrix"): """美化矩阵输出""" import io with io.StringIO() as buf: np.savetxt(buf, arr, fmt='%10.4f', delimiter=' ') content = buf.getvalue().strip() return f"{title} (shape: {arr.shape}, dtype: {arr.dtype}):\n{content}" # 使用 logger.info("%s", format_matrix(matrix, "Input Matrix")) ``` 输出: ``` INFO:test.py:25 - Input Matrix (shape: (2, 2), dtype: float64): 1.1235 2.9877 3.1416 4.4444 ``` --- #### 4. 大矩阵处理策略(避免日志爆炸) 对于大型矩阵(如 100x100),不建议完整打印。推荐只打印摘要信息 + 局部片段: ```python def log_matrix_summary(arr, name="Matrix", show_shape=True, show_stats=True, show_slice=5): parts = [] if show_shape: parts.append(f"Shape: {arr.shape}, DType: {arr.dtype}") if show_stats: parts.append(f"Min: {arr.min():.4f}, Max: {arr.max():.4f}, Mean: {arr.mean():.4f}") summary = ", ".join(parts) logger.info("%s: %s", name, summary) if show_slice > 0: slice_ = arr[:show_slice, :show_slice] logger.debug("%s (top-left %d×%d slice):\n%s", name, show_slice, show_slice, slice_) # 示例:大矩阵 large_matrix = np.random.randn(10, 8) log_matrix_summary(large_matrix, "Weight Matrix") ``` 输出: ``` INFO:test.py:40 - Weight Matrix: Shape: (10, 8), DType: float64, Min: -2.3456, Max: 2.6789, Mean: 0.0123 DEBUG:test.py:45 - Weight Matrix (top-left 5×5 slice): [[ 0.1234 -0.5678 ...] [-0.9876 1.2345 ...] ... [ ... ... ...]] ``` --- ### ⚠️ 注意事项 - **不要在生产环境打印整个大矩阵**:会导致日志文件过大。 - **使用 `logger.debug()` 打印详细内容**,而 `info` 只保留关键摘要。 - **确保 `set_printoptions(threshold=np.inf)` 不影响性能**:仅在调试时启用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值