首页 > 系统相关 >【Linux日志】syslog协议的Linux系统日志服务程序使用

【Linux日志】syslog协议的Linux系统日志服务程序使用

时间:2025-01-23 11:43:32浏览次数:1  
标签:服务程序 LOG syslogd syslog 消息 Linux 日志 系统日志

一、什么是syslog协议

syslog 协议为网络设备间传输日志信息提供了标准化解决方案。借助该协议,服务器、路由器、防火墙等各类设备能够将日志消息发送至中央日志服务器,实现日志的集中管理与分析。下面为您详细介绍 syslog 协议的关键概念和组成部分 :

1. 协议版本

RFC 3164: 早期的syslog协议规范,定义了基本的消息格式和传输机制。

RFC 5424: 更新的规范,提供了更严格的消息格式和增强的安全特性,如使用TLS进行加密传输。

2. 消息结构

一个syslog消息通常包含:

头部:其中含有优先级字段(<pri>) ,该字段由设施和严重性共同构成。

时间戳:主要用于记录消息产生的具体时间。

主机名:指的是发送消息的设备名称。

应用程序名:即产生日志的应用程序或者进程的名称。

进程 ID:此为可选项,作用是标识产生日志的进程。

消息 ID:同样属于可选项,用于对特定类型的消息加以标识。

结构化数据:该部分内容可选,以键值对的形式包含了额外信息。
消息体:即实际的日志文本内容。

3. 设施与严重性

设施: 定义日志消息的来源,如用户级进程、系统级进程等。

严重性: 定义消息的紧急程度,从紧急(0)到调试(7)。

4. 传输协议

syslog消息可通过不同协议发送:

UDP: 默认的无连接协议,提供低延迟但不可靠的传输。

TCP: 提供可靠的消息传输,可能有更高延迟。

TLS/SSL: 提供安全的传输,防止消息被截获或篡改。

5. 服务器与客户端

syslog服务器: 接收并处理来自多源的syslog消息,可存储、过滤和转发。

syslog客户端: 产生日志消息并发送给syslog服务器。

6. 实现工具

rsyslog 是一款在 Linux 和 Unix 系统中广泛使用的 syslog 守护进程。它凭借丰富的高级功能,如灵活的过滤机制和精准的重定向功能,备受用户青睐。

syslog-ng 同样是一款出色的 syslog 守护进程,以强大的性能和高可用性著称,为系统的稳定运行提供坚实保障。

syslog 协议在网络安全、故障排查以及合规性保障等方面扮演着举足轻重的角色。通过该协议,组织能够集中监控并深入分析来自网络基础设施的日志数据,为维护网络稳定、保障信息安全提供有力支持。

二、Linux 系统日志服务程序

systemd-journald, syslogd, 和 rsyslog 都是常见的系统日志服务,各自有不同的特点和功能:

1. systemd-journald

功能:systemd-journald 是 systemd 提供的日志管理服务,用于收集、存储和检索日志数据。

特点:它采用二进制格式存储日志,支持结构化数据和元数据,并能够根据需求动态调整日志存储大小。它与 systemd 协作紧密,可以使用 journalctl 命令来查询和管理日志。

2. syslogd

功能:syslogd 是传统的 Unix/Linux 系统上的基本日志守护进程,负责接收、处理和存储系统和应用程序生成的日志消息。

特点:它通常将日志消息以文本格式写入指定的日志文件,如 /var/log/messages、/var/log/syslog 等。syslogd 的功能相对简单,适合基本的日志记录需求。

3. rsyslog

功能:rsyslog 是 syslogd 的增强版,提供了更多的功能和灵活性,支持复杂的日志消息过滤、转发、格式化等操作。

特点:与传统的 syslogd 不同,rsyslog 支持 TCP 和 TLS 连接,能够进行远程日志记录和集中式日志管理,适用于复杂的日志收集和分发场景。

4. 使用场景和选择

systemd-journald 适用于使用 systemd 的系统,它具备现代化的日志管理功能,支持结构化数据,并拥有强大的查询能力,尤其适合开展系统级的日志分析和诊断工作。

syslogd 更适用于传统的 Unix/Linux 系统,具有轻量级和稳定性的优点,对于简单的日志记录以及本地存储需求,它足以胜任。

rsyslog 则适用于对日志管理功能要求更高的环境,比如复杂的网络环境或者需要远程进行日志记录的场景。其具有较高的灵活性和扩展性,能够很好地满足这类场景的需求。

在实际的使用过程中,选择日志服务需要根据具体的需求和系统环境来确定。例如,在现代化的 systemd 系统中,推荐使用 systemd-journald,以便充分利用其先进的功能和集成优势;而对于传统的 Unix/Linux 系统,可以根据具体的日志管理需求,在 syslogd 或 rsyslog 中做出选择,并进行相应的配置和部署工作。

三、Linux syslog协议相关的API

openlog, closelog, 和 syslog 是用于在 C 语言中进行系统日志记录的标准函数,通常与 syslogd 或 rsyslog 等日志守护进程配合使用。它们的功能和使用方法如下:

1. openlog

void openlog(char *ident, int option, int facility);

功能:openlog 函数用于初始化系统日志记录。它告诉系统如何处理后续的日志消息。

参数解释

ident:一个字符串,通常是程序的名字或标识符,用于标记日志消息的来源。可以为 NULL,表示使用默认标识符。

option:用于指定日志记录的选项,可以使用 LOG_CONS、LOG_NDELAY、LOG_NOWAIT 等常量,控制日志写入的行为。

facility:指定日志消息的设施(facility),如 LOG_USER、LOG_LOCAL0 到 LOG_LOCAL7 等,用于标识日志消息的类别。

2. closelog

void closelog();

功能:closelog 函数关闭之前使用 openlog 打开的日志系统。在程序结束时调用,确保清理和关闭日志记录。

3. syslog

void syslog(int priority, char *format, ...);

功能:syslog 函数用于向系统日志写入一条消息。

参数解释

priority:日志消息的优先级,可以使用 LOG_EMERG、LOG_ALERT、LOG_ERR、LOG_WARNING、LOG_INFO 等常量来表示不同的日志级别。

format:格式化字符串,类似于 printf 的格式,用于指定日志消息的内容。

...:格式化字符串后面的参数,用于填充格式化字符串中的占位符。

4. 使用详解

(1)初始化日志系统:在程序开始时通常会调用 openlog 来初始化日志系统,指定程序标识符和日志设施。

openlog("myprogram", LOG_PID, LOG_USER);

这里指定了程序标识符为 “myprogram”,使用 LOG_PID 选项告诉系统记录每条日志消息的进程 ID,使用 LOG_USER 设施表示这些日志消息属于用户级别。

(2) 记录日志消息:在程序中需要记录日志时,使用 syslog 函数来写入日志消息。

syslog(LOG_INFO, "This is an informational message");

这条语句将一条信息级别的日志消息写入系统日志,内容为 “This is an informational message”。

(3) 关闭日志系统:在程序结束时,调用 closelog 来关闭日志系统,释放相关资源。

closelog();

通过这些函数,程序可以方便地与系统日志守护进程进行交互,记录各种级别和类型的日志消息,帮助管理员监视和诊断应用程序的运行状态和问题。

5. 示例代码

#include <syslog.h>
int main()
{
    // 打开日志,设置日志标识符为 "example"
    openlog("example", LOG_PID|LOG_CONS, LOG_USER);
    // 写入日志消息
    syslog(LOG_INFO, "This is an informational message.");
    syslog(LOG_WARNING, "This is a warning message.");
    syslog(LOG_ERR, "This is an error message.");
    // 关闭日志
    closelog();
    return 0;
}

这段代码展示了如何使用 syslog 函数库来写入不同优先级的日志消息。具体说明如下:

openlog("example", LOG_PID|LOG_CONS, LOG_USER);:打开日志,设置日志标识符为 “example”,并指定选项 LOG_PID(在每条日志消息中包含进程ID)和 LOG_CONS(如果无法写入日志,则将消息输出到控制台)。
LOG_USER 表示使用 USER 设施来存储日志。

syslog(LOG_INFO, "This is an informational message.");:写入一条信息级别的日志消息。

syslog(LOG_WARNING, "This is a warning message.");:写入一条警告级别的日志消息。

syslog(LOG_ERR, "This is an error message.");:写入一条错误级别的日志消息。

closelog();:关闭日志。

在实际使用中,日志消息会被发送到配置好的日志存储位置,比如对于syslogd 日志服务程序来说,默认存储在 /var/log/messages文件。有的系统经过配置后也可能存储在/var/log/syslog。

四、嵌入式Linux主控使用日志服务

在嵌入式 Linux 主控上,一般使用busybox构建根文件系统,busybox的成果物中包含了syslogd程序,其可提供日志服务。比如记录内核日志。

syslogd 通常通过 Syslog 协议(即 UDP 端口 514)接收来自系统和服务器的日志信息。它们并不直接从内核中获取日志信息,而是系统服务或应用程序通过调用标准库函数 syslog() 将日志消息发送到对应端口。
具体过程如下:

内核事件产生:在内核中,当发生某些事件时,系统函数会根据配置写日志到 /proc/kmsg 或 /dev/kmsg。

klogd 读取内核日志:守护进程 klogd (也是busybox成果物)会定期读取 /proc/kmsg 或者 /dev/kmsg 来捕获内核日志。klogd 收到内核日志后,会根据自己的配置进行必要的处理,然后通过 Syslog 协议(UDP 或 Syslog 传输控制协议 TCP 端口 514)将这些消息发送到 syslogd 。

syslogd 或 rsyslogd 接收:syslogd守护进程运行在用户空间,它们会监听 UDP 端口 514 来接收来自 klogd 或者其他系统服务或应用程序的日志消息。例如《三、Linux syslog协议相关的API》中提供的示例代码,编译执行后也会有相关日志信息存储在/var/log/messages文件。

存储和处理:接收到日志消息后,syslogd 根据配置将日志消息存储到指定的日志文件中,并进行相应的处理,如格式化、过滤、转发等。

以我们的用户控制台登录为例,其使用了 busybox 成果物中的 login 程序。在运行过程中,这个程序会调用 syslog 接口来发送日志,从而将登录相关信息记录在 /var/log/messages 文件中。SSH 登录信息的记录方式与之类似,Dropbear 作为一款轻量级的 ssh 程序,其内部同样会调用 syslog 接口进行相关操作 。

原创 ICT系统集成阿祥

标签:服务程序,LOG,syslogd,syslog,消息,Linux,日志,系统日志
From: https://www.cnblogs.com/o-O-oO/p/18687440

相关文章

  • 腾讯云Linux安装 Ubuntu Desktop GUI图形化桌面
    我的系统版本是ubuntu20.04运行以下命令,更新软件源。sudoapt-getupdate运行以下命令,安装图形化桌面。sudoapt-getinstallubuntu-desktop运行以下命令,设置默认启动为图形化桌面。您可以执行systemctlset-defaultmulti-user.target,即可取消图形化界面登录。sudosystemctls......
  • linux mint 22安装新的dock停靠栏
    一,PLANK,安装成功,但是运行后和系统有冲突,无法使用。二,LATTE-DOCK,安装不成功,始终提示缺少依赖文件。三,CAIRO-DOCK,安装成功,安装新的主题后正常使用。下面附安装方法:sudoaptinstallcairo-dock四,安装主题的方法:要下载和安装Cairo-Dock的主题包,可以按照以下步骤操作:1.......
  • Linux下卸载Oracle 11g
    第一种方法:使用oracle自带的runInstaller卸载123[oracle@VM_0_14_centosdeinstall]$cd$ORACLE_HOME[oracle@VM_0_14_centos 11.2.0]$cddeinstall/[oracle@VM_0_14_centosdeinstall]$./deinstall第二种方法:通过删除文件的方式卸载;(即:删除Oracl......
  • linux文本内容和文件操作常用命令
     写在前面:正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。(操作字符串的)通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。(操作文......
  • Linux基础05-指令篇之权限管理【入门级】
    Linux基础主要内容权限管理通配符权限管理指令修改文件/目录的拥有者或者组执行权限:root语法:chown[选项]...[所有者][:[组名]]文件或者目录路径...选项:-c:显示更改部分的信息-f:忽略错误信息-h:修复符号链接==-R:==处理指定目录以及其目录中的所有文件-v:显......
  • Linux基础07-指令篇之vim编辑器【入门级】
    Linux基础Vim编辑器Vim定义本质上我们用Linux自带的编辑器叫做Vi编辑器(类似于记事本,一般用来做文件的编辑),名字取自Visual,它是一个全屏幕文本编辑器(程序)。在Linux系统中Vi是最常用的编辑程序,它的文本编辑功能十分强大,但是使用起来比较复杂。Vim是Vi的增强版,所以Vi的功能Vi......
  • Linux基础06-指令篇之打包压缩解压缩【入门级】
    Linux基础内容提要压缩、打包、解压缩权限说明权限的类型权限的数值普通文件目录/文件夹r:可读4cat,less,more,head,tail等lsw:可写2>(覆盖写入),>>(追加写入),touch,rmmkdir,rmdir,mv(重命名)x:可执行1./文件名(可执行文件)cd,cp,mv(移动)-:无权限0无操作无操作压缩与解压缩压......
  • 【Linux】Linux开发必备六大工具之代码、编译、多人协作开发工具
    个人主页~我们学习Linux是为了什么呢?当然是为了更好的开发,所以我们终于来到了开发之前的一个环节,学完该基础环节,我们就可以上手进行开发了,激动~Linux开发必备工具一、代码工具--vim1、vim基本概念2、vim操作(1)命令模式(2)插入模式(3)底行模式3、配置vim二、编译工具--......
  • Linux usb【4】- gadget configfs介绍
    本文介绍如何通过configfs的方式创建一些usb设备,我们以uac2设备为例介绍一下整个流程。首先看一下driver/usb/gadget/function下的所有文件都是使用DECLARE_USB_FUNCTION_INIT注册一个usb_function_driver。613 #defineDECLARE_USB_FUNCTION(_name,_inst_alloc,_func_......
  • Linux usb【3】- gadget驱动介绍
    本文基于新思的dwc3usb控制器,介绍usb的gadget驱动,kernel版本为5.15。probe刚开始和前面介绍的host驱动是一样的,只不过在dwc3_core_init_mode函数中会选择gadget初始化dwc3_gadget_init。1214 staticintdwc3_core_init_mode(structdwc3*dwc)1215 {1216  structd......