GAWK 5.0.1能否获取代码行号、函数名及源码文件名?
在GAWK 5.0.1中实现带元数据的日志记录
可以实现,GAWK虽然没有直接对应Python日志模块的内置变量,但通过预定义宏、内置数组和自定义函数,就能实现包含时间戳、进程ID、函数名、文件名、行号的日志输出。
实现步骤与示例代码
先定义一个通用的日志函数,再通过手动传入必要元数据、调用GAWK内置能力生成日志:
# 定义INFO级别的日志函数 function log_info(msg, func_name, line_num) { # 生成带毫秒的时间戳 timestamp = strftime("%Y-%m-%d %H:%M:%S,%3N") # 获取当前进程ID pid = PROCINFO["pid"] # 获取当前脚本文件名 filename = PROCINFO["argv"][0] # 格式化输出日志到STDOUT printf("%s - %d - INFO - [%s():%s:%d] - %s\n", timestamp, pid, func_name, filename, line_num, msg) } # 主程序中调用日志函数 log_info("toto", "<module>", __LINE__) # 自定义函数中调用日志函数 function test_func() { log_info("test message from function", "test_func", __LINE__) } test_func()
关键细节说明
- 时间戳:使用
strftime("%Y-%m-%d %H:%M:%S,%3N")生成与Python格式一致的时间,%3N用于获取毫秒(GAWK 5.0.1默认支持GNU扩展,该格式有效);若不支持%3N,可替换为strftime("%Y-%m-%d %H:%M:%S") "." substr(systime()*1000, length(systime()*1000)-2)模拟毫秒。 - 进程ID:通过
PROCINFO["pid"]直接获取,对应Python日志中的%(process)d。 - 文件名:
PROCINFO["argv"][0]返回当前执行的awk脚本文件名,对应Python的%(filename)s。 - 行号:使用预定义宏
__LINE__,它会在脚本解析时替换为调用log_info语句所在的行号,必须直接在调用位置传入,无法在函数内部间接获取。 - 函数名:GAWK没有内置的当前函数名变量,因此需要在调用日志函数时手动传入函数名(主程序可使用
<module>标记,自定义函数传入自身名称),对应Python的%(funcName)s。
扩展支持多日志级别
如果需要WARN、ERROR等其他级别,只需扩展日志函数即可,比如:
function log(level, msg, func_name, line_num) { timestamp = strftime("%Y-%m-%d %H:%M:%S,%3N") pid = PROCINFO["pid"] filename = PROCINFO["argv"][0] printf("%s - %d - %s - [%s():%s:%d] - %s\n", timestamp, pid, toupper(level), func_name, filename, line_num, msg) } # 调用示例 log("warn", "this is a warning", "<module>", __LINE__) log("error", "this is an error", "test_func", __LINE__)
内容的提问来源于stack exchange,提问作者Itération 122442
相关产品推荐
相关产品推荐

