1 Linux 系统的syslog
syslog
用于记录系统和应用程序的运行信息。所有要求都写入一个syslog.h头文件。不仅收集来自操作系统的日志,也可以接收来自各种应用程序和服务的日志。为了便于管理和筛选这些日志,syslog
使用了不同的日志等级和设施(facilities)。
Syslog 设施(Facilities)
Syslog 设施是用于区分日志消息来源的一种机制。常见的设施包括:
LOG_AUTH
,LOG_AUTHPRIV
: 认证和安全相关的消息LOG_CRON
: 计划任务(cron)相关的消息LOG_DAEMON
: 各种系统守护进程的消息LOG_KERN
: 内核生成的消息LOG_LOCAL0
到LOG_LOCAL7
: 这些为本地使用保留的设施,通常被软件开发商用于自定义日志记录LOG_MAIL
: 邮件系统相关的消息LOG_SYSLOG
: syslog 自身生成的消息LOG_USER
: 一般用户级别的消息LOG_UUCP
: UUCP 子系统的消息
每个服务或应用程序可以选择一个合适的设施来记录其日志,以便日志信息可以根据来源被正确分类和管理。
如何使用 Syslog
在程序中,可以通过调用 syslog
函数来发送日志消息到 syslog
服务。这通常在 C 或 C++ 程序中使用标准的 syslog
API,但许多其他语言(包括 Python、Perl、PHP 等)也提供了访问 syslog
的接口。
在 C 语言中,使用 syslog
的基本方式如下:
#include <syslog.h>
int main() {
// 打开日志连接
openlog("myapp", LOG_PID|LOG_CONS, LOG_USER);
// 写入日志
syslog(LOG_INFO, "This is a test message.");
// 关闭日志
closelog();
return 0;
}
在这个例子中,openlog
函数用于打开与 syslog 的连接,并设置了日志标识符(“myapp”)、选项(LOG_PID
和 LOG_CONS
)以及设施(LOG_USER
)。然后,syslog
函数用于实际发送日志消息。
自定义和配置
开发者在选择设施时,应根据应用程序的性质和用途选择最合适的设施。例如,邮件相关的服务通常使用 LOG_MAIL
。使用标准设施可以使得系统管理员更容易地通过配置文件(例如 rsyslog 的 /etc/rsyslog.conf
),来筛选和管理日志。
2 /etc/rsyslog.conf解析
/etc/rsyslog.conf
用于配置 rsyslog
服务,该服务负责处理和记录系统日志。将syslog记录的日志按要求写入不同的文件。
`### 文件头部
# /etc/rsyslog.conf configuration file for rsyslog
#
# For more information install rsyslog-doc and see
# /usr/share/doc/rsyslog-doc/html/configuration/index.html
#
# Default logging rules can be found in /etc/rsyslog.d/50-default.conf
这些注释提供了一些基本信息,如配置文件的用途、查看详细文档的位置以及默认日志规则的位置。
模块加载
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
#module(load="immark") # provides --MARK-- message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
# provides kernel logging support and enable non-kernel klog messages
module(load="imklog" permitnonkernelfacility="on")
这些行加载了不同的 rsyslog
模块:
imuxsock
:支持本地系统日志记录,通常用于记录由本地系统进程生成的日志。immark
:提供--MARK--
消息功能(被注释掉了)。imudp
:提供 UDP 协议的 syslog 接收功能(被注释掉了)。imtcp
:提供 TCP 协议的 syslog 接收功能(被注释掉了)。imklog
:提供内核日志支持,并启用非内核 klog 消息。
全局指令
###########################
#### GLOBAL DIRECTIVES ####
###########################
#
# Use traditional timestamp format.
# To enable high precision timestamps, comment out the following line.
#
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
这些指令设置了全局配置:
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
:使用传统的时间戳格式。如果要启用高精度时间戳,可以注释掉这一行。
# Filter duplicated messages
$RepeatedMsgReduction on
$RepeatedMsgReduction on
:启用重复消息过滤。
#
# Set the default permissions for all log files.
#
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
$PrivDropToUser syslog
$PrivDropToGroup syslog
这些指令设置了日志文件的默认权限和所有权:
$FileOwner syslog
:日志文件的所有者是syslog
用户。$FileGroup adm
:日志文件的组是adm
。$FileCreateMode 0640
:日志文件的创建模式是0640
。$DirCreateMode 0755
:目录的创建模式是0755
。$Umask 0022
:umask 设置为0022
。$PrivDropToUser syslog
和$PrivDropToGroup syslog
:将权限降级到syslog
用户和组。
#
# Where to place spool and state files
#
$WorkDirectory /var/spool/rsyslog
$WorkDirectory /var/spool/rsyslog
:设置工作目录,存放缓存和状态文件。
#
# Include all config files in /etc/rsyslog.d/
#
$IncludeConfig /etc/rsyslog.d/*.conf
$IncludeConfig /etc/rsyslog.d/*.conf
:包含/etc/rsyslog.d/
目录中的所有配置文件。这样可以分离配置,提高可维护性。
日志记录规则
*.err;kern.debug;daemon.notice /var/log/messages
这行配置了一条日志记录规则:
*.err
:记录所有设施的错误级别日志。kern.debug
:记录内核的调试级别日志。daemon.notice
:记录守护进程的通知级别日志。/var/log/messages
:将上述日志记录到/var/log/messages
文件中。
3 rsyslogd的工作原理
1. 工作原理:
-
日志来源:
rsyslogd
可以从多种来源接收日志消息,包括内核日志、用户进程日志、本地系统消息、远程系统发送的日志(通过网络协议如TCP/UDP)等。
-
模块化架构:
rsyslogd
采用模块化的架构,允许通过加载不同的输入、输出、过滤和解析模块来扩展其功能。例如,可以加载imfile
模块来从文件读取日志,加载imudp
模块来通过UDP协议接收日志,等等。
-
日志收集和处理:
- 收到日志消息后,
rsyslogd
会根据预先配置的规则进行处理。处理流程通常包括以下几个步骤:- 过滤:根据消息的内容、来源或级别进行过滤,决定哪些日志需要进一步处理或丢弃。
- 格式化:将日志消息格式化为指定的格式,以便后续处理或存储。
- 路由:根据配置将日志消息发送到不同的目的地,如本地文件、远程服务器、数据库、消息队列等。
- 收到日志消息后,
-
日志存储:
rsyslogd
通常将日志存储在本地的文本文件中,如/var/log/syslog
、/var/log/auth.log
等。通过配置,可以选择将不同类型的日志存储到不同的文件中。
-
日志转发:
rsyslogd
可以将日志消息转发到远程服务器,以便进行集中管理或备份。这可以通过TCP或UDP协议来实现,并支持TLS加密以保证数据安全。
2. 如何收集日志信息:
-
配置文件 (
/etc/rsyslog.conf
或/etc/rsyslog.d/*.conf
):rsyslogd
的行为主要通过配置文件来控制。这些配置文件定义了rsyslogd
应如何收集、处理和存储日志信息。配置文件中的典型指令包括:- Input 指令:定义日志消息的来源,如文件、网络端口等。
- Filter 指令:定义哪些日志消息需要被处理或转发。
- Action 指令:定义日志消息的处理方式,如写入文件、发送到远程主机等。
-
输入模块:
rsyslogd
支持多种输入模块,这些模块负责从不同的日志源收集日志信息:- imuxsock:从本地 UNIX 域套接字接收日志,这是本地系统日志的主要来源。
- imklog:从内核日志缓冲区读取日志消息。
- imfile:从指定的文件中读取日志,这对非标准应用程序的日志收集特别有用。
- imudp/imtcp:通过UDP或TCP网络协议接收远程主机发送的日志消息。
-
日志消息处理:
rsyslogd
根据配置文件中的规则对日志消息进行处理。处理规则可以非常复杂,包括对日志消息的内容进行匹配、转换、过滤、分类等操作。
-
输出模块:
rsyslogd
使用输出模块将处理后的日志消息发送到指定的目的地。这些目的地可以是本地文件、远程日志服务器、数据库或其他存储系统。
4 systemd-journald和rsyslogd
systemd-journald
和 rsyslogd
是 Linux 系统中常见的日志管理工具,它们可以协同工作来处理和存储系统日志。
- systemd-journald
将日志发送给
rsyslogd` 的机制:systemd-journald
负责收集来自各种来源的日志消息,例如内核日志、用户进程日志、启动服务的日志等。它将这些日志消息存储在一个二进制格式的日志文件中,并且可以通过journalctl
命令来查询这些日志。systemd-journald
和rsyslogd
之间的通信通常通过/run/systemd/journal/syslog
这个 UNIX 套接字实现。systemd-journald
会将收到的日志消息发送到这个套接字,而rsyslogd
可以监听这个套接字并接收来自systemd-journald
的日志消息。
2 配置文件:
- 在
/etc/rsyslog.conf
或/etc/rsyslog.d/
配置文件中,可以配置rsyslogd
来监听/run/systemd/journal/syslog
这个套接字。例如,通常会有一条类似于module(load="imuxsock")
的配置,它允许rsyslogd
从systemd-journald
接收日志。 - 如果需要将
systemd-journald
的日志转发给rsyslogd
,确保ForwardToSyslog=yes
选项在journald
的配置文件/etc/systemd/journald.conf
中启用。
- 日志处理:
- 一旦
rsyslogd
接收到systemd-journald
转发的日志消息,它将根据自己的配置文件规则来处理这些日志。rsyslogd
可以将日志消息写入日志文件、发送到远程服务器或执行其他操作。
- 一旦
5 Python应用服务输出日志到/var/log/syslog
Python 应用作为一个服务(例如通过 systemd 启动)运行时,它的输出通常会被系统的日志管理器接管。这里涉及到几个关键的组件和概念:
-
Systemd 和服务管理:Systemd 是一个系统和服务管理器,用于控制哪些程序在系统启动时自动运行。当你通过 systemd 启动一个服务时,它会启动指定的程序,并管理这个程序的运行。
-
标准输出和标准错误:程序运行时产生的输出通常分为标准输出(stdout)和标准错误(stderr)。在交互式运行程序时,这些输出通常显示在终端上。
-
日志重定向:当通过 systemd 启动服务时,这些服务的 stdout 和 stderr 不是直接显示在终端,而是被 systemd 重定向。Systemd 提供了多种日志处理方式,包括将输出发送到系统的日志系统(如 syslog)、仅保留在 systemd 的日志缓存中(journal),或者重定向到其他文件或设备。
-
Syslog:Syslog 是一个标准的日志协议和应用,用于接收和存储系统日志信息。在 Linux 中,/var/log/syslog 文件是一个通用日志文件,用于存储从不同来源(包括多数系统服务)收集的日志。
-
配置文件影响:Systemd 服务的配置文件(通常是一个位于
/etc/systemd/system/
的.service
文件)可以指定服务的日志去向。例如,StandardOutput
和StandardError
属性可以被设置为将输出重定向到 syslog、journal 或其他目标。
例如,如果 Python 应用是作为一个 systemd 服务运行,它的配置文件可能看起来如下:
[Unit]
Description=My Python Application
[Service]
ExecStart=/usr/bin/python3 /path/to/your_script.py
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my_python_app
[Install]
WantedBy=multi-user.target
在这个例子中,StandardOutput
和 StandardError
都设置为 syslog
,这意味着所有的标准输出和错误都会被发送到系统的 syslog 服务,并最终写入 /var/log/syslog
文件。同时,SyslogIdentifier
设置一个标识符,使得来自这个服务的日志可以在 syslog 文件中容易被识别。