【linux】日志和journalctl 管理查看日志

本文介绍了Linux系统中的两种日志管理系统,即传统的/var/log和基于systemd的journald。重点讲解了journalctl命令及其各种用法,包括查看内核日志、应用日志、过滤和管理systemd日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

既看即用

简略介绍

linux 两种日志系统

 /var/log 传统日志系统

journald日志系统(systemd-journald)

dmesg 是一个工具,

journalctl是什么?(查看系统日志的工具)

区别的简单说明

journalctl -t 和 journalctl -u 

/var/log/messages 和 systemd-journald 

systemd日志(systemd-journald) 放在哪个目录

`journalctl -h` 的输出


既看即用

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)

常用命令

journalctl -xe # -x 是目录(catalog)的意思,在报错的信息下会,附加解决问题的网址    -e  pager-end 从末尾开始看

从尾部开始看
journalctl -r # -r reverse ,加-r表示倒序从尾部看(推荐)

滚屏输出日志

journalctl -f
journalctl -f -n 20;  # 和tail -f 一个性质

#查看指定时间的日志
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"

#只看内核日志(不显示应用日志)
journalctl -k

#查看系统本次启动的日志
journalctl -b
journalctl -b -0


#查看上一次启动的日志(需更改设置)
journalctl -b -1


某用户的日志
id root;
journalctl _UID=0 -n 5


#查看指定服务的日志
journalctl /usr/lib/systemd/systemd


#查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u httpd.service   # -u  service unit

#合并显示多个 Unit 的日志

journalctl -u nginx.service -u php-fpm.service --since today

:https://blog.csdn.net/enthan809882/article/details/104551777/

#只看标记为bash的日志
journalctl -t bash

查看进程的日志

#通过进程名
journalctl -t <进程名称>

#通过进程ID

journalctl -f _PID=2121462


查看http的日志
journalctl -thttpd
配合grep 过滤
journalctl |grep -E 'bash\[|\bsh\['

#查看指定优先级(及其以上级别)的日志,共有8级

0: emerg

1: alert

2: crit

3: err

4: warning

5: notice

6: info

7: debug

journalctl -p err -b2

#日志默认分页输出,–no-pager 改为正常的标准输出

journalctl --no-pager

#日志管理journalctl

#以 JSON 格式(单行)输出

journalctl -b -u nginx.service -o json

#以 JSON 格式(多行)输出,可读性更好

journalctl -b -u nginx.serviceqq -o json-pretty

空间管理

清空 /var/log/journal 文件的方法:https://www.jianshu.com/p/a30648913fe0

#显示日志占据的硬盘空间

journalctl --disk-usage

#指定日志文件占据的最大空间

journalctl --vacuum-size=1G

journalctl --vacuum-size=500M

#指定日志文件保存多久

journalctl --vacuum-time=1years   #只保留近一年的日志
journalctl --vacuum-time=1w  #只保留近一周的日志

journalctl --vacuum-time=2d  #只保留近2天的日志

如果要手工删除日志文件,则在删除前需要先轮转一次journal日志
systemctl kill --kill-who=main --signal=SIGUSR2 systemd-journald.service
要启用日志限制持久化配置,可以修改 /etc/systemd/journald.conf
SystemMaxUse=16M
ForwardToSyslog=no
然后重启
systemctl restart systemd-journald.service
检查journal是否运行正常以及日志文件是否完整无损坏
journalctl --verify

日志的配置文件

/etc/systemd/journald.conf

更多:https://www.cnblogs.com/askword/p/14506430.html

简略介绍

linux 两种日志系统

journald日志系统 :

        在采用 systemd 的 Linux 发行版中,系统日志通常通过 journald 来管理,并且存储在 systemd 的 journal 中

传统日志系统: 

         /var/log 目录下的文件中

 /var/log 传统日志系统

 /var/log 常见的日志类型包括:

/var/log/messages 系统启动后的信息和错误日志,几乎所有的开机系统发生的错误都会在此记录;(系统日志文件:组件的消息、警告、错误,记录更高级别的系统日志信息。包括系统服务的启动和停止信息、登录和权限问题、内核模块加载和卸载等信息。)

/var/log/secure 与安全相关的日志信息

/var/log/cron 与定时任务相关的日志信息

/var/log/spooler 与UUCP和news设备相关的日志信息

/var/log/boot.log 记录一些开机或者关机启动的一些服务显示的启动或者关闭的信息;

journald日志系统(systemd-journald)

`systemd-journald` 日志负责收集和管理整个系统的日志信息,包括内核消息、系统服务和用户级别的日志。这些日志通过 `systemd-journald` 存储为二进制格式,并位于 `/var/log/journal/` 目录下。

(journald 服务的日志通常保存在 /run/log/journal/ 目录下,但这个目录的内容可能会被清空。为了持久化保存 journal 日志,可以配置 journald 将日志转储到 /var/log/journal/ 目录下。)

总之,/var/log/*传统的文本日志文件,而 `systemd-journald` 是现代的二进制日志记录服务。与传统的日志文件相比,`systemd-journald` 提供了更强大、更灵活的日志管理和查询功能,同时还能够处理更多来源的日志信息。

dmesg 是一个工具,

 

dmesg 是一个工具,既不属于/var/log 传统日志系统 也不属于journald日志系统,dmesg 命令查看的内核消息可以被重定向或捕获到日志文件中,这取决于系统的配置和日志管理机制。

 

dmesg 启动内核产生的消息

dmesg 显示或控制内核环形缓冲区内容的,这些消息是在系统启动过程中产生的,但也可能是在系统运行过程中由内核生成的。

Linux系统中,内核产生的消息首先会被写入到内核环形缓冲区中。这些消息包括系统启动时的信息、设备驱动加载情况、硬件错误以及其他内核级别的活动。

为了持久化保存这些消息以供后续分析和调试,系统通常会配置日志守护进程来监听内核消息,并将其写入到日志文件中。这些日志文件通常位于/var/log目录下,例如/var/log/messages/var/log/syslog/var/log/kern.log等。具体的文件名和位置可能因不同的Linux发行版和日志配置而有所差异。

journalctl是什么?(查看系统日志的工具)

journalctl 是一个用于访问和管理 systemd 日志的命令行工具,可以查看和分析系统日志,以便诊断和解决问题。它可以提供有关服务、进程、启动过程和系统事件的详细信息。

systemd 日志默认存储在 `/var/log/journal/` 目录下。具体而言,系统的二进制日志文件存储在 `/var/log/journal/system.journal` 中。

在 `/var/log/journal/` 目录下,您还会找到其他文件和目录,包括:

- `system.journal~`:这是系统日志的旧版本备份文件,当系统进行日志轮转(log rotation)时,旧的 `system.journal` 文件会被重命名为此文件。

- `user` 目录:该目录包含每个用户的个人日志目录。每个用户的日志以其用户ID号命名,例如 `/var/log/journal/user/1000` 是用户ID为1000的用户的个人日志目录。

请注意,这些路径是默认设置,实际可能因为操作系统的配置和定制而有所不同。

区别的简单说明

journalctl -t 和 journalctl -u 

-t范围更窄, -u范围更广,-u指定的服务其调用或启动的进程/资源都会列出来?

journalctl -t 和 journalctl -u 是 journalctl 命令的两个不同选项,用于过滤和查看 systemd journal 中的日志。它们之间的主要区别在于过滤日志的方式和目的。

  1. journalctl -t [TAG]
    -t
    --identifier` 选项允许你通过日志条目的标识符(通常是一个服务名或特定的日志标签)来过滤日志。使用这个选项,你可以查看特定服务或组件生成的日志条目。
  • 例如,如果你想要查看与 SSH 服务相关的日志,你可以使用 journalctl -t sshd 命令。这将显示所有包含 sshd 标识符的日志条目。
  1. journalctl -u [UNIT]
    -u
    --unit` 选项允许你通过 systemd 的单元名称来过滤日志。systemd 单元可以是服务、套接字、设备、挂载点等。使用这个选项,你可以查看特定 systemd 单元在启动和运行期间产生的所有日志条目。
  • 例如,如果你想要查看名为 nginx.service 的服务的日志,你可以使用 journalctl -u nginx.service 命令。这将显示与 nginx.service 单元相关的所有日志条目,包括其启动日志和运行时的日志。

总结:

  • journalctl -t 是基于日志条目的标识符来过滤日志的,通常用于查看特定服务或组件的日志。
  • journalctl -u 是基于 systemd 单元名称来过滤日志的,用于查看特定 systemd 单元(如服务)的日志,包括其启动和运行时的日志。

根据你的需要,你可以选择使用合适的选项来查看你感兴趣的日志。如果你知道你想要查看的服务的 systemd 单元名称,使用 -u 选项可能更直接。如果你只知道服务的名称或日志标签,使用 -t 选项可能更合适。

/var/log/messages 和 systemd-journald 

/var/log/messages 和 systemd-journald 是两种不同的日志系统,它们各自有不同的特点和记录范围。

/var/log/messages 是传统的 Linux 系统日志文件,记录了系统运行时的各种状态消息,包括系统启动时的引导信息、IO 错误、网络错误和其他系统错误等。此外,它还记录了用户身份切换为 root 等安全相关信息。这个日志文件通常用于故障诊断和安全性分析。

systemd-journald 是 systemd 的一部分,提供了一种新的系统日志管理方式。它不仅收集来自内核、系统早期启动阶段的日志,还收集系统守护进程在启动和运行中的标准输出和错误信息。此外,它还能记录 syslog 的日志。systemd-journald 将日志集中保存在单一结构的日志文件中,并且由于日志是压缩和格式化的二进制数据,所以在查看和定位时非常迅速。然而,需要注意的是,systemd-journald 默认并不会持久化保存所有日志,只会保留一段时间的日志,具体保留时间取决于系统配置。

关于哪个记录更全,这取决于具体的系统配置和日志策略。传统的 /var/log/messages 文件记录了系统运行的广泛信息,但可能不包括 systemd 管理的服务的日志。而 systemd-journald 则能够记录更多类型的日志,包括内核日志、系统服务日志等,但它可能不会保存所有日志,特别是如果系统配置了日志轮循或清理策略。

因此,为了获得最全面的日志记录,可能需要同时查看 /var/log/messages 和 systemd-journald 的日志。同时,根据实际需求,管理员可以配置和调整日志记录策略,以确保捕获到所需的关键信息。

systemd日志(systemd-journald) 放在哪个目录

systemd 日志默认存储在 `/var/log/journal/` 目录下。具体而言,系统的二进制日志文件存储在 `/var/log/journal/system.journal` 中。

在 `/var/log/journal/` 目录下,您还会找到其他文件和目录,包括:

- `system.journal~`:这是系统日志的旧版本备份文件,当系统进行日志轮转(log rotation)时,旧的 `system.journal` 文件会被重命名为此文件。

- `user` 目录:该目录包含每个用户的个人日志目录。每个用户的日志以其用户ID号命名,例如 `/var/log/journal/user/1000` 是用户ID为1000的用户的个人日志目录。

请注意,这些路径是默认设置,实际可能因为操作系统的配置和定制而有所不同。

`journalctl -h` 的输出

```

journalctl [选项…] [过滤表达式]

查看 systemd 日志。

选项:

  -h --help                       显示此帮助信息并退出

     --version                    显示软件包版本信息

  -a --all                        显示所有可用的日志数据

  -b --boot[=ID|±N]               显示引导 ID 或相对偏移引导的日志数据

  -k --dmesg                      显示内核日志

  -c --cursor=CURSOR              使用指定的游标开始读取日志数据

  -u --unit=UNIT                  仅显示与单元/服务名称匹配的日志

                                    此选项可多次使用

  -g --grep=EXPR                  搜索日志数据中匹配的表达式

     --quiet                      减少冗长的输出

     --no-pager                   不要使用分页器

     --no-tail                    不要 `tail -f` 跟踪新的日志条目

     --output=FORMAT              设置日志输出格式

     --verify                     验证日志数据文件的完整性

     --vacuum                      清理/压缩日志存档

     --disk-usage                  显示磁盘使用情况

  -D --directory=DIRECTORY        设置日志数据文件存储目录

  -F --field=FIELD                仅显示具有指定字段的日志数据

  -n --lines[=INTEGER]            设置要显示的日志行数

  -r --reverse                    反向显示日志条目

  -e --pager-end                  加载日志的末尾并定位到最新条目

  -o --output-fields=FIELDS       设置要显示的字段列表

  -f --follow                     跟踪日志文件的变化

  -t --identifier=SYSLOG_IDENTIFIER

                                  仅显示包含给定标识符的日志条目

  -p --priority=LEVEL             仅显示具有指定优先级的日志条目

  -S --since[=TIMESTAMP]          显示在指定时间戳之后的日志

  -U --until=TIMESTAMP            显示在指定时间戳之前的日志

     --since-cursor=CURSOR        显示在指定游标之后的日志

     --until-cursor=CURSOR        显示在指定游标之前的日志

  -M --machine=CONTAINER          仅显示与给定容器匹配的日志

  -N --not                         在结果中反转条件

  -r --system                     显示系统日志

  -r --user[=USER]                 显示用户日志

  -w --wall                       当前 tty 上显示新的内核消息

     --new-mode                    在有新日志时进入新模式

     --no-rate-limit              无条件显示所有日志数据

     --no-pager-limit             显示所有条目,不受分页器限制

     --no-full                    不要进行完整性检查

     --quiet                        不要显示所有条目的详细信息

     --no-pager-quiet              禁用详细信息的分页输出

     --verify-key=keyid/subdesc    验证已签名的日志数据文件的签名

  -b --since-boot[=SPAN]          在最近的引导过程中显示日志

     --interval=INTERVAL          设置日志捕获的间隔

     --reverse                      反向按时间顺序显示

     --no-hostname                 不要打印主机名

     --no-full-field               不要打印字段描述符

     --no-header-field             不要打印消息头字段

     --output-fields-width=WIDTH   设置字段输出宽度的最佳规则

过滤表达式:

  过滤表达式可以基于日志数据属性(例如,单元)或字段(例如,MESSAGE)进行搜索。

  过滤表达式使用方括号 `[` 和 `]` 包围,并支持下列操作:

    =,  !=

    <, <=

<think>好的,我现在需要帮用户解决如何用journalctl -p 3 -xb查看指定日期的日志,以排查输入/输出错误的问题。首先,我得回忆一下journalctl的基本用法相关参数。 用户提到他们想查看特定一天的日志,并且过滤出优先级为3(错误级别)的信息。根据之前的引用内容,用户可能已经知道-p 3表示错误级别,但需要结合时间过滤。引用3中提到了使用--since--until参数来指定时间范围,比如journalctl --since "2020-12-03" --until "2020-12-05 03:00:00",这应该可以用来限定日期。 首先,我需要确认用户是否知道如何正确使用时间参数。他们可能需要指定具体的日期,比如查看2023-10-25当天的日志。这时命令应该是journalctl -p 3 -xb --since "2023-10-25 00:00:00" --until "2023-10-25 23:59:59"。这样就能抓取那一天的日志。 接下来,用户可能需要进一步过滤出包含输入/输出错误的信息。引用1中提到,可以通过输入/后跟关键字来搜索,比如I/O error或者sda这样的设备名。所以在查看日志时,用户执行完上述命令后,可以按/然后输入I/O error或者相关关键字来定位具体错误。 另外,用户可能需要确认日志的时间范围是否正确,避免因为时区问题导致时间偏差。系统日志的时间默认是UTC还是本地时间?可能需要提醒用户检查系统时区设置,或者在使用--since--until时指定时区,比如--since "2023-10-25 00:00:00 +08:00"。 还要注意,-xb参数表示显示从本次启动开始的日志,但用户可能需要查看历史日志,特别是如果问题发生在之前的某次启动中。这时候是否需要去掉-b参数?或者使用--boot参数指定具体的启动次数?比如journalctl -p 3 -x --since ... --until ... --boot -1可以查看上一次启动的日志。 此外,用户的问题可能涉及到硬件错误,如引用1中的例子,出现I/O error, dev sda,这时候需要引导用户检查相关设备,比如sda磁盘的健康状况,结合之前的解决方案中的硬件检测步骤,如使用fsck或badblocks。 最后,可能需要提醒用户如何保存日志以便进一步分析,比如重定向到文件或用grep过滤。例如,journalctl -p 3 -xb --since ... --until ... | grep -i 'I/O error' > io_errors.log。 总结步骤应该是:组合使用时间参数优先级过滤,定位到特定日期的错误日志,然后通过关键字搜索找到I/O错误的具体条目,再根据日志中的设备信息进行进一步诊断。</think>#### 分步解决方案:使用`journalctl -p 3 -xb`查看指定日期I/O错误日志 --- ### 1. **基础命令结构** **目标**:查看特定日期(例如2023-10-25)的错误级别日志(优先级3=错误) **命令格式**: ```bash journalctl -p 3 -xb --since "YYYY-MM-DD 00:00:00" --until "YYYY-MM-DD 23:59:59" ``` **示例**: ```bash journalctl -p 3 -xb --since "2023-10-25 00:00:00" --until "2023-10-25 23:59:59" ``` *说明*: - `-p 3`:仅显示错误级别日志(优先级3对应`err`)[^2] - `-xb`:`-x`显示解释性帮助,`-b`限定当前启动周期的日志 - `--since`/`--until`:时间范围参数,支持自然语言如`yesterday`或`1 hour ago`[^3] --- ### 2. **优化时间范围** **问题**:系统时区可能导致时间偏差(默认使用UTC时间) **解决方案**: ```bash # 显式指定时区(例如北京时间+8) journalctl -p 3 -xb --since "2023-10-25 00:00:00 +08:00" --until "2023-10-25 23:59:59 +08:00" ``` *提示*:通过`timedatectl`命令可查看系统当前时区设置[^2] --- ### 3. **筛选I/O错误关键字** **步骤**: 1. 执行上述命令后,在日志界面输入`/`进入搜索模式 2. 输入关键词(支持正则表达式): ```text /I\/O error|sda|sd[b-z]|input\/output ``` *说明*: - `I/O error`:直接匹配输入输出错误 - `sda|sd[b-z]`:匹配所有可能涉及的存储设备(如sda、sdb等) - 按`N`/`n`切换匹配项(上下导航)[^1] --- ### 4. **解析关键日志条目** **典型错误示例**: ```log Oct 25 14:30:15 hostname kernel: blk_update_request: I/O error, dev sda, sector 123456 op 0x1:(READ) flags 0x0 phys_seg 1 prio class 0 ``` **关键信息**: - **设备标识**:`dev sda`(故障磁盘) - **操作类型**:`READ`(读取错误) - **扇区位置**:`sector 123456`(可用于后续修复定位)[^1] --- ### 5. **关联操作(发现错误后)** 1. **记录设备路径**(如`/dev/sda`) 2. **检查磁盘健康**: ```bash smartctl -a /dev/sda | grep -i "reallocated\|pending" ``` *输出解读*: - `Reallocated_Sector_Ct` > 0:存在物理坏道 - `Pending_Sector` > 0:待处理扇区错误[^1] 3. **修复文件系统**: ```bash umount /dev/sdaX # 卸载分区 fsck -y /dev/sdaX # 强制修复 ``` --- ### 6. **导出日志供后续分析** ```bash journalctl -p 3 -xb --since "2023-10-25" --until "2023-10-26" | grep -i "I/O error" > io_errors_20231025.log ``` *用途*:保存日志文件以便与技术支持共享或长期监控[^3] ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值