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

时间:2012-11-16 19:40:44

标签: 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

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

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

7 个答案:

答案 0 :(得分:9)

我认为你真的不需要(或想要)涉及logger / syslog。只需用以下代码替换脚本的最后一行:

echo "Exit code of my program is $exitvalue" >> /some/file/that/you/can/write/to

答案 1 :(得分:4)

我认为你更好的选择是使用date命令,而不是logger,如果你不想写入syslog文件(并且没有这样做的权限) )。

有关如何使用date为邮件添加日期并将其写入文件的详细信息,请参阅“timestamp before an echo”。

您创建一个类似于以下内容的bash函数,调整date格式字符串以获得您想要的内容:

echo_time() {
    echo `date +'%b %e %R '` "$@"
}

在bash脚本中,您将使用:

echo_time "Your message here" >> ${LOGFILE}

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

Mar 11 08:40 your message here

答案 2 :(得分:3)

$ man logger
  

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

如果您希望将内容记录到其他位置,则需要更改系统日志配置。例如,您可以在主目录中建立一个具有输出文件的 facility 。不过,你需要成为root用户。

答案 3 :(得分:3)

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

  logger -s your message 2> $HOME/somefile

,因为-s的{​​{1}}选项也会在 stderr 上输出,并将其重定向到logger

的文件

答案 4 :(得分:3)

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

但是,在大多数情况下(例如在许多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)为了匹配通常的日志文件格式,我必须“关闭”获得的<PRIVAL>字段(PRIVAL = FACILITY * 8 + PRIORITY)在我的Debian盒子上添加了输出。您的里程可能会有所不同。

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

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

要使logger能够直接正确登录文件,它必须(重新)实现系统记录器的一些职责,以及syslog() std。库函数,或者它不会比一个简单的回声单行(比上面的logger调用更复杂,甚至更复杂!))。无论哪种方式,这似乎是一个坏主意。

更好的解决方案是,如果POSIX接口(loggersyslog())有办法指定ad-hoc outlet / facility参数(如文件名)以及消息,那么可以在不重新配置系统的情况下登录自定义文件(普通用户无权做任何事情)。

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

答案 5 :(得分: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

答案 6 :(得分:0)

我可以使用cat -巫婆回显您的输出,然后>> [file]巫婆将输出打印到终端的[file]内嵌件中,这样命令就可以了

cat - >> [file]

不利的一面是您必须使用ctrl + C或ctrl + Z退出logger,这对于在线代码来说更好