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

Lor*_*oh. 40 scripting logs directory-structure not-root-user

我正在编写一个我想在没有特权的情况下运行的脚本。我希望将脚本遇到的错误记录到某个日志文件中。我没有权限给/var/log. 我不想在我的主目录中有一个。

是否有用户空间脚本可以记录运行时信息的位置?在/var/log不产生任何潜在安全问题的情况下获取我的脚本日志信息的最佳做法是什么?我对在脚本上设置 uid / gid 犹豫不决。

Gil*_*il' 19

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

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

如果相关且您的操作系统允许,请将日志文件标记为仅附加。只有 root 可以做到这一点。这样做的好处是,如果您的应用程序遭到入侵,它将无法擦除过去的日志,这对于入侵的取证分析非常有用。您将需要 root 的干预来轮换日志:chown以便应用程序无法再打开rename日志文件,日志文件,创建一个具有适当所有权的新的仅附加文件,然后通知应用程序打开新的空文件.

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

  • 这是将日志文件标记为仅追加的方法:[https://unix.stackexchange.com/q/59864/68851](https://unix.stackexchange.com/q/59864/68851) (2认同)

Jan*_*der 12

您不能以普通用户的身份写入 /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
Run Code Online (Sandbox Code Playgroud)

有几个可用的配置选项;你可以阅读更多man logger


bah*_*mat 6

通常对于守护进程,日志文件是由 root那时然后权限被更改,以便非特权用户可以写入它。logrotate然后设置为在轮换期间保留权限。

如果它是一个命令,而不是一个守护进程,那么登录/tmp(最好使用mktemp)并通过STDOUT日志的去向通知用户。


Tho*_*ner 6

我的印象是用户空间程序默认会丢弃日志。我见过各种程序随心所欲地转储日志,而且它在我的系统上从来都不是特别受欢迎;倾向于在某个从未被注意到的位置堆积,除非/直到它变得巨大。

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

我的第一个想法是使用/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
Run Code Online (Sandbox Code Playgroud)

我建议坚持FHS /var/log spc用于此文件夹中的结构,但规范是自由格式的,因此没有太多需要遵守的。

对数旋转配置

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

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}
Run Code Online (Sandbox Code Playgroud)

下面是我之前的 /var/run/user/1000/log 帖子,除非你真的知道你在做什么,否则我不会推荐它(如果你知道,也告诉我怎么做!)

也许如下,但我只是编造了这个,因为它对我来说很有意义。

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log
Run Code Online (Sandbox Code Playgroud)

与 /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
Run Code Online (Sandbox Code Playgroud)