Syslog 概述

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

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

syslog 协议标准

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

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

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

syslog API

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

#include <syslog.h>
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 <syslog.h>
void syslog(int priority, const char *format, ...);
功能: 产生一条日志消息以特定的规则分发出去。
参数:
	priority 优先级,由 facility 和 level 的或运算组成;
	format 格式化输出,类似于printf函数中的format参数返回值:空
#include <syslog.h>
void closelog(void);
功能关闭用来写日志记录文件描述符参数:无
返回值:空

syslog 日志文件

日志文件介绍

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

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

1、内核打印日志

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

2、非内核编程打印日志

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

/**
*filename:syslog_test.c
*/
#include <syslog.h>
#include <sys/types.h>
#include <unistd.h>
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

查看日志

该条日志输出到了/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

【注意】

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

原文地址:https://blog.csdn.net/weixin_45004203/article/details/129683006

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_17035.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注