博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux日志:syslogd和klogd及syslog
阅读量:5815 次
发布时间:2019-06-18

本文共 4170 字,大约阅读时间需要 13 分钟。

一. 日志守护进程

syslogd和klogd是很有意思的守护进程,syslogd是一个分发器,它将接收到的所有日志按照/etc/syslog.conf的配置策略发送到这些日志应该去的地方,当然也包括从klogd接收到的日志。klogd首先接收内核的日志,然后将之发送给syslogd。

syslogd日志记录器由两个守护进程(klogd,syslogd)和一个配置文件(syslog.conf)组成。klogd不使用配置文件,它负责截获内核消息,它既可以独立使用也可以作为syslogd的客户端运行。syslogd默认使用/etc/syslog.conf作为配置文件,负责截获应用程序消息,还可以截获klogd向其转发的内核消息。支持internet/unix domain sockets的特性使得这两个工具可以用于记录本地和远程的日志。

二. 日志应用编程

 syslog是lib函数,用于向系统发送日志(send messages to the system logger)。

#include 
void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ...); void closelog(void); void vsyslog(int priority, const char *format, va_list ap);

默认的日志操作步骤为openlog() -> syslog()/ vsyslog() -> closelog()。

openlog()的参数ident指向一个字符串,追加到每条日志前,用于标记日志属主,一般为程序名,为NULL时默认是程序名(不统一);

option控制log行为,下列值可OR:

LOG_CONS       Write directly to system console if there is an error while sending to system logger.LOG_NDELAY     Open the connection immediately (normally, the connection is opened when the first message is logged).LOG_NOWAIT     Don't  wait  for child processes that may have been created while logging the message.           (The GNU C library does not create a child process, so this option has no effect on Linux.)LOG_ODELAY     The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called.            (This is the default, and need not be specified.)LOG_PERROR     (Not in POSIX.1-2001 or POSIX.1-2008.)  Print to stderr as well.LOG_PID        Include PID with each message.

facility指定哪种类型程序在发送日志,配置文件可指定不同facility日志可进行不同处理:

LOG_AUTH       security/authorization messagesLOG_AUTHPRIV   security/authorization messages (private)LOG_CRON       clock daemon (cron and at)LOG_DAEMON     system daemons without separate facility valueLOG_FTP        ftp daemonLOG_KERN       kernel messages (these can't be generated from user processes)LOG_LOCAL0 through LOG_LOCAL7   reserved for local useLOG_LPR        line printer subsystemLOG_MAIL       mail subsystemLOG_NEWS       USENET news subsystemLOG_SYSLOG     messages generated internally by syslogd(8)LOG_USER (default)   generic user-level messagesLOG_UUCP       UUCP subsystem

syslog()负责写日志,priority指定日志级别:

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

man手册明确指出不要向format传入用户数据(Never pass a string with user-supplied data as a format, use the following instead)

syslog(priority, "%s", string);

 一般应用程序中都要都其进行封装,以便于直接打印相关级别日志(封装LOG_EMERG级别日志):

#define BUF_SIZE 1024char *ident = "hello";void hello_syslog_emerg(char *format,...){    va_list ptr;    char buf[BUF_SIZE] = {
0}; // ident null or format message null if(!ident || !format) { return; } openlog(ident, 0, LOG_DAEMON); // put log va_start(ptr, format); vsprintf(buf, format, ptr); va_end(ptr); syslog(LOG_EMERG, "%s", buf); return; }

示例:

#include 
#include
#include
#define BUF_SIZE 1024char *ident = "hello";void hello_syslog_emerg(char *format,...){ va_list ptr; char buf[BUF_SIZE] = {
0}; // ident null or format message null if(!ident || !format) { return; } openlog(ident, 0, LOG_DAEMON); // put log va_start(ptr, format); vsprintf(buf, format, ptr); va_end(ptr); syslog(LOG_EMERG, "%s", buf); return; }int main(void){ char cbuf[BUF_SIZE] = {
0}; printf("send one emergency message to system:\n"); scanf("%s", cbuf); hello_syslog_emerg("%s", cbuf); return 0;}
@ubuntu:~/vmlinux$ gcc hello.c -o hello -Wall@ubuntu:~/vmlinux$ ./hello send one emergency message to system:thesystemisoff@ubuntu:~/vmlinux$ Broadcast message from systemd-journald@ubuntu (Sat 2018-05-12 17:12:50 CST):hello[3786]: thesystemisoff

或宏定义封装:

#define ERROR(fmt, ...) do { \    syslog(LOG_ERR, "jail: "fmt, ## __VA_ARGS__); \    } while (0)

 

参考:

1. 

2. 

转载地址:http://urmbx.baihongyu.com/

你可能感兴趣的文章
centos7安装cacti-1.0
查看>>
3个概念,入门 Vue 组件开发
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
论模式在领域驱动设计中的重要性
查看>>
Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布
查看>>
有关GitHub仓库分支的几个问题
查看>>
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Kali linux virtualbox rc=1908 错误解决办法
查看>>
linux软件包管理之三(源代码安装)
查看>>
数据库三范式是什么?
查看>>
[转载]设置Ubuntu自动连接无线,无须再输入密钥环和无线密码
查看>>
Apache配置
查看>>
Ext gridPanel 单元格数据的渲染
查看>>
Android SDK 的下载代理
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>