我将运行以下脚本:
#!/bin/bash
./myprogram
#get exit code
exitvalue=$?
#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue
但我不希望日志消息用/var/log/messages
写,因为我没有root权限。相反,我希望它被写入我的主目录中的文件:/home/myuser/mylog
我应该如何修改上面的logger
命令?
我认为您真的不需要(或想要)为此涉及logger
/syslog
。只需将脚本的最后一行替换为:
echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to
简短的"官方"答案是,不幸的是,你不能。
但是,在大多数情况下(例如,在许多 Linux 发行版上),您可能很幸运地拥有一个既支持--no-act
选项又自行实现一些消息格式的logger
实现(见下文),在这种情况下,您可以使用这样的(适度丑陋)命令来放置 a) 格式正确的消息, b) 到文件, c) 不污染系统日志:
logger --no-act -s "Oh dear..." 2>&1 | sed 's/^<[0-9]+>//' >> /tmp/my.log
(向@BasileStarynkevitch和@Kieveli大喊大叫,他们之前都提到了其中的一部分,只是不是整个故事。
笔记:
1) 为了匹配通常的日志文件格式,我不得不"关闭"<PRIVAL>
字段 (PRIVAL
=FACILITY
* 8 +PRIORITY
),该字段被附加到我的 Debian 盒子的输出前面。您的里程可能会有所不同。
2) POSIX 本身并没有定义logger
命令应该如何处理(任何)其选项。例如,GNU 记录器根本不支持--no-act
。 另外,在 2 年前发布此答案的原始版本时,-s
我的系统上没有对打印输出进行任何格式化,它只是单独回显原始消息,使其完全无用。(我当时没有使用 Systemd,这也许可以解释其中的区别,在记录器源代码中看到各种与 Systemd 相关的条件调用,但这只是模糊的猜测。
3)对于这个琐碎的用例,logger
命令如此"历史上不友好"的最可能原因是它只是一个相当简单的系统记录器前端。这意味着您提供给它的任何内容基本上都直接进入syslogd
(或systemd-journald
等),而,反过来,它会执行各种其他进一步处理和调度(到各种出口:文件、套接字等,本地和远程),以及桥接权限级别(所以在你的示例中,你仍然可以登录到syslog
或user.log
, 例如,即使您可能没有直接写入这些文件的权限)。
为了使logger
能够正确直接登录到文件,它要么必须(重新)实现系统记录器的一些职责,以及syslog()
std.库函数,要么它不会比一个微不足道的echo单行代码更强大(也许不那么复杂,甚至比上面的logger
调用更复杂!;))。无论哪种方式,这似乎都是一个坏主意。
更好的解决方案可能是,如果 POSIX 接口(记录器,syslog())有办法指定一个临时出口/设施参数(如文件名)以及消息,这样就可以记录到自定义文件而无需重新配置系统(普通用户无权这样做)。
然而,由于缺乏更好的东西,"规范"Linuxlogger
实现实际上似乎确实复制了一些系统日志功能,所以我们大多数人都可以免费享受这种奢侈;)。
如果要使用logger
使消息同时显示在系统日志和某些文件中,则可以这样做
logger -s your message 2> $HOME/somefile
因为logger
的-s
选项也在 stderr 上输出,该stderr被重定向到带有2>
的文件
您可能希望使用2>> $HOME/somefile
来附加(而不是覆盖)您的$HOME/somefile
(阅读有关bash
重定向的信息),并且(有关详细信息,请参阅logger(1))您可能更愿意将程序选项--id=$$
传递给logger
。
我认为您更好的选择是使用date
命令,而不是在您不想写入系统日志文件的情况下使用logger
命令(并且
没有权限这样做)。有关如何使用date
在消息前面加上日期并将其写入文件的详细信息,请参阅"回显前的时间戳"。
创建一个如下所示的 bash 函数,调整date
格式字符串以获取所需的内容:
echo_time() {
echo `date +'%b %e %R '` "$@"
}
在 bash 脚本中,您将使用:
echo_time "Your message here" >> ${LOGFILE}
这会将以下内容放入您的${LOGFILE}
文件中:
Mar 11 08:40 your message here
$ man logger
记录器为 syslog(3) 系统日志模块提供了一个 shell 命令接口。
如果您希望系统日志将内容记录到其他地方,则需要更改系统日志配置。例如,您可以建立一个在主目录中具有输出文件的某个工具。不过,你需要是根才能做到这一点。
您可以在脚本文件之上创建一个如下所示的小记录器函数:
#! /bin/bash
#LOG FILE location
log_file=/tmp/mylogfile.log
#the LOG function
LOG()
{
time=$(date '+%Y-%m-%d %H:%M:%S')
echo "$time"" >>> "$1 >>${log_file}
}
message= echo "test logger message"
#to send loggers to your log file use
LOG "my message logged to my log file with timestamp = ""$message"
检查输出 :
head -1 /tmp/mylogfile.log
2019-09-16 14:17:46 >>> my message logged to my log file with timestamp = test logger message
我可以使用cat -
女巫回显您的输出,然后>> [file]
女巫将输出打印到终端的插图[file]
因此命令将是
cat - >> [file]
缺点是您必须使用 ctrl+C 或 ctrl+Z 退出logger
更适合在线代码