国外购物网站平台有哪些,售后网站开发需求文档,电脑网站页面怎么调大小,wordpress简约高端企业通用产品原文地址 Linux日记系统由系统日志监控程序syslogd和内核日志监控程序klogd组成。从它们的命名可以看到#xff0c;这两个监控程序都是守护程序#xff08;daemon#xff09;#xff0c;且都注册成了系统服务。换句话说#xff0c;我们可以在目录/etc/init.d/下找到它们对…原文地址 Linux日记系统由系统日志监控程序syslogd和内核日志监控程序klogd组成。从它们的命名可以看到这两个监控程序都是守护程序daemon且都注册成了系统服务。换句话说我们可以在目录/etc/init.d/下找到它们对应的执行程序并通过service命令对它们进行启动关闭重启等操作。/etc/syslog.conf文件是Linux日记系统的配置文件。下面是本人/etc/syslog.conf文件内容(ubuntu下为/etc/rsyslog.conf) # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Dont log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log 在对这个配置文件进行详细的解释之前我们先看一下在Linux C编程中如何利用syslog进行日记。 syslog APIs Linux C中提供一套系统日记写入接口包括三个函数openlogsyslog和closelog。 调用openlog是可选择的。如果不调用openlog则在第一次调用syslog时自动调用openlog。调用closelog也是可选择的它只是关闭被用于与syslog守护进程通信的描述符。 下面是这三个函数的调用格式 #include syslog.h void openlog(char *ident, int option, int facility); void syslog(int priority, char *format, ...); void closelog(); 其中openlog和closelog都是可选的。不过通过调用openlog我们www.linuxidc.com可以指定ident参数。这样ident将被加到每条日记记录中。ident一般设成程序的名字如在下面例子中的testsyslog #include syslog.h int main(int argc, char *argv[]) { openlog(testsyslog, LOG_CONS | LOG_PID, 0); syslog(LOG_USER | LOG_INFO, syslog test message generated in program %s \n, argv[0]); closelog(); return 0; } 编译生成可执行文件后每运行一次程序将往/var/log/messages添加一条如下的记录 Apr 23 17:15:15 lirong-920181 testsyslog[27214]: syslog test message generated in program ./a.out 格式基本是timestamp hostname ident[pid]log message。其中ident就是我们调用openlog是指定的testsyslog而之所以会打印出[27214]是openlog的option参数中指定了LOG_PID。下面我们详细讨论openlog函数中的optionfacility和syslog函数中的priority参数。 根据/usr/include/sys/syslog.h文件我们可以看到syslog支持的option如下 /* * Option flags for openlog. * * LOG_ODELAY no longer does anything. * LOG_NDELAY is the inverse of what it used to be. */ #define LOG_PID 0x01 /* log the pid with each message */ #define LOG_CONS 0x02 /* log on the console if errors in sending */ #define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ #define LOG_NDELAY 0x08 /* dont delay open */ #define LOG_NOWAIT 0x10 /* dont wait for console forks: DEPRECATED */ #define LOG_PERROR 0x20 /* log to stderr as well */ 我们可以通过与操作结合这些option。syslog支持的faclility如下 /* facility codes */ #define LOG_KERN (03) /* kernel messages */ #define LOG_USER (13) /* random user-level messages */ #define LOG_MAIL (23) /* mail system */ #define LOG_DAEMON (33) /* system daemons */ #define LOG_AUTH (43) /* security/authorization messages */ #define LOG_SYSLOG (53) /* messages generated internally by syslogd */ #define LOG_LPR (63) /* line printer subsystem */ #define LOG_NEWS (73) /* network news subsystem */ #define LOG_UUCP (83) /* UUCP subsystem */ #define LOG_CRON (93) /* clock daemon */ #define LOG_AUTHPRIV (103) /* security/authorization messages (private) */ #define LOG_FTP (113) /* ftp daemon */ facility的ID上面对应的数值与名字的对应关系如下 { auth, LOG_AUTH }, { authpriv, LOG_AUTHPRIV }, { cron, LOG_CRON }, { daemon, LOG_DAEMON }, { ftp, LOG_FTP }, { kern, LOG_KERN }, { lpr, LOG_LPR }, { mail, LOG_MAIL }, { mark, INTERNAL_MARK }, /* INTERNAL */ { news, LOG_NEWS }, { security, LOG_AUTH }, /* DEPRECATED */ { syslog, LOG_SYSLOG }, { user, LOG_USER }, { uucp, LOG_UUCP }, 这个对应关系作用是是将syslog系统调用中facility ID和syslog.conf文件中的配置选项对应起来。后面将详细讲解。facility的作用是指明调用syslog应用的类型。syslog支持的priority如下 #define LOG_EMERG 0 /* system is unusable */ #define LOG_ALERT 1 /* action must be taken immediately */ #define LOG_CRIT 2 /* critical conditions */ #define LOG_ERR 3 /* error conditions */ #define LOG_WARNING 4 /* warning conditions */ #define LOG_NOTICE 5 /* normal but significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */ priority的ID上面对应的数值与名字的对应关系如下 { alert, LOG_ALERT }, { crit, LOG_CRIT }, { debug, LOG_DEBUG }, { emerg, LOG_EMERG }, { err, LOG_ERR }, { error, LOG_ERR }, /* DEPRECATED */ { info, LOG_INFO }, { none, INTERNAL_NOPRI }, /* INTERNAL */ { notice, LOG_NOTICE }, { panic, LOG_EMERG }, /* DEPRECATED */ { warn, LOG_WARNING }, /* DEPRECATED */ { warning, LOG_WARNING }, 这个对应关系的作用和facility情况是相同的都是为了与syslog.conf文件中的配置选项对应起来。priority的作用是指明日记记录的优先级也可以理解成记录时间的严重程度。在实际使用中syslog函数中的priority参数实际上是前面提到的facility和priority的组合通过与操作。 回到前面提到的syslog.conf文件和testsyslog的程序根据前面的分析我们来研究一下为什么testsyslog会将日记记录写到文件/var/log/messages中而不是别的文件。 syslog.conf文件行的基本语法是这样的 [消息类型规则] [处理方案日记文件] 这里需要注意的是两者之间必须用一个或者多个Tab字符分开。消息类型是由”消息来源“facility和”紧急程度“priority构成中间点号连接。如前面syslog.conf文件中的news.crit表示来自news的”关键“状况。这里news表示消息来源crit表示关键状况。通配符*表示一切消息来源如第一条规则*.info将info级以上notice,warning, err, alert, emergpriority表的所有消息发送到日记文件/var/log/messages。而testsyslog程序中调用syslog函数时指定的priority是LOG_USER | LOG_INFO根据上面提到的ID和名字对应的关系对应的消息类型规则是user.info包含在规则*.info中所以日记记录会写到/var/log/messages。 修改syslog.conf文件 一般来说我们希望能够为自己的应用程序指定特定的日记文件。这时候我们就需要修改syslog.conf文件。假设我们现在要把调试debug日记记录写到文件/var/log/debug文件中。第一步要做的是在syslog.conf文件添加如下消息规则作为第一条规则 user.debug /var/log/debug 要是添加的新规则生效第二步我们需要重启syslogd和klogdservice syslog restart(ubuntu下为/etc/init.d/rsyslog restart) 为了测试新规则是否生效我们可以将testsyslog修改如下 #include syslog.h int main(int argc, char *argv[]) { openlog(testsyslog, LOG_CONS | LOG_PID, 0); syslog(LOG_USER | LOG_DEBUG, syslog test message generated in program %s \n, argv[0]); closelog(); return 0; } 编译生成执行文件后每运行一次/var/log/debug文件都会增加一条新的记录