linux服务日志配置分析

1 Linux 系统的syslog

syslog 用于记录系统和应用程序的运行信息。所有要求都写入一个syslog.h头文件。不仅收集来自操作系统的日志,也可以接收来自各种应用程序和服务的日志。为了便于管理和筛选这些日志,syslog 使用了不同的日志等级和设施(facilities)。

Syslog 设施(Facilities)

Syslog 设施是用于区分日志消息来源的一种机制。常见的设施包括:

  • LOG_AUTH, LOG_AUTHPRIV: 认证和安全相关的消息
  • LOG_CRON: 计划任务(cron)相关的消息
  • LOG_DAEMON: 各种系统守护进程的消息
  • LOG_KERN: 内核生成的消息
  • LOG_LOCAL0LOG_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_PIDLOG_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-journaldrsyslogd 是 Linux 系统中常见的日志管理工具,它们可以协同工作来处理和存储系统日志。

  1. systemd-journald将日志发送给rsyslogd` 的机制
    • systemd-journald 负责收集来自各种来源的日志消息,例如内核日志、用户进程日志、启动服务的日志等。它将这些日志消息存储在一个二进制格式的日志文件中,并且可以通过 journalctl 命令来查询这些日志。
    • systemd-journaldrsyslogd 之间的通信通常通过 /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") 的配置,它允许 rsyslogdsystemd-journald 接收日志。
  • 如果需要将 systemd-journald 的日志转发给 rsyslogd,确保 ForwardToSyslog=yes 选项在 journald 的配置文件 /etc/systemd/journald.conf 中启用。
  1. 日志处理
    • 一旦 rsyslogd 接收到 systemd-journald 转发的日志消息,它将根据自己的配置文件规则来处理这些日志。rsyslogd 可以将日志消息写入日志文件、发送到远程服务器或执行其他操作。

5 Python应用服务输出日志到/var/log/syslog

Python 应用作为一个服务(例如通过 systemd 启动)运行时,它的输出通常会被系统的日志管理器接管。这里涉及到几个关键的组件和概念:

  1. Systemd 和服务管理:Systemd 是一个系统和服务管理器,用于控制哪些程序在系统启动时自动运行。当你通过 systemd 启动一个服务时,它会启动指定的程序,并管理这个程序的运行。

  2. 标准输出和标准错误:程序运行时产生的输出通常分为标准输出(stdout)和标准错误(stderr)。在交互式运行程序时,这些输出通常显示在终端上。

  3. 日志重定向:当通过 systemd 启动服务时,这些服务的 stdout 和 stderr 不是直接显示在终端,而是被 systemd 重定向。Systemd 提供了多种日志处理方式,包括将输出发送到系统的日志系统(如 syslog)、仅保留在 systemd 的日志缓存中(journal),或者重定向到其他文件或设备。

  4. Syslog:Syslog 是一个标准的日志协议和应用,用于接收和存储系统日志信息。在 Linux 中,/var/log/syslog 文件是一个通用日志文件,用于存储从不同来源(包括多数系统服务)收集的日志。

  5. 配置文件影响:Systemd 服务的配置文件(通常是一个位于 /etc/systemd/system/.service 文件)可以指定服务的日志去向。例如,StandardOutputStandardError 属性可以被设置为将输出重定向到 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

在这个例子中,StandardOutputStandardError 都设置为 syslog,这意味着所有的标准输出和错误都会被发送到系统的 syslog 服务,并最终写入 /var/log/syslog 文件。同时,SyslogIdentifier 设置一个标识符,使得来自这个服务的日志可以在 syslog 文件中容易被识别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值