15

我将运行以下脚本:

#!/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上面的命令?

4

7 回答 7

10

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

echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to
于 2012-11-16T20:08:27.407 回答
9

If you want to use logger so that the message appears both in the system logs and in some file of yours, you might do

  logger -s your message 2> $HOME/somefile

since the -s option to logger also outputs on stderr which is redirected to the file with 2>

You could want to use 2>> $HOME/somefile to append (not overwrite) your $HOME/somefile (read about bash redirections), and (see logger(1) for details) you may prefer to pass the program option --id=$$ to logger.

于 2012-11-16T20:39:15.340 回答
7

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

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

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

(向@BasileStarynkevitch 和@Kieveli 大声喊叫,他们之前都提到了其中的一部分,而不是整个故事。)

笔记:

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

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

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

为了logger能够直接正确地记录到文件中,它要么必须(重新)实现系统记录器的一些职责,要么将syslog()std. 库函数,或者它不会比一个微不足道的 echo one-liner 更有能力(也许比上面的logger调用更简单!;))。无论哪种方式,这似乎都是个坏主意。

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

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

于 2017-01-14T14:41:06.537 回答
4

我认为您更好的选择是使用该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
于 2014-03-11T12:42:04.213 回答
3
$ man logger

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

如果您希望将内容记录到其他地方,则需要更改您的 syslog 配置。例如,您可以建立一个在您的主目录中具有输出文件的特定设施。不过,您需要成为 root 才能做到这一点。

于 2012-11-16T19:49:41.587 回答
0

您可以在脚本文件的顶部创建一个像这样的小型记录器函数:

#! /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
于 2019-09-16T08:52:09.880 回答
0

我可以使用cat -女巫回显您的输出,然后>> [file]女巫将输出打印到[file]终端的插图,因此命令将是

cat - >> [file]

缺点是你必须使用 ctrl+C 或 ctrl+Z 退出logger对于在线代码更好

于 2019-09-16T11:12:10.857 回答