我有一个应用程序在 Ubuntu 16.04 中注册为服务
如果我输入:
journalctl -u myapp.service
我可以查看我的应用程序的日志。
我正在将我的应用程序移动到一个新的虚拟机,其中将提供相同的服务。是否可以将日志文件迁移到新的虚拟机,以便在我键入时journalctl -u myapp.service
它将无缝显示我的所有旧日志和任何新日志?
我尝试将旧 /var/log/journal 目录的内容交换到新虚拟机中,并重新启动 systemd-journald 服务,但似乎不起作用。
更多细节:
- 日志存储在 /var/log/journal/<machine-id>/
- 目录内容如下所示:
$ ls /var/log/journal/05b6b1e76c6040cc99b4d34977a98eca/ [电子邮件受保护]~ [电子邮件受保护]~ [电子邮件受保护]~ [电子邮件受保护]〜系统@9b08b416ae4c47a78c24b4ed77c39ea2-0000000000000001-0005b3c2d1380bae.journal系统@9b08b416ae4c47a78c24b4ed77c39ea2-0000000000000248-0005b ccbf3f7d7c1.journal 系统@e5c655526bb54aa886764039cd37f897-0000000000000001-0005c4ce02f66caf.journal 系统.journal[电子邮件受保护]~ [电子邮件受保护]~ [电子邮件受保护]~ [电子邮件受保护]~ user-1000@7b4df282ccfe4816a30db088f2621493-00000000000000ab-0005b3c2d1be9c3b.journal user-1000.journal
- /run/log/ 中没有文件
- 新旧 VM 共享相同的服务、服务运行用户和计算机 ID(这是因为最终两个 VM 都源于(复制自)同一个 VM,只是在不同时间且具有较小的软件/配置设置)
- 我使用“ubuntu”访问日志的用户在两个虚拟机中具有相同的组:
$ 组
ubuntu adm dialout cdrom 软盘 sudo 音频dip 视频plugdev netdev lxd
- 两个虚拟机上的日志版本是:
$journalctl --版本
系统229
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN
- 我不希望保留日志的时间超过日志设置中配置的时间
什么在起作用
- 完全替换日志文件夹的内容
- 将文件所有权调整为 root:systemd-journal 像原来一样
- “root”现在可以看到完整的日志
- “ubuntu”只能看到一些“当前”日志,这很令人困惑,因为它们不是复制过来的
答案1
您将找到其关系的所有条目都对应于给定主机的日志journalctl -u <myapp.service>
内容。systemd
然而(来自man journalctl
):
所有可访问的日志文件的输出都是交错的,无论它们是轮换的还是当前正在写入的,也无论它们是属于系统本身还是可访问的用户日志。
这个问题可能归结为这样一个事实:在“新虚拟机”(例如远程 PaaS,甚至本地主机上的虚拟机)上,您$USER
在该虚拟机上可能无法访问除他/她自己的私人日记之外的任何内容。对于任何其他期刊(假设您迁移的日志文件位于正确的位置),您$USER
将需要成为一些特殊授权组的一部分或成为 root。
$USER
这将适用于任何导入的日记文件,因为这些文件在新主机上不会被识别为您的私人日记。特殊组包括systemd-journal
、adm
、 和wheel
。 Ubuntu 可能还包括其他的。
要访问您迁移的文件,您应该开始确定那:
您将日记迁移到 中的单一中央日记
/{run,var}/log/journal/
。我不确定您的 Ubuntu VM 上的哪个路径/run
或哪个/var
路径开始;你必须亲自看看。无论如何,请通过$ man 5 journald.conf
在终端中发出命令来查看journald.conf(5)。您会发现您的文件可能位于:/run/log/journal/machine-id/*.journal, /run/log/journal/machine-id/*.journal~, /var/log/journal/machine-id/*.journal, /var/log/journal/machine-id/*.journal~
来自 Ubuntu 手册页:
systemd-journald
/run/log/journal/machine-id/
将条目写入带有“.journal”或/var/log/journal/machine-id/
“.journal”后缀的文件。如果守护进程不正常停止,或者发现文件已损坏,则会使用“.journal~”后缀重命名它们,并systemd-journald
开始写入新文件。
[...]在不可用或在 VM 的配置文件中设置时
/run/...
使用。/var/log/journal
Storage=volatile
/etc/systemd/journald.conf
- 您的虚拟机
$USER
是该组的成员wheel
(例如)。
其他建议和步骤可能适用,但我没有足够的信息来继续操作。请在评论中报告,以便我可以在需要时完成此答案。