问题
我定期遇到 /var/log/syslog 为空的问题。
$ ls /var/log/syslog
-rw-r----- 1 root adm 0 Dez 31 06:29 /var/log/syslog
环境和已安装的软件包
我正在使用 Debian Jessie。
Aptitude 显示我已经安装了软件包inetutils-syslogd以及包rsyslog未安装。
分析
我尝试使用以下命令来查找问题:
$ service syslog start
Job for syslog.socket failed. See 'systemctl status syslog.socket' and 'journalctl -xn' for details.
Failed to start syslog.service: Unit syslog.service failed to load: No such file or directory.
$ systemctl status syslog.socket
* syslog.socket - Syslog Socket
Loaded: loaded (/lib/systemd/system/syslog.socket; static)
Active: inactive (dead)
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/syslog
Listen: /run/systemd/journal/syslog (Datagram)
Mär 07 12:18:02 viathinksoft.de systemd[1]: Socket service syslog.service not loaded, refusing.
Mär 07 12:18:02 viathinksoft.de systemd[1]: Failed to listen on Syslog Socket.
$ systemctl status syslog.service
* syslog.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)
临时解决方案
我发现有一项服务叫做rsyslog,这破坏了我的正常 syslog 服务。但我的系统上没有安装 rsyslog,所以我不知道发生了什么,也不知道如何才能永久删除 rsyslog。
$ systemctl status rsyslog.service
* rsyslog.service - LSB: enhanced syslogd
Loaded: loaded (/etc/init.d/rsyslog)
Active: active (exited) since Di 2016-02-09 02:42:03 CET; 3 weeks 6 days ago
$ aptitude remove rsyslog
Es werden keine Pakete installiert, aktualisiert oder entfernt.
0 Pakete aktualisiert, 0 zusätzlich installiert, 0 werden entfernt und 0 nicht aktualisiert.
0 B an Archiven müssen heruntergeladen werden. Nach dem Entpacken werden 0 B zusätzlich belegt sein.
作为临时解决方案,我正在运行以下命令:
$ service rsyslog stop
$ dpkg-reconfigure inetutils-syslogd
然后它就会起作用。几个星期……
我该怎么做才能永久解决这个问题?
答案1
我定期遇到 /var/log/syslog 为空的问题。
检查“/etc/syslog/syslog.conf”中的 syslog 配置文件,并相应地指定日志目的地。
我发现有一个名为 rsyslog 的服务破坏了我的正常 syslog 服务。但我的系统上没有安装 rsyslog,所以我不知道发生了什么,也不知道如何永久删除 rsyslog。
rsyslog 是系统中默认的日志服务器,您可以在“/etc/rsyslog.conf”中找到它的配置文件。不要试图删除它,只需通过执行“systemctl disable rsyslog”禁用 rsyslog 守护进程,这样下次启动时它就不会自动重新启动。
答案2
syslog.socket 的详细信息(https://cgit.freedesktop.org/systemd/systemd/plain/units/syslog.socket)对正在发生的事情做出一些解释:
[Unit]
Description=Syslog Socket
Documentation=man:systemd.special(7)
Documentation=http://www.freedesktop.org/wiki/Software/systemd/syslog
DefaultDependencies=no
Before=sockets.target shutdown.target
# Don't allow logging until the very end
Conflicts=shutdown.target
[Socket]
ListenDatagram=/run/systemd/journal/syslog
SocketMode=0666
PassCredentials=yes
PassSecurity=yes
ReceiveBuffer=8M
# The default syslog implementation should make syslog.service a
# symlink to itself, so that this socket activates the right actual
# syslog service.
#
# Examples:
#
# /etc/systemd/system/syslog.service -> /lib/systemd/system/rsyslog.service
# /etc/systemd/system/syslog.service -> /lib/systemd/system/syslog-ng.service
#
# Best way to achieve that is by adding this to your unit file
# (i.e. to rsyslog.service or syslog-ng.service):
#
# [Install]
# Alias=syslog.service
#
# See http://www.freedesktop.org/wiki/Software/systemd/syslog for details.
有关它的一些讨论可以在以下网址找到:https://www.freedesktop.org/wiki/Software/systemd/syslog/。
syslog.socket 单元是一个通用单元,它(实际上)只是确保存在一个套接字,以便 journald 在需要时与 syslog 守护进程通信。
从更实际的角度来看,journald 使用 /run/systemd/journal/syslog 来桥接 syslog(任何 syslog 实现),并且 syslog.socket 将该路径链接到操作系统的默认 syslog。
在您的情况下,系统使用 rsyslog 来提供 syslog 实现。
那么你应该有一个 syslog.service,它实际上是指向 rsyslog.service 的指针。或者,换句话说,您可能应该考虑保留 rsyslog 启用状态 ( sudo systemctl enable rsyslog.service
),除非您有特定原因想要使用其他 syslog 实现。如果您这样做,那么您只需要将该 syslog 的服务文件链接到 syslog.service。
或者,您可以为您首选的系统日志创建一个插件,其中包含:
[Install]
Alias=syslog.service
看https://coreos.com/os/docs/latest/using-systemd-drop-in-units.html(例如)了解有关 drop-ins 的更多信息。
答案3
在我的情况下,Ubuntu 16.04.3 LTS 服务器我已经解决了
sudo chown syslog:adm /var/log/syslog
rsyslog
已启动并运行:
$ sudo systemctl status rsyslog.service
* rsyslog.service - System Logging Service
Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2018-06-30 03:52:25 -03; 2 days ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 90 (rsyslogd)
原因似乎出在文件的所有权上,应该是syslog
而不是root
。无法找到错误报告。