Fish Shell:
日志记录

如何操作:

在 Fish 中,记录日志可以像重定向标准输出和错误流到文件一样简单。让我们为脚本的开始和结束时间制作一个日志条目。

function log_start
  echo (date "+%Y-%m-%d %H:%M:%S") " - 脚本开始" >> my_app.log
end

function log_end
  echo (date "+%Y-%m-%d %H:%M:%S") " - 脚本结束" >> my_app.log
end

log_start
# ... 你脚本的任务 ...
log_end

cat my_app.log

my_app.log 中你会看到:

2023-04-01 10:35:47  - 脚本开始
2023-04-01 10:36:02  - 脚本结束

为了高级日志记录,你可以使用带参数的函数记录日志级别和信息:

function log_message --argument message
  switch "$argv[1]"
    case 'INFO' 'WARN' 'ERROR'
      set log_level $argv[1]
    case '*'
      set log_level 'DEBUG'
  end
  set log_msg (string join " " $argv[2..-1])
  echo (date "+%Y-%m-%d %H:%M:%S") "[$log_level]" $log_msg >> my_app.log
end

log_message INFO "这是一条信息性消息。"
log_message ERROR "出了些问题!"

my_app.log 的示例输出将会是:

2023-04-01 10:35:47 [INFO] 这是一条信息性消息。
2023-04-01 10:35:49 [ERROR] 出了些问题!

深入探讨

在历史上,在 shell 脚本中进行日志记录通常是通过许多 echo 语句完成的,而这个方法当然仍然是可行的,但实现更复杂的系统可能会是一个挑战。Fish 没有像其他一些 shell 或编程语言那样内置的日志记录机制,所以你通常需要自己创建。

Fish 的内置 echo 命令的替代方法包括 Unix 工具,如 sysloglogger,它们与系统日志守护进程接口,为记录系统范围内的事件提供了更集成的方法。

Fish 的简简单单使你能够创建函数来处理日志记录的详细程度,设置不同的级别,你可以开启或关闭。有些实现甚至可以包括脚本名称、行号和时间戳,这使得追溯到事件的过程变得更加容易。

参见

  • Fish Shell 文档关于编写函数的部分:https://fishshell.com/docs/current/#syntax-function
  • 基础 Shell 脚本编写技巧:https://developer.ibm.com/tutorials/l-lpic1-103-4/
  • Syslog 协议指南:https://tools.ietf.org/html/rfc5424