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 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 文件中容易被识别。