我在 ubuntu 16.04 上运行 docker 并想查看日志。但是,在我猜测是某种轮换或日志增长到一定大小后,我无法查看日志。
我没有对我的 journald.conf 做任何更改,所以我在那里使用默认值。有容器在运行,所以 docker 日志输出了相当多的数据。
我所看到的示例:
systemctl docker status
确认服务已激活:
since Thu 2016-10-13 18:56:28 UTC
Run Code Online (Sandbox Code Playgroud)
但是,当我运行类似的东西时:
journalctl -u docker.service --since "2016-10-13 22:00"
Run Code Online (Sandbox Code Playgroud)
我得到的唯一输出是:
-- Logs begin at Fri 2016-10-14 01:18:49 UTC, end at Fri 2016-10-14 16:18:25 UTC. --
Run Code Online (Sandbox Code Playgroud)
我可以按预期查看该范围内的日志。
我的问题是:为什么我不能使用 journalctl 查看旧日志,我该如何解决这个问题以便查看日志?
我在 Ubuntu 16.04 LTS 中运行用户级服务。例如,我的 test.service 位于~/.config/systemd/user/test.service
.
我能够通过这样做来运行服务
systemctl --user start test.target
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用 读取其日志时journalctl
,收到以下错误消息:
journalctl --user -u test.service
Hint: You are currently not seeing messages from other users and the system.
Users in the 'systemd-journal' group can see all messages. Pass -q to
turn off this notice.
No journal files were opened due to insufficient permissions.
Run Code Online (Sandbox Code Playgroud)
如何journalctl
用于用户的特定单位?
我对此特别感兴趣,因为它可以查看在计时器上运行的 oneshot 服务的输出。该--unit
标志很接近,但它将服务的所有运行连接在一起。我能想到的最明显的方法是过滤 PID,但这让我担心 PID 重用/分叉的服务,并且获取最后一个 PID 非常不方便。是否有其他标识符与服务的单次运行相对应,我可以用来过滤日志?
编辑:如果这是真正的答案,我很乐意接受权威的“不”。
journalctl
没有颜色的输出确实看起来很乱。是否可以为其输出添加颜色?在我的系统上,似乎只有重要的行被突出显示。甚至dmesg
可以通过添加--color
开关来输出颜色!
journald 文档说将用户添加到“systemd-journal”组或“adm”组允许用户访问系统范围的日志。
我正在运行最新的 CentOS 7,但我似乎无法以非 root 用户身份访问日志。
这是我的配置:
$ id
uid=1000(centos) gid=1000(centos) groups=1000(centos),4(adm),10(wheel),190(systemd-journal) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ cat /etc/systemd/journald.conf
[Journal]
Storage=persistent
$ journalctl
-- Logs begin at Sat 2015-08-29 16:35:52 UTC, end at Sat 2015-08-29 17:28:47 UTC. --
Aug 29 16:35:52 hostname ... <log continues>
Run Code Online (Sandbox Code Playgroud)
journalctl 输出中没有系统日志。这是我的权限配置:
$ ll -a /var/log/journal/f9afeb75a5a382dce8269887a67fbf58/
total 24592
drwxr-xr-x. 2 root root 4096 Aug 29 16:35 .
drwxr-xr-x. 3 root root 4096 Aug 29 17:28 ..
-rw-r-----. 1 root root 16777216 Aug 29 17:27 system.journal
-rw-r-----+ 1 …
Run Code Online (Sandbox Code Playgroud) journalctl看起来是一个很好的查看日志的工具,但我被困在一个简单的问题上:我想查看包含短语的所有 cron 消息update-ipsets
。
我当然可以这样做
journalctl -u cron.service | grep update-ipsets
Run Code Online (Sandbox Code Playgroud)
但是随后您将失去 journalctl 输出的所有其他好处(颜色编码、自动分页、实时取景等)
我试过了:
journalctl -u cron.service MESSAGE=update-ipsets
journalctl -u cron.service "MESSAGE=*update-ipsets*"
journalctl -u cron.service "MESSAGE=.*update-ipsets.*"
journalctl -u cron.service "MESSAGE=/.*update-ipsets.*/"
Run Code Online (Sandbox Code Playgroud)
而且您不想通过点击tab后进行实验MESSAGE=
- 挂起(zsh / Debian Jessie)shell并且Ctrl-C也没有帮助!
我有点不敢相信它没有内置这个基本功能,所以我确定我一定错过了什么?
谢谢。
journalctl
允许我过滤优先级 ( -p
) 并对输出中的优先级进行颜色编码。但是有没有办法让它直接输出优先级,作为文本?
/var/log/journal
不小心删除了我的后,我无法从后果中恢复过来。systemd-journald
每次我尝试启动它时都会一遍又一遍地失败。当我运行时:
$ journalctl --verify
PASS: /run/log/journal/system.journal
Run Code Online (Sandbox Code Playgroud)
这并没有让我更接近解决它,因为它/run/log/journal/system.journal
是在我/usr/lib/systemd/systemd-journald
直接运行时创建的,它自己输出
$ /usr/lib/systemd/systemd-journald
Failed to open runtime journal: Invalid argument
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的事情:
/var/log/journal and
/run/log/journal`。/var/log/journal
从另一台机器复制到两条路径,运行journalctl --verify
检查它们,并再次使用--file
标志。/etc/systemd/journald.conf
为Storage=volatile
只是禁用/var/log/journald
.我定义了几个 systemd 服务。它们同时记录到磁盘和 systemd 日志,我可以使用journalctl -n 0 -fu myservice
. 但是,我注意到我从 journalctl tail 命令看到的日志通常比磁盘日志晚几分钟。我已经确认这与守护程序使用的实际日志记录配置无关,因为当我手动运行守护程序并将其日志输出到控制台上的标准输出时,我会立即看到日志。
如何在服务生成日志时立即查看 journalctl 的日志输出?完全无缓冲或行缓冲都是可以接受的。
好吧,我有一个配置了systemctl的服务。这是配置文件:
[Unit]
Description=The description of the service (:
After=network.target
[Service]
ExecStartPre=/bin/echo 'Starting Service' >> /var/log/node/myapp.log
ExecStart=/root/.nvm/versions/node/v5.0.0/bin/node ./bin/www
ExecStopPost=/bin/echo 'Stopping Service' >> /var/log/node/myapp.log
Restart=always
#StandardOutput=/var/log/node/myapp.log
#StandardError=/var/log/node/myapp.log
SyslogIdentifier=myapp
Environment=NODE_ENV=production
WorkingDirectory=/home/user/node-apps/theapp
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
我需要的?:
1)ExecStartPre
和ExecStopPost
可以写入消息'starting service'
或写入'stopping service'
文件/var/log/node/myapp.log
。用上面的配置,不起作用,它只输出'Starting Service' >> /var/log/node/myapp.log
and 'Stopping Service' >> /var/log/node/myapp.log
to journalctl
。(我检查过journalctl -u myapp
)
2)我需要的是,而不是应用程序的所有日志,输出到journalctl
, 可以输出到文件。例如:/var/log/node/myapp.log
。我的意思是,如果在我的应用程序中,我有一个console.log()
,这可能在那里。
使用upstart,我可以这样做:
script
exec start-stop-daemon --start --make-pidfile --pidfile /var/run/upstart-yourapp.pid …
Run Code Online (Sandbox Code Playgroud) journalctl ×10
systemd ×8
journald ×5
logging ×2
systemctl ×2
ubuntu-16.04 ×2
permissions ×1
ubuntu ×1