systemd-journald和History日志笔记
Linux systemd-journald 日志与 Bash History 完全指南
一、/var/log/journal 是什么?
/var/log/journal 是 systemd-journald 服务存放结构化系统日志的目录。它是 Linux 系统事件的中央数据库。
记录的内容
几乎所有系统层面的操作都会被记录:
- 内核报错、硬件异常
- 用户登录、登出(SSH、本地)
- 服务启动、停止、崩溃
- 程序错误输出
- 网络连接变化
- 系统安全事件
查看方式
# 查看所有日志
journalctl
# 查看最近 1 小时的日志
journalctl --since "1 hour ago"
# 查看特定服务的日志
journalctl -u ssh.service
# 查看内核日志
journalctl -k
# 查看日志占用空间
journalctl --disk-usage二、/var/log/journal 是必须的吗?
不是绝对必须,但强烈建议保留。
保留的理由
| 场景 | 重要性 |
|---|---|
| 排查程序闪退、系统报错 | ⭐⭐⭐⭐⭐ 核心工具 |
| 安全审计(异常登录、关键操作) | ⭐⭐⭐⭐⭐ |
| 服务调试(查看实时输出) | ⭐⭐⭐⭐ |
| 性能问题定位 | ⭐⭐⭐⭐ |
关闭的后果
- 系统故障时,没有任何日志可查
- 安全事件无法追溯
- 技术支持/社区求助时无法提供日志
比喻:就像飞机没有黑匣子——能飞,但出事就傻眼。
三、如何减少或关闭日志?
方案一:限制大小(推荐)
编辑 /etc/systemd/journald.conf:
[Journal]
Compress=yes
SystemMaxUse=120M # 持久日志总大小上限
SystemMaxFileSize=30M # 单个日志文件大小
SystemMaxFiles=4 # 最多保留文件数
RuntimeMaxUse=20M # 运行时日志上限(内存)
MaxRetentionSec=2day # 最长保留 2 天生效命令(无需重启服务器):
systemctl restart systemd-journald
journalctl --vacuum-size=120M方案二:关闭持久化(日志只存内存)
[Journal]
Storage=volatile生效命令:
systemctl stop systemd-journald
rm -rf /var/log/journal/*
systemctl start systemd-journald效果:重启后所有历史日志丢失,不占用磁盘空间。
方案三:彻底关闭(不推荐)
[Journal]
Storage=none三种方案对比
| 方案 | 占用空间 | 重启后日志 | 排查能力 | 推荐度 |
|---|---|---|---|---|
| 限制大小 | 固定上限 | 保留 | 完整 | ⭐⭐⭐⭐⭐ |
| 易失存储 | 0(仅内存) | 丢失 | 仅当前 | ⭐⭐⭐ |
| 完全关闭 | 0 | 无日志 | 无法排查 | ⭐ |
四、history 命令历史存在 /var/log/journal 里吗?
不存在。 两者是完全独立、不同层级的系统。
对比表
| 对比项 | history 历史 | /var/log/journal 日志 |
|---|---|---|
| 存储位置 | ~/.bash_history(用户目录) | /var/log/journal/(系统目录) |
| 记录内容 | 用户输入的 shell 命令 | 系统事件、服务日志、内核消息 |
| 归属 | 用户级别(每个用户独立) | 系统级别(所有进程共享) |
| 查看方式 | history 命令 | journalctl 命令 |
| 主要用途 | 用户回顾/复用命令 | 系统故障排查、安全审计 |
各用户的 history 文件位置
/root/.bash_history # root 用户
/home/用户名/.bash_history # 普通用户history 工作流程(重要)
flowchart LR
A[终端启动] --> B[从 .bash_history 读取<br/>历史到内存]
B --> C[输入命令<br/>暂存在内存]
C --> D[正常退出终端<br/>exit 或 logout]
D --> E[内存中的命令<br/>追加写入 .bash_history]关键点:
- 当前终端的命令不立即写入文件
- 正常退出终端时才写入
- 直接关闭窗口可能导致最后几条命令丢失
常用 history 管理命令
history # 查看历史(内存+文件)
cat ~/.bash_history # 查看文件原始内容
history -a # 立即将内存命令写入文件
history -c # 清空当前终端内存历史五、想集中记录命令历史到 systemd 日志?
可以通过配置实现(用于审计,但会显著增加日志量):
# 在 ~/.bashrc 中添加
export PROMPT_COMMAND='history -a >(logger -t "bash_history_$(whoami)")'
# 或使用 auditd
auditctl -a always,exit -S execve -k shell_commands根据你的 128M /var/log 分区,不建议开启。
六、实践案例:128M 分区配置
环境信息
- 系统:Linux armv7l
/var/log:128M zram 压缩内存盘- 初始问题:不到一天使用率 100%
诊断命令
# 查看磁盘使用
df -h /var/log
# 查看日志详细占用
du -sh /var/log/* 2>/dev/null | sort -h典型输出:
121M /var/log/journal # ← 主要占用
276K /var/log/wtmp
100K /var/log/lightdm
28K /var/log/auth.log
...其他小文件最终推荐配置
[Journal]
Compress=yes
SystemMaxUse=120M
# SystemKeepFree=100M # 注释掉!小分区不要用
SystemMaxFileSize=30M
SystemMaxFiles=4
RuntimeMaxUse=20M
# RuntimeKeepFree=50M # 注释掉
RuntimeMaxFileSize=10M
MaxRetentionSec=2day关键配置陷阱
| 错误配置 | 问题 |
|---|---|
SystemMaxUse=50M + SystemKeepFree=100M | 总分区才 128M,要求空闲 100M = 日志只能占 28M,产生冲突 |
小分区使用 KeepFree | journald 优先满足 KeepFree,会无视 MaxUse |
完整排查流程图
flowchart TD
A[日志分区满] --> B{查看占用 du -sh}
B --> C[主要为 /var/log/journal]
C --> D{检查配置}
D --> E[有 KeepFree 冲突?]
E -->|有| F[注释掉 KeepFree]
E -->|无| G[调低 SystemMaxUse]
F --> H[systemctl restart systemd-journald]
G --> H
H --> I[journalctl --vacuum-size 设置新上限]
I --> J[验证 df -h /var/log]七、快速命令备忘
# 查看日志占用
journalctl --disk-usage
# 查看配置是否生效
systemctl show systemd-journald | grep -E '(SystemMaxUse|RuntimeMaxUse)'
# 手动清理日志
journalctl --rotate --vacuum-size=80M
# 无需重启服务器,只需重启服务
systemctl restart systemd-journald
# 查看 history 文件位置
echo $HISTFILE八、总结
| 问题 | 答案 |
|---|---|
/var/log/journal 是什么? | systemd 系统日志目录 |
| 是否必须? | 不是必须,但强烈建议保留用于排查问题 |
| 能减少吗? | 能,通过 SystemMaxUse 限制大小 |
| 能关闭吗? | 能,设置 Storage=none,但不推荐 |
history 存在这里吗? | 不存在,在 ~/.bash_history |