Linux syslog 日志服务
创始人
2025-05-31 17:07:16
0

文章目录

  • Syslog 概述
    • syslog 协议标准
    • syslog API
    • syslog 日志文件
      • 日志文件介绍
      • 日志配置
      • 产生本地日志
  • 参考文章

Syslog 概述

syslog 常被称为系统日志或系统记录,系统日志通过 syslog 进程记录系统的有关事件,也可以记录应用程序运作事件。通过适当配置,甚至可以实现运行 syslog 协议的机器之间的通信。

早期的 syslog 日志服务对应的是 syslogd 守护进程,而目前很多 linux 发行版本已经使用 rsyslog 服务替换了 syslog 服务预装在 linux 系统中了,相应的守护进程就变成了rsyslogd(ubuntu 18中已经更新为 rsyslog)。

syslog 协议标准

syslog 协议是一种用来在互联网协议(TCP/IP)的网络中传递记录档讯息的标准,属于一种主从式协议:syslog 发送端发送一条文字信息到 syslog 接收端。具体协议如下图所示:

如上图所示,syslog 消息主要分为 priority、head 以及 message 三个部分,priority 是由两个部分组成的——facility、level

  • facility 表明该日志消息是由谁产生的,是内核 kern?还是用户 user?又或是邮件 mail?不同的 facility对应不同的代号,可通过 man 3 syslog 查看:
    LOG_AUTHPRIV          security/authorization messages (private)
    LOG_CRON              clock daemon (cron and at)
    LOG_DAEMON            system daemons without separate facility value
    LOG_FTP               ftp daemon
    LOG_KERN              kernel messages (these can’t be generated from user processes)
    LOG_LOCAL0 through LOG_LOCAL7      reserved for local use
    LOG_LPR               line printer subsystem
    LOG_MAIL              mail subsystem
    LOG_NEWS              USENET news subsystem
    LOG_SYSLOG            messages generated internally by syslogd(8)
    LOG_USER (default)    generic user-level messages
    LOG_UUCP              UUCP subsystem
    
  • level 表明该日志消息的重要程度,是导致系统不能正常使用了的紧急级别 emerg?还是需要被及时处理的警告级别 alert?又或仅仅是需要调试的 debug 级别的信息?同样可通过 man 3 syslog 查看:
    LOG_EMERG      system is unusable
    LOG_ALERT      action must be taken immediately
    LOG_CRIT       critical conditions
    LOG_ERR        error conditions
    LOG_WARNING    warning conditions
    LOG_NOTICE     normal, but significant, condition
    LOG_INFO       informational message
    LOG_DEBUG      debug-level message
    

facility 和 level 分别定义了不同的代号,其各自的宏定义可见 /usr/include/sys/syslog.h 头文件,它们两者的组合构成了 priority 头的值。

syslog API

linux C 中提供了一套系统日志写入的接口—syslog 库,syslog 库可以将应用程序中的日志消息写入日志系统,主要涉及三个函数 openlog,syslog,closelog。如下所示:

#include 
void openlog(const char *ident, int option, int facility);功能:打开一个syslog连接:使用 openlog 函数来连接 syslogd 程序。参数:ident指定的字符串会放入到相应的消息日志中;option有如下可选项:LOG_CONS    Write directly to system console if there is an error while sending to system logger.LOG_NDELAY  Open the connection immediatelyLOG_NOWAIT  Don’t  wait for child processes that may have been created while logging the message.LOG_ODELAY  The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called.LOG_PERROR  (Not in POSIX.1-2001.)  Print to stderr as well.LOG_PID     Include PID with each message.facility有若干可选项,前面已经介绍过。返回值:空。
#include 
void syslog(int priority, const char *format, ...);
功能: 产生一条日志消息以特定的规则分发出去。
参数:priority 优先级,由 facility 和 level 的或运算组成;format 格式化输出,类似于printf函数中的format参数。
返回值:空
#include 
void closelog(void);
功能:关闭用来写日志记录的文件描述符。
参数:无
返回值:空

syslog 日志文件

日志文件介绍

日志一般都在 /var/log 目录下。该目录下有以下几个重要的的日志文件。

  • /var/log/maillog:记录邮件的往来信息,其实主要是记录 sendmail 与 dovecot 所产生的信息。
  • /var/log/dmesg:记录开机开始到现在的内核检测过程所产生的各项信息。如果内核编程的模块中使用printk(),将会把相关信息打印到这里。
  • /var/log/messages:系统发生的重要信息或者是错误信息都会记录在这个文件中,如果系统发生错误,这个文件就是需要查阅的文件之一。
  • /var/log/httpd:这个文件里面主要记录各种网络服务信息。
  • /var/log/cron:这个日志跟例行工作调度有关。即crontab有没有被执行,执行过程中有没有发生错误,在这个日子中均有体现。

上述的这些日志都是系统进程打印出的 log 日志。我们怎么能打印出自己的 log 日志呢?首先,我们要分清楚需求是什么,是通过内核打印出来?还是非内核应用中打印出来?

1、内核打印日志

相信很多使用过内核模块的朋友已经很清楚,在 linux 内核模块中编程的话,使用简单的 printk("helloworld"); 就能达到打印日志的效果。在linux中使用 dmesg 命令即可查看内核输出的日志。

2、非内核编程打印日志

若想在非内核的环境下打印日志,就必须要使用 syslog(或者 rsyslog) 了。若你的系统还是使用的 syslog,那就直接运行以下测试代码:

/**
*filename:syslog_test.c
*/
#include 
#include 
#include 
int main()
{openlog("syslog_test", LOG_PID, LOG_USER);syslog(LOG_INFO, "The pid of syslog_test=%d", getpid());closelog();
}

编译、运行

yxm@192:~/myshare/process_info$ gcc -Wall -g syslog_test.c -o syslog_test
yxm@192:~/myshare/process_info$ ./syslog_test

查看日志

  • Mar 16 23:48:44 是日志记录的时间;
  • 192 是主机名;
  • syslog_test 是 openlog 函数的第一个参数指定的字符串;
  • [126266] 是openlog第二个参数指定了 LOG_PID 的结果;
  • The pid of syslog_test=126266 则是 syslog 函数指定的日志消息内容了。

该条日志输出到了/var/log/syslog 文件内,其实输出路径以及各种 facility 和 level 都是可以通过配置文件进行相应的设置的,我们后面再说。

【注意】大家如果想删除日志,千万不要把日志文件直接删除,如果这样很有可能系统找不到文件,就无法再打印日志,恢复起来也是比较麻烦。直接清空日志内容即可:cat /dev/null > syslog

日志配置

如果需要修改系统日志配置,修改以下两个文件。
1)/etc/rsyslog.conf
2)/etc/rsyslog.d/50-default.conf:日志文件的记录规则和路径

rsyslogd 进程的操作:

sudo service rsyslog restart
sudo service rsyslog stop
sudo service rsyslog start

产生本地日志

1、修改 /etc/rsyslog.d/50-default.conf 配置文件:

在文件最后添加如下一行:

# mylog
local0.* /var/log/mylocal.log

【注意】

  • local0—local7 均可。
  • /var/log/mylocal.log 是自己定义的日志文件。
    • 表示所有的日志,可以保存部分日志,例如 local0.info 只会保留 LOG_INFO 级别的日志。

2、配置完需要重启 rsyslogd 程序

/etc/init.d/rsyslog restart
# 或者
sudo service rsyslog restart
# 或者
systemctl restart rsyslog

3、程序中用以下记入日志

openlog("syslog_test", LOG_PID, LOG_LOCAL0);

程序编译运行后,log 信息将被记录到 mylocal。

4、动态查看日志

tail -f /var/log/mylocal.log | grep syslog_test

参考文章

参考文章1
参考文章2
参考文章3
参考文章4
参考文章5

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...