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

news/2025/1/23 11:37:57/文章来源:https://www.cnblogs.com/o-O-oO/p/18687440

一、什么是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系统集成阿祥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873641.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年Rust权威指南、Rust程序设计语言中文版PDF下载

本书英文名为《The Rust Programming Language》,中文版名为《Rust权威指南》,社区翻译版名为《Rust程序设计语言》。 本书由 Rust 核心开发团队编写而成,由浅入深地探讨了 Rust 语言的方方面面。Rust程序员必读入门书籍。2025年《Rust权威指南》、《Rust程序设计语言》中文…

NocoBase 本周更新汇总:改进文件存储扩展

本周更新包括:改进文件存储扩展、缺陷修复等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含即将发布的新功能,经过初步测试的版…

102400118 林嘉祚 集训第一专题

AC截图1、Long Loong 本题易知字符串开头为L,结尾为ng,唯一不同的是中间o的个数,于是想到用3个字符串拼接得到目标字符串。(直接用for循环输出似乎更简单) #include <iostream> #include <string> using namespace std;int main() {int n;cin >> n;string…

【Java开发】magic-api:一个Java接口快速开发框架

今天给小伙伴们介绍一个Java接口快速开发框架-magic-api 简介 magic-api 是一个基于 Java 的接口快速开发框架,编写接口将通过 magic-api 提供的 UI 界面完成,自动映射为 HTTP 接口,无需定义 Controller、Service、Dao、Mapper、XML、VO 等 Java 对象即可完成常见的 HTTP AP…

联想 ThinkPad 笔记本T14 CPU 降频解决方案

原因: 在工作中,打开多个 IDE 的情况下,会出现卡顿问题,发现是由于 CPU 降频到 0.5GHz 导致的。 环境: 笔记本是联想 ThinkPad T14 CPU:12th Gen Interl Core i7-1260P 系统为 Window10 专业版解决办法 经过搜索后,适合的方案如下:打开电源的卓越性能模式 在 Windows Po…

ASP.NET Core 中基于 Cookie 的身份鉴权实现步骤

在 ASP.NET Core 应用中,基于 Cookie 的身份鉴权是一种常见的身份验证方式,特别适用于传统的 Web 应用程序。Cookie 能够在用户的浏览器中存储身份验证数据,从而在用户访问应用的不同页面时保持登录状态。 一、配置 Cookie 身份验证 首先,在 Startup.cs 或 Program.cs 文件…

16 个 JavaScript 简写神技,提效 60%!

今天看到一片文章觉得很适合在工作中常常用得到 1. 三元运算符简化条件判断 // 传统写法 let result; if (someCondition) {result = yes; } else {result = no; }// 简写方式 const result = someCondition ? yes : no;2. 空值合并运算符 // 传统写法 const name = user.name…

.NET开源强大的高级日期和时间库

NodaTime 是一个为 .NET 设计的开源高级日期和时间库,提供了比 .NET 框架自带的 DateTime 和 DateTimeOffset 更加丰富和可靠的日期时间操作功能。 1. 安装 NodaTime 首先,通过 NuGet 安装 NodaTime 包: Install-Package NodaTime2. 基本概念 NodaTime 提供了多种日期和时间…

Python运行找不到tcl

运行程序提示如下: 说明D:/python/lib/tcl8.6找不到tcl8.6 解决办法:将D:\python\tcl下的tcl8.6和tk8.6两个文件夹复制到D:/python/lib/下问题得到解决

cad的打印到pdf 页边距处理

修改为微软的打印机, microsoft print to pdf后可以正常打印 但是测试过程中看到微软这个打印无法打印a2图纸 查询后是a2图纸不在默认的微软打印的列表中 按照网上的教程做了增加https://zhidao.baidu.com/question/988163076953180379.html我看图纸比例是按照1.8倍数来的, 按…

DolphinScheduler接口实操(二):如何寻找接口

转载自风_间 上一篇写了《DolphinScheduler接口实操(一):利用接口实现高效批量工作流导入及脚本上线》,通过DolphinScheduler的一些接口来实现导入-上线工作流,那么DolphinScheduler的接口应该怎么找呢?在此简单总结一篇。 接下来以手动执行一次工作流为例。 寻找接口 首…