三分薄地,认真耕耘

导航

 

1、journal和syslog对比

提到系统日志除了journal比较常见外,还有syslog也是比较基础的服务,两者都是日志服务。并且在系统中合理分工,相互配合。它们服务于不同的目标并且具有不同的特性。syslog是linux系统的一套日志框架,它既可以记录日志到本地文件,也可以通过网络发送到接受syslog的服务器,以实现对多个设备的syslog消息进行统一的存储或解析。而journal是改进型的日志管理服务,主要收集来自内核、系统早起的启动阶段的日志以及系统守护进程在启动和运行中的标准输出和错误。

在centos7中以及更高级版本,journalctl成为了查看和管理日志的主要工具,它从/var/log/journal和/run/log/journal等路径获取日志信息。同时,systemd-journald会将日志信息写入到socket文件/run/systemd/journal/syslog中,然后由rsyslog服务监听这个socket文件,从而实现对日志的统一管理和处理。因此,可以说syslog和journalctl在日志管理中各司其职,共同保障了linux系统日志的完整性和可用性。

以上提到了一些关于journal相关的名词,关系如下:
journal日志使用journalctl工具管理,依赖systemd-journald服务,syslog日志可以用文本工具查看,如view、more、cat等命令都可以用,也可以借助其他工具查看特定信息,比如使用dmesg查看syslog日志中的内核相关信息,syslog依赖的服务通常是rsyslogd

journalctl和syslog都是linux系统中用于处理和查看系统日志的工具,我们从以下几个方面来比较两者的区别:

类型 syslog journalctl
存储方式 使用文本文件来存储日志信息,可以通过文本编辑器查看,通常存储在/var/log/syslog或/var/log/message journalctl通过systemd-journald服务存储二进制格式的日志文件,通常存储在/run/log/journal或/var/log/journal
日志内容 使用文本格式,记录在文本文件中。日志信息包含时间戳、主机名、应用程序名等 使用二进制格式,可以存储更多元数据,例如进程ID、用户ID、Selinux上下文等,这使得日志更加结构化、支持更高级的查询方式
查询和过滤 syslog的查询和过滤通常使用命令行工具(如grep)或者专用工具(例如logrotate) journalctl提供了更丰富和强大的查询和过滤功能,可以按时间、服务单元、日志条件等多个条件进行过滤。这使得查找和分析特定事件更加方便
实时查看 syslog通常使用tail命令实时查看日志文件的末尾 journalctl可以使用-f或--follow选项实时查看最新的日志
服务和依赖关系 syslog是一个通用的日志服务,可以由多个守护进程(如rsyslog、syslog-ng)实现 journalctl是systemd系统的一部分,依赖于systemd-journald服务
配置文件路径 syslog配置文件的配置文件在/etc/rsyslog.conf journalctl的配置文件在/etc/systemd/journald.conf

总体而言,journalctl是systemd系统的一部分,提供了更现代化、结构化和强大的日志管理功能,但这并不意味着syslog是过时的。两者可能同时存在,而且一些工具和服务可能仍然使用传统的syslog。选择使用哪一个取决于系统的需求和管理员的偏好。

2、 syslog和journal服务对比

下面分别展示一下systemd-journald和rsyslogd两个服务的信息:


[root@centos7 httpd.d]# systemctl status systemd-journald
● systemd-journald.service - Journal Service
   Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static; vendor preset: disabled)
   Active: active (running) since Fri 2025-04-25 14:48:27 CST; 1 day 6h ago
     Docs: man:systemd-journald.service(8)
           man:journald.conf(5)
 Main PID: 3157 (systemd-journal)
   Status: "Processing requests..."
   CGroup: /system.slice/systemd-journald.service
           └─3157 /usr/lib/systemd/systemd-journald

Apr 25 14:48:27 centos7.6-1 systemd-journal[3157]: Runtime journal is using 8.0M (max allowed 90.9M, trying to leave 136.4M free of 901.7M available → current limit 90.9M).
Apr 25 14:48:27 centos7.6-1 systemd-journal[3157]: Journal started


[root@centos7 httpd.d]# systemctl status rsyslog
● rsyslog.service - System Logging Service
   Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2025-04-25 14:48:36 CST; 1 day 6h ago
     Docs: man:rsyslogd(8)
           http://www.rsyslog.com/doc/
 Main PID: 6723 (rsyslogd)
   CGroup: /system.slice/rsyslog.service
           └─6723 /usr/sbin/rsyslogd -n

Apr 25 14:48:36 centos7.6-1 systemd[1]: Starting System Logging Service...
Apr 25 14:48:36 centos7.6-1 rsyslogd[6723]:  [origin software="rsyslogd" swVersion="8.24.0-34.el7" x-pid="6723" x-info="http://www.rsyslog.com"] start
Apr 25 14:48:36 centos7.6-1 systemd[1]: Started System Logging Service.

3、rsyslog和journal配置文件对比

3.1 journal配置文件说明

journal配置文件/etc/systemd/journald.conf


[root@centos7 httpd.d]# cat /etc/systemd/journald.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
Storage=persisant #开启持久化存储
#Compress=yes   #开启压缩功能
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
SystemMaxUse=40% #设置系统最大占用率为40%   
StorageOption=size #设置存储选项为按大小进行存储
StorageOption=autorotate #设置存储选项为自动轮换
StoragePath=/export/log/journal #设置日志文件的存储路劲 
#SystemKeepFree=
#SystemMaxFileSize=
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K


3.1.1 通过配置文件设置不同类型的存储日志

我们可以通过修改/etc/systemd/journald.conf文件中的Storage选项的值来配置文件控制存储类型,如 Storage=auto
支持的类型如下:

  • volatile 日志数据将仅存储在内存中,即在/run/log/journal目录下(根据需要创建)
  • persistent 数据将会存储在磁盘上,即/var/log/journal目录下,并且在早期引导阶段磁盘不可写的时候把数据保存到/run/log/journal目录下。
  • auto 意味着把日志数据存储在/var/log/journal/目录中。但是该目录必须已经存在并且设置了适当的权限。如果不存在,则日记数据将存储在易失性/run/log/journal/目录中,并且在系统关闭时会删除该数据。
  • none 关闭所有存储,所有接受的日志数据将被丢失

3.1.2 通过配置文件设置日志文件的logrotate

我们可以通过修改/etc/systemd/journald.conf文件中的以下选项,完成对systemd-journald日志文件的转储


#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month

这些设置将会限制日志文件的大小上限。 以System开头的选项用于限制磁盘使用量, 也就是 /var/log/journal 的使用量。 以Runtime开头的选项用于限制内存使用量, 也就是 /run/log/journal 的使用量。各选项说明如下:


SystemMaxUse=
# 控制日志可以使用多少磁盘空间,然后对日志文件执行systemd-journald logrotate。
SystemKeepFree=
# 控制systemd-journald将为其他用途保留多少磁盘空间。之后将对日志文件执行systemd-journald logrotate。
SystemMaxFileSize=
# 限制单个日志文件的最大体积,达到此限制后日志文件会自动回滚,默认值是对应的SystemMaxUse值的1/8,这也意味着日志滚动默认保留7个历史文件
SystemMaxFiles=
# 限制最多允许同时存在多少个日志文件,超出此限制后,最老的日志文件将被删除,而当前的活动日志文件则不受影响。默认值为100个
RuntimeMaxUse=
# 控制日志可以使用多少内存空间,然后对日志文件执行systemd-journald logrotate。默认为分配给节点的总物理内存的10%
RuntimeKeepFree=
# 控制systemd-journald将为其他用途保留多少内存空间。之后将对日志文件执行systemd-journald logrotate。默认为分配给节点的总物理内存的15%
RuntimeMaxFileSize=
# 限制单个日志文件的最大体积,达到此限制后日志文件会自动回滚,默认值是对应的RuntimeMaxuse值的1/8,这也意味着日志滚动默认保留7个历史文件
RuntimeMaxFiles=
# 限制最多允许同时存在多少个日志文件, 超出此限制后, 最老的日志文件将被删除, 而当前的活动日志文件 则不受影响。 默认值为100个 
MaxRetentionSec=
# 日志滚动的时间间隔。通常并不需要使用基于时间的日志滚动策略, 因为由SystemMaxFileSize/RuntimeMaxFileSize= 控制的基于文件大小的日志滚动策略已经可以确保日志文件的大小不会超标。 默认值是一个月, 设为零表示禁用基于时间的日志滚动策略。
MaxFileSec=1month
# 日志文件的最大保留期限。 当日志文件的最后修改时间(mtime)与当前时间之差,大于此处设置的值时,日志文件将会被删除。 通常并不需要使用基于时间的日志删除策略。

3.2 syslog日志文件

再看下/etc/rsyslog.conf配置文件


[root@centos7 httpd.d]# cat /etc/rsyslog.conf 
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark  # provides --MARK-- message capability

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf # 将包含/etc/rsyslogd/目录下的所有*.conf结尾的配置文件

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on # 不再通过本地日志套接字接收消息,本地消息现在通过imjournal(journal日志服务)来检索

# File to store the position in the journal
$IMJournalStateFile imjournal.state


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
#将所有信息级别(info)以及除了mail、authpriv、cron之外的其他日志,都记录到/var/log/message文件中
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
#将所有级别的authpriv日志都记录到/var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
#将所有级别的mail日志都记录到/var/log/maillog中

# Log cron stuff
cron.*                                                  /var/log/cron
#将所有级别的cron日志都记录到/var/log/cron中
# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*
#将所有紧急级别(emergency)的日志消息都发送到用户消息队列
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
#将所有uucp和news的crit级别以及更高级别的日志记录到/var/log/spooler中
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
# 保存启动消息日志到/var/log/boot.log中

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###


4、使用journalctl查看和管理日志

4.1 查看日志

# 查看所有日志
journalctl

# 显示尾部指定行数的日志,默认10行
journalctl -n 20

# 实时滚动显示最新日志
journalctl -f

# 查看指定时间的日志
journalctl --since yesterday
journalctl --since="2023-12-12 16:52:18"
journalctl --since "30 min ago"
journalctl --since "2023-12-22 16:52:00" --until "2023-12-22 23:13:34"
journalctl --since 09:00 --until "1 hour ago"

#查看最新内核日志,过滤掉应用日志
journalctl -k

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

#查看上一次启动的日志
journalctl -b -1

#查看指定优先级及其以上级别的日志,共有8级--0:emerg ;1:alert; 2:crit; 3:err; 4:warning; 5: notice; 6: info; 7:debug
# -b 不加任何参数时,表示显示当前引导周期的日志,这意味着只显示最近一次启动以来的日志
#-b -N: N是一个整数,表示要显示第N个引导周期的日志,例如,-b 0 表示显示最新的引导周期,-b 1表示显示上一个引导周期,一次类推

# 查看错误日志
journalctl -p err

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

# 以单行json格式输出
journalctl -b -u ngnix.service -o json

# 以多行json可读性更好的格式输出
journalctl -b -u nginx.service -o json-pretty


4.2 查看指定服务日志

# 查看指定服务的日志
journalctl /usr/sbin/sshd

# 查看指定进程的日志
journalctl _PID=1

# 查看某个路径脚本的日志
journalctl /bin/bash

# 查看某个unit的日志
# 单元unit通常是systemd服务的一个抽象,用于表示系统中正在运行的各种服务或任务
journalctl -u nginx.service
journalctl -u nginx.service --since today

# 合并显示多个unit日志
journalctl -u nginx.service -u ssh.service --since today

4.3 查看调整存储


# 显示日志占据的硬盘空间
journalctl --disk-usage

# 仅保留500MB大小的日志文件
journalctl --vacuum-size=500M

# 指定日志文件保存多久
journalctl --vacuum-time=1years

# 仅保留最近一个月的日志文件
journalctl --vacuum-time=1m

# 仅保留最近2天的日志文件
journalctl --vacuum-time=2d



posted on 2025-04-27 13:45  平复心态  阅读(308)  评论(0)    收藏  举报