如何使用logger命令登录linux中的特定文件?

alw*_*btc 10 bash logging

我将运行以下脚本:

#!/bin/bash
./myprogram

#get exit code
exitvalue=$?

#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue
Run Code Online (Sandbox Code Playgroud)

但我不希望写入日志消息,/var/log/messages因为我没有root权限.相反,我希望它写入我的主目录中的文件:/home/myuser/mylog

我该如何修改logger上面的命令?

twa*_*erg 9

我不认为你真的需要(或想要)涉及logger/ syslog为此.只需将脚本的最后一行替换为:

echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to
Run Code Online (Sandbox Code Playgroud)


Bas*_*tch 8

如果您想使用logger该消息同时出现在系统日志和您的某些文件中,您可以这样做

  logger -s your message 2> $HOME/somefile
Run Code Online (Sandbox Code Playgroud)

因为还可以在stderr输出-s选项被重定向到文件logger2>

您可能希望使用2>> $HOME/somefile附加(而不是覆盖)您的$HOME/somefile(阅读bash重定向),并且(有关详细信息,请参阅logger(1))您可能更愿意将程序选项传递--id=$$logger.

  • 这对我很有用: logger --no-act -s LOG MESSAGE HERE >> test.log 2>&1 (3认同)
  • `2>&1` 将 stderr 重定向到 stdout。除非您也将 stdout 重定向到该文件,否则它不会写入文件。您可以使用 `> the_file 2>&1` 重定向两者,或者,如果您不想保存标准输出,您可以执行 `2> the_file`。我将用后者编辑答案。 (2认同)

Sz.*_*Sz. 7

简短的“官方”答案是,不幸的是,你不能。

但是,在大多数情况下(例如在许多 Linux 发行版上),您可能只是幸运地拥有一个logger既支持该--no-act选项又自己实现一些消息格式的实现(见下文),在这种情况下,您可以使用 (适度丑陋)这样的命令可以将 a) 格式正确的消息,b) 放入文件,c) 不污染系统日志:

logger --no-act -s "Oh dear..." 2>&1 | sed 's/^<[0-9]\+>//' >> /tmp/my.log
Run Code Online (Sandbox Code Playgroud)

(向@BasileStarynkevitch 和@Kieveli 大喊大叫,他们之前都提到过部分内容,只是不是整个故事。)

笔记:

1) 为了匹配通常的日志文件格式,我不得不“关闭”我的 Debian 机器上的输出前面的<PRIVAL>字段 ( PRIVAL= FACILITY* 8 + PRIORITY)。你的旅费可能会改变。

2) POSIX 本身并没有定义logger命令应该如何处理它的(任何)选项。例如,GNU 记录器根本不支持--no-act。另外,2年前发布这个答案的原始版本的时候,-s我的系统上并没有做任何格式的打印输出,它只是呼应了原始消息孤单,使其完全无用。(我当时没有使用 Systemd,这可能可以解释差异,在记录器源代码中看到各种与 Systemd 相关的条件调用,但这只是模糊的猜测。)

3)logger对于这个微不足道的用例,该命令如此“历史上不友好”的最可能原因是它只是系统记录器的一个相当简单的前端。这意味着您提供给它的任何内容基本上都会直接通过syslogd(或systemd-journald等),然后进行各种其他进一步处理和分派(到各种出口:文件、套接字等,本地和远程) ,以及桥接权限级别(因此在您的示例中,您仍然可以登录sysloguser.log,例如,即使您可能没有直接写入这些文件的权限)。

为了logger能够直接正确地登录到文件,它要么必须(重新)实现系统记录器的一些职责,要么必须执行syslog()标准。库函数,或者它不会比一个简单的 echo one-liner 更强大(可能比上面的logger调用更简单!;))。无论哪种方式,这似乎都是一个坏主意。

一个更好的解决方案可能是,如果 POSIX 接口(loggersyslog())有一种方法可以指定一个 ad-hoc 插座/设施参数(如文件名)以及消息,这样就可以在不重新配置系统的情况下登录到自定义文件(普通用户无论如何都无权这样做)。

然而,由于缺乏更好的东西,“规范的”Linuxlogger 实现实际上似乎复制了一些系统日志功能,所以我们大多数人可以免费享受这种奢侈。;)


tgh*_*old 5

我认为您更好的选择是使用该date命令,而不是logger在您不想写入系统日志文件(并且没有权限这样做)的情况下。

有关如何使用日期作为消息前缀并将其写入文件的详细信息,请参阅“回显之前的时间戳”。date

您创建一个如下所示的 bash 函数,调整date格式字符串以获得所需的内容:

echo_time() {
    echo `date +'%b %e %R '` "$@"
}
Run Code Online (Sandbox Code Playgroud)

在您的 bash 脚本中,您可以使用:

echo_time "Your message here" >> ${LOGFILE}
Run Code Online (Sandbox Code Playgroud)

这会将以下内容放入您的${LOGFILE}文件中:

Mar 11 08:40 your message here
Run Code Online (Sandbox Code Playgroud)


Jef*_*and 3

$ man logger
Run Code Online (Sandbox Code Playgroud)

Logger 为 syslog(3) 系统日志模块提供 shell 命令接口。

如果您希望将系统日志记录到其他位置,则需要更改系统日志配置。例如,您可以建立一个在您的主目录中具有输出文件的特定设施。不过,你需要 root 才能做到这一点。