Linux syslog 日志服务 您所在的位置:网站首页 syslog是什么日志 Linux syslog 日志服务

Linux syslog 日志服务

2023-03-24 03:59| 来源: 网络整理| 查看: 265

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

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 immediately LOG_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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有