StandardOutput
我有一项配置为记录到日志位置的服务。有些用户在收集日志数据时可能会删除日志路径。如果我重新启动服务并且路径不存在,我的服务将失败。有办法解决吗?按优先顺序排列的解决方案是
[Unit]
Description=Some service
[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:<path_to_logs>/service-stdout.log
[Install]
WantedBy=default.target
- 创建记录 StandardOutput 的路径。使用 StartExecPre 和我的服务脚本本身尝试过此操作,但没有成功。
ExecStartPre=mkdir -p <path_to_logs>
忽略该路径不存在并继续而不记录任何内容。
登录到默认位置。试图在日志中找到输出,但我根本没有看到它。如果服务中没有指定StandardOutput参数,是否真的默认记录?
提前致谢
答案1
append:path 与上面的 file:path 类似,但它以附加模式打开文件。
file:path 选项...如果路径引用文件系统上的常规文件,则将其打开(如果尚不存在则创建)...
所以该文件不需要存在。但它所在的目录可能确实需要存在。
有几种方法可以确保您的日志目录存在:
- 如果您的软件已打包,请
mkdir -p /var/log/...
在postinst
.这将创建一个持久目录。这是微不足道的,所以我不会详细说明。 - tmp文件.d。这将确保该目录存在。如果它被删除(或存在于 tmpfs 上),它将在下次启动时重新创建。这就是 systemd 的保证
/run/log/journal
和/var/log/journal
存在方式。 LogsDirectory=
可用于在启动设备时创建日志目录。- 路径单位。您可以创建一个名为“myservice.path”的全新单元,它确保在启动时创建目录并监视该目录。当该目录被删除时,该单元可以触发服务运行
mkdir -p
以重新创建它。
临时文件.d:
如果你想:
[Service]
StandardOutput=append:/var/log/myservice/log.log
然后创建这个文件:
# /etc/tmpfiles.d/myservice.conf
#Type Path Mode User Group Age Argument
d /var/log/myservice 0755 root root - -
在这种情况下,您的用户可以读取此目录,但无法删除它(没有管理员权限)。如果被删除,可以通过重新启动systemd-tmpfiles-setup.service
或重新启动来重新创建。
日志目录=
man tmpfiles.d
说:
系统守护进程经常需要私有运行时目录...对于这些,如果不需要 tmpfiles.d 提供的灵活性,最好在其单元文件中使用 RuntimeDirectory= (有关详细信息,请参阅 systemd.exec(5) )。优点是该单元所需的配置集中在一处,并且目录的生命周期与服务本身的生命周期相关。同样,..., LogsDirectory=, ... 应该用于在 ... /var/log/ 下创建目录 ... tmpfiles.d 应该用于生命周期独立于任何服务或需要更复杂配置的文件。
因此,最好使用LogsDirectory=
。
优点之一是,如果您的用户删除该目录,则每当服务重新启动时都会自动创建该目录。
这是一个例子:
[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:/var/log/myservice/service-stdout.log
LogsDirectory=myservice
该目录的路径也可以作为环境变量提供给您的服务$LOGS_DIRECTORY
。
此解决方案的缺点是您假设您的目录将始终以/var/log
.在某些沙盒配置中(可能在使用时DynamicUser=
)或者将此设备移至总线时,情况可能并非如此--user
。
答案2
如果您正在日志中查找日志,则需要将 stdout 设置为 syslogStandaedOutput=syslog
并rsyslog
使用以下命令重新启动服务systemctl restart rsyslog
参考这个——https://stackoverflow.com/questions/37585758/how-to-redirect-output-of-systemd-service-to-a-file