Syslog 全面介紹及在 C 語言中的應用

Syslog 概述

????????Syslog 是一種工業標準的日志記錄協議,用于在網絡設備之間傳遞日志消息。它最早由 Eric Allman 在 1980 年代為 BSD Unix 開發,現在已成為系統和網絡管理的重要組成部分。Syslog 協議允許設備將事件消息發送到中央服務器(稱為 syslog 服務器),便于集中監控、審計和故障排除。

基本概念
  • 日志消息結構:每條 Syslog 消息包含時間戳、主機名、生成日志的應用程序或服務名稱,以及具體的日志內容。
  • 設施(Facility):標識日志來源,如內核 (kern)、用戶進程 (user)、郵件系統 (mail) 等,共有 24 種標準設施。
  • 優先級(Priority):表示事件的嚴重程度,從緊急 (emerg) 到調試 (debug) 共 8 個級別。
  • RFC 規范:最初定義于 RFC 3164,后來被更現代的 RFC 5424 取代,后者增加了更多特性如結構化數據和 UTF-8 支持。

Syslog 安裝與配置

Linux 系統

在大多數 Linux 發行版中,Syslog 服務由 rsyslog 或 syslog-ng 提供。以 Ubuntu/Debian 為例:

# 安裝 rsyslog
sudo apt-get install rsyslog# 啟動并設置開機自啟
sudo systemctl start rsyslog
sudo systemctl enable rsyslog# 配置文件位置
/etc/rsyslog.conf       # 主配置文件
/etc/rsyslog.d/*.conf   # 自定義配置文件

配置示例

修改?/etc/rsyslog.conf?可以自定義日志處理規則。例如,將所有日志發送到遠程服務器:

# 啟用 UDP 監聽
$ModLoad imudp
$UDPServerRun 514# 將所有日志發送到遠程服務器
*.* @remote-server-ip:514

配置完成后重啟服務:

sudo systemctl restart rsyslog
Windows 系統

Windows 本身不原生支持 Syslog,但可以通過以下方式實現:

  1. 安裝 Syslog 服務軟件:如 Kiwi Syslog Daemon、EventSentry 等。
  2. 使用 Windows 事件轉發:結合第三方工具將事件轉換為 Syslog 格式。
  3. PowerShell 腳本:編寫腳本將 Windows 事件日志發送到 Syslog 服務器。

Syslog 使用方法

基本命令

在 Linux 中,可以使用以下命令操作 Syslog:

# 查看系統日志
tail -f /var/log/syslog      # Ubuntu/Debian
tail -f /var/log/messages    # CentOS/RHEL# 發送測試消息
logger "This is a test message"# 使用 logger 命令指定設施和優先級
logger -p local0.err "Error occurred in application"
遠程日志收集

配置 Syslog 服務器收集多臺設備的日志:

  1. 在服務器上打開相應端口(通常是 UDP 514)。
  2. 配置防火墻允許 Syslog 流量:
# 允許 UDP 514 端口
sudo ufw allow 514/udp
  1. 在客戶端配置中指定服務器地址:
# 在客戶端 rsyslog 配置中添加
*.* @syslog-server-ip:514
日志分析工具

常用的 Syslog 分析工具有:

  • Logwatch:生成系統日志摘要。
  • Logrotate:管理日志文件大小和輪轉。
  • ELK Stack(Elasticsearch, Logstash, Kibana):強大的日志收集、存儲和可視化平臺。
  • Graylog:開源的日志管理和分析解決方案。

在 C 語言開發中使用 Syslog

系統調用接口

C 語言可以通過標準庫提供的 syslog 系列函數與 Syslog 服務交互:

#include <syslog.h>// 打開與 Syslog 服務的連接
void openlog(const char *ident, int option, int facility);// 發送日志消息
void syslog(int priority, const char *format, ...);// 關閉與 Syslog 服務的連接
void closelog(void);
參數說明
  • ident:添加到每條日志消息的字符串,通常是程序名稱。
  • option:控制日志行為的標志,如 LOG_PID(包含進程 ID)、LOG_CONS(出錯時直接寫控制臺)等。
  • facility:指定日志來源的設施類型,如 LOG_USER、LOG_DAEMON 等。
  • priority:日志級別,如 LOG_ERR、LOG_INFO、LOG_DEBUG 等。
簡單示例

下面是一個簡單的 C 程序,演示如何使用 Syslog:

#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>int main(int argc, char *argv[]) {// 打開 Syslog 連接,設置標識符為 "myapp",記錄進程 ID,使用用戶設施openlog("myapp", LOG_PID, LOG_USER);// 記錄不同級別的日志syslog(LOG_INFO, "Application started with %d arguments", argc);if (argc < 2) {syslog(LOG_WARNING, "No arguments provided, using default configuration");} else {syslog(LOG_DEBUG, "First argument: %s", argv[1]);}// 模擬錯誤情況FILE *file = fopen("nonexistent_file.txt", "r");if (file == NULL) {syslog(LOG_ERR, "Failed to open file: %m");} else {fclose(file);}// 關閉 Syslog 連接closelog();return 0;
}
編譯和運行
gcc -o myapp myapp.c
./myapp test

查看日志輸出:

tail -f /var/log/syslog
# 可能會看到類似以下內容:
# May 30 10:30:00 myhost myapp[1234]: Application started with 2 arguments
# May 30 10:30:00 myhost myapp[1234]: First argument: test
# May 30 10:30:00 myhost myapp[1234]: Failed to open file: No such file or directory
高級用法:自定義日志處理

可以使用?setlogmask()?函數控制日志級別過濾:

#include <syslog.h>// 只允許 LOG_ERR 及更高級別的日志通過
setlogmask(LOG_UPTO(LOG_ERR));// 這條日志會被記錄
syslog(LOG_ERR, "Critical error occurred");// 這條日志會被過濾掉
syslog(LOG_DEBUG, "Debug information");
結構化日志

在支持 RFC 5424 的系統中,可以發送結構化數據:

// 注意:并非所有 Syslog 實現都支持此功能
syslog(LOG_INFO, "SDID@32473 [key1=\"value1\" key2=\"value2\"] Message text");

實際應用場景

守護進程日志

以下是一個簡單守護進程的日志記錄示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <signal.h>
#include <sys/stat.h>volatile sig_atomic_t running = 1;void signal_handler(int sig) {syslog(LOG_INFO, "Caught signal %d, exiting", sig);running = 0;
}int main(void) {// 創建守護進程的代碼(略)// 初始化 Syslogopenlog("my_daemon", LOG_PID | LOG_CONS, LOG_DAEMON);syslog(LOG_INFO, "Daemon started");// 設置信號處理signal(SIGTERM, signal_handler);signal(SIGHUP, signal_handler);// 主循環while (running) {// 執行守護進程任務// 記錄定期狀態syslog(LOG_DEBUG, "Daemon is running normally");sleep(60);}syslog(LOG_INFO, "Daemon stopped");closelog();return 0;
}
錯誤處理與日志記錄

在大型項目中,通常會封裝 Syslog 功能:

// log.h
#ifndef LOG_H
#define LOG_H#include <syslog.h>void log_init(const char *app_name, int facility);
void log_error(const char *format, ...);
void log_warning(const char *format, ...);
void log_info(const char *format, ...);
void log_debug(const char *format, ...);
void log_cleanup(void);#endif// log.c
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include "log.h"void log_init(const char *app_name, int facility) {openlog(app_name, LOG_PID | LOG_CONS, facility);// 根據環境變量設置日志級別const char *loglevel = getenv("LOGLEVEL");if (loglevel && strcmp(loglevel, "DEBUG") == 0) {setlogmask(LOG_UPTO(LOG_DEBUG));} else {setlogmask(LOG_UPTO(LOG_INFO));}
}void log_error(const char *format, ...) {va_list args;va_start(args, format);vsyslog(LOG_ERR, format, args);va_end(args);
}// 其他日志級別函數實現類似...void log_cleanup(void) {closelog();
}

總結

Syslog 是一種強大且靈活的日志記錄機制,適用于各種規模的系統和應用程序。通過集中管理日志,系統管理員可以更輕松地監控系統狀態、排查問題和進行安全審計。在 C 語言開發中,利用標準庫提供的 syslog 接口,開發者可以方便地將日志功能集成到應用程序中,實現專業的日志管理。無論是小型工具還是大型分布式系統,Syslog 都是日志處理的可靠選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82332.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HackMyVM-Art

信息搜集 主機發現 ┌──(kali?kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 03:00 EDT Nmap scan report for 192.168.43.1 Host is up (0.0047s latency). MAC Address: C6:45:66:05:91:88 (Unknown) Nmap scan rep…

[paddle]paddle2onnx無法轉換Paddle3.0.0的json格式paddle inference模型

使用PDX 3.0rc1 訓練時序缺陷檢測后導出的模型無法轉換 Informations (please complete the following information): Inference engine for deployment: PD INFERENCE 3.0-->onnxruntime Why convert to onnx&#xff1a;在端側設備上部署 Paddle2ONNX Version: 1.3.1 解…

DOCKER使用記錄

1、拉取鏡像 直接使用docker pull <image>&#xff0c;大概率會出現下面的報錯信息&#xff1a; (base) jetsonyahboom:~$ docker pull ubuntu:18.04 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while …

Java實習面試題

一、理想汽車一面 1、總結你這個人擅長什么&#xff0c;你的優勢是什么&#xff1f; 2、挑一個項目詳細講講&#xff0c;重點講下你怎么設計的&#xff0c;你的思路是什么&#xff0c;你做的過程中遇到什么難點&#xff0c;怎么克服這些難點&#xff1f; 3、使用RabbitMQ處理…

單元測試報錯

報錯信息如下所示&#xff1a; 五月 30, 2025 5:35:44 下午 org.junit.vintage.engine.descriptor.RunnerTestDescriptor warnAboutUnfilterableRunner 警告: Runner org.junit.internal.runners.ErrorReportingRunner (used on class redis.demo.RedisTemplateTest) does not…

00 QEMU源碼分析中文注釋與架構講解(v8.2.4版本)

QEMU-v8.2.4源碼中文注釋與架構講解 文檔會不定期更新 注釋作者將狼才鯨創建日期2025-05-30更新日期2025-06-02 CSDN閱讀地址&#xff1a;QEMU源碼中文注釋與架構講解Gitee源碼倉庫地址&#xff1a;才鯨嵌入式/qemu 一、前言 其它參考教程的網址&#xff1a; QEMU 源碼目錄…

線段樹刷題記錄

一篇講解很好的線段樹博客&#xff1a;數據結構--線段樹篇_數據結構線段樹-CSDN博客 一、區間查詢 無修改&#xff1a; &#xff08;一&#xff09;最值問題&#xff1a; 1.P1816 忠誠 - 洛谷 思路&#xff1a; 模板。 注意&#xff1a; 無。 代碼&#xff1a; #include …

從一到無窮大 #46:探討時序數據庫Deduplicate與Compaction的設計權衡

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 引言Compaction AlgorithmsCompact Execution Flow Based On VeloxLocalMergeSource的…

大廠前端研發崗位設計的30道Webpack面試題及解析

文章目錄 一、基礎核心二、配置進階三、性能優化四、Loader原理五、Plugin機制六、高級應用七、工程化實戰八、原理深挖九、異常處理十、綜合場景一、基礎核心 Webpack的核心概念是什么? 解析:入口(entry)、輸出(output)、加載器(loader)、插件(plugins)、模式(mode)。Loader…

pytest 常用命令參數

以下是 pytest 常用命令參數 的整理&#xff0c;涵蓋測試運行、過濾、調試、報告等常見場景&#xff0c;方便你高效使用 pytest&#xff1a; 1. 基本測試運行 命令說明pytest運行當前目錄及子目錄下所有測試&#xff08;test_*.py 或 *_test.py&#xff09;pytest path/to/tes…

利用openwrt路由器和隨身WIFI搭建CPE

背景&#xff1a; 最近5GCPE挺火&#xff0c;各種硬件層出不窮&#xff0c;包括DY上很多商家在推的AX3000疊加展銳RM500 5G模塊&#xff0c;自己組裝CPE&#xff0c;成本也在300 看了下開源硬件&#xff0c;其實就是一個開源的openwrt系統&#xff0c;硬件上5G模塊通過usb協議…

Python中使用pandas

使用Pandas進行數據處理和分析 Pandas是Python中最流行的數據處理和分析庫之一。下面我將介紹Pandas的基本使用方法。 安裝Pandas pip install pandas 基本數據結構 1. Series - 一維數組 import pandas as pd# 創建Series s pd.Series([1, 3, 5, 7, 9]) print(s) 2. D…

ISO18436-2 CATII級振動分析師能力矩陣

ISO18436-2021是當前針對針對分析師的一個標準&#xff0c;它對振動分析師的能力和知識體系做了4級分類&#xff0c;這里給出的是一家公司響應ISO18436的CATII級標準&#xff0c;做的一個專題培訓的教學大綱。摘自&#xff1a; 【振動噪音產學技術聯盟】04/19-23 ISO 18436-2…

Qt實現的水波進度條和溫度進度條

一.效果 二.原理 1.水波 要模擬波浪,就要首先畫出一條波浪線,正弦余弦曲線就很適合。 y=A*sin(ω*x+φ)+k y=A*cos(ω*x+φ)+k 這是正弦余弦曲線的公式,要想實現水波效果,那需要兩條曲線,一條曲線的波峰對著另外一條曲線的波谷,要實現這樣的曲線效果,只有讓正弦曲線前移…

《Python 應用中的藍綠部署與滾動更新:持續集成中的實踐與優化》

《Python 應用中的藍綠部署與滾動更新:持續集成中的實踐與優化》 引言 在現代軟件開發中,持續集成與持續部署(CI/CD)已成為標準實踐。面對頻繁發布與升級需求,藍綠部署和滾動更新兩種策略為 Python 應用提供了穩定、安全的發布方式。本文將深入探討這兩種策略的原理、適…

4.2.2 Spark SQL 默認數據源

在本實戰概述中&#xff0c;我們探討了如何在 Spark SQL 中使用 Parquet 格式作為默認數據源。首先&#xff0c;我們了解了 Parquet 文件的存儲特性&#xff0c;包括其二進制存儲方式和內嵌的 Schema 信息。接著&#xff0c;通過一系列命令&#xff0c;我們演示了如何在 HDFS 上…

當前用戶的Git本地配置情況:git config --local --list

通過config命令可以查詢當前用戶的本地配置情況。這些配置項定義了 Git 在當前倉庫中的行為&#xff0c;包括文件權限處理、符號鏈接處理以及大小寫敏感性等。 git config --local --list core.repositoryformatversion0 指定 Git 倉庫的格式版本。版本 0 是最初的格式。 cor…

Flutter 包依賴升級指南:讓項目保持最新狀態

在 Flutter 開發過程中&#xff0c;依賴項管理是確保項目順利運行和持續優化的關鍵環節。依賴項是項目中不可或缺的外部庫&#xff0c;它們提供了各種功能&#xff0c;從 UI 組件到數據處理工具&#xff0c;幫助開發者快速構建應用。然而&#xff0c;隨著時間的推移&#xff0c…

【深度學習】實驗四 卷積神經網絡CNN

實驗四 卷積神經網絡CNN 一、實驗學時&#xff1a; 2學時 二、實驗目的 掌握卷積神經網絡CNN的基本結構&#xff1b;掌握數據預處理、模型構建、訓練與調參&#xff1b;探索CNN在MNIST數據集中的性能表現&#xff1b; 三、實驗內容 實現深度神經網絡CNN。 四、主要實驗步…

SpringBoot高校宿舍信息管理系統小程序

概述 基于SpringBoot的高校宿舍信息管理系統小程序項目&#xff0c;這是一款非常適合高校使用的信息化管理工具。該系統包含了完整的宿舍管理功能模塊&#xff0c;采用主流技術棧開發&#xff0c;代碼結構清晰&#xff0c;非常適合學習和二次開發。 主要內容 這個宿舍管理系…