You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:05:32