用户空间程序应该在哪里保存日志?


23

我正在编写一个我想没有特权运行的脚本。我希望脚本遇到的错误被记录到某些日志文件中。我没有特权写信给/var/log。而且我不想在我的主目录中有一个。

用户空间脚本可以在其中记录运行时信息的位置吗?在/var/log不产生任何潜在安全问题的情况下,使我的脚本记录信息的最佳实践是什么?我不愿意在脚本上设置uid / gid。

Answers:


8

您不能以普通用户的身份写入/ var / log,但是syslog守护程序会为您执行此操作。如果您想将消息记录到标准系统日志中(例如/var/log/syslog),则4.4BSD实用程序logger可能在您的系统上可用。它默认安装在Debian上,并且bsdutils在Debian派生软件包中。

您将获得任何预先存在的日志轮转,维护和监视工具的优点,其缺点是需要特权来读取系统日志,并且需要将脚本的消息与其他程序的消息混合在一起。

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

有几个可用的配置选项。您可以在中阅读更多内容man logger


该实用程序有语言绑定吗?宁愿不为stdout应用内的每一行生成子流程。
ThorSummoner

@ThorSummoner:作为吉尔的回答说,syslog是一个C库函数和C ++可以任何C使用调用extern "C"。其他语言通常提供对任何C的泛型绑定或对特定事物的绑定,但这取决于语言。
dave_thompson_085 '17

12

如果您作为普通用户决定运行程序,则其日志的自然位置位于您的主目录中。您的主目录用于存储所有文件,无论它们是您运行的程序的日志还是其他任何文件。

如果该程序是作为系统的一部分执行的,并且以通常专用的系统用户身份运行,则其日志的自然位置为/var/log。创建一个子目录/var/log/myapp并为其赋予适当的权限,以便您的应用程序可以在其中写入。

如果相关并且您的操作系统允许,请将日志文件标记为仅追加。只有root可以执行此操作。这样做的好处是,如果您的应用程序受到威胁,它将无法删除过去的日志,这对于对威胁的取证分析非常有用。您将需要root的干预来旋转日志:chown这样应用程序将无法再打开rename日志文件,日志文件,创建具有适当所有权的新的仅追加文件,然后通知应用程序打开新的空文件。

您可以通过调用logger(1)或将任何应用程序日志写入系统日志syslog(3)


4

通常,对于守护程序,将通过创建日志文件root然后更改权限,以便非特权用户可以写入该文件。logrotate然后设置为在轮换期间保留权限。

如果是命令而不是守护程序,则登录/tmp(最好使用mktemp)并通过STDOUT日志的位置通知用户。


好主意。我的〜/ .profile中有几行内容,以检查dropbox恶魔是否正在运行,如果没有运行,请启动它。我正在考虑添加一个,&以避免出现提示提示,但开始将dropbox写入控制台。我目前正在将其输出重定向到/dev/null,但是如果Dropbox无法启动,则想用某种方法进行调试。
卢勋爵。

1
结帐daemonize
bahamat

要知道,“权限被更改,以便非特权用户可以写入它”。这是通过简单的chmod 666完成的吗?还是我必须将用户添加到组中?
卢勋爵。

在/ var / tmp下更好,/ tmp 不能保证在引导后仍然有效。
vonbrand

@LordLoh .:是的chmod。通常,06440664,并且用户/组的所有权也更改为预期向其写入的守护程序的所有权。
bahamat

3

我对用户空间程序的印象是默认情况下会丢弃日志。我见过各种程序都可以随意转储日志,在我的系统上从来没有特别欢迎它。倾向于在除非/直到它变得巨大之前从未发现过的某个地方聚集。

我希望有一个适合他们的地方,我正在我的系统上玩耍,试图为他们找到一个稳定的地方。

我的第一个想法是使用/var/run/user/$UID/log,但是发现在我的系统上这是TMPFS挂载,不够大,或者真的很适合与日志一起使用。

为他们创造一个地方

由于我对/ var / run / user的理解不够充分,无法与之集成,因此我选择手动模拟1000用户。

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

我建议坚持使用FHS / var / log spc作为该文件夹中的结构,但该规范为自由格式,因此没有太多要遵循的规范。

Logrotate配置

您的系统提供的此目录上没有现有的日志轮换,我建议为您的系统创建一个:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

以下是我之前的/ var / run / user / 1000 / log帖子,除非您真的知道自己在做什么,否则我不建议您这样做(如果这样做,请告诉我怎么做!)

也许如下,但我只是弥补了这一点,因为这对我来说很有意义。

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

与/ var / log / user / 1000集成:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.