网上一般介绍日志日志文件时,都说日志文件存放在/var/log/messages中,但是其实一般系统不同,日志文件存放的目录以及文件名都不尽相同。在ubuntu 3.8.0-19-generic下,日志文件存在于/var/log/syslog文件中,而非前面说说的那样。
而对于配置文件,在ubuntu 3.8.0-19-generic下,存在于/etc/rsyslog.conf中(该文件指出了,所有配置文件都在/etc/rsyslog.d目录下),而不是一般所说的/etc/syslog.conf中。当然这个也都不是绝对的。用户可以自己编辑日志配置文件,将配置写入到不同的、指定的文件中去。
该文件如下:
# /etc/rsyslog.conf Configuration file for rsyslog. # # For more information see # /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html # # Default logging rules can be found in /etc/rsyslog.d/50-default.conf ################# #### MODULES #### ################# $ModLoad imuxsock # provides support for local system logging $ModLoad imklog # provides kernel logging support #$ModLoad immark # provides --MARK-- message capability # provides UDP syslog reception #$ModLoad imudp #$UDPServerRun 514 # provides TCP syslog reception #$ModLoad imtcp #$InputTCPServerRun 514 ########################### #### GLOBAL DIRECTIVES #### ########################### # # Use traditional timestamp format. # To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # Filter duplicated messages $RepeatedMsgReduction on # # Set the default permissions for all log files. # $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 $PrivDropToUser syslog $PrivDropToGroup syslog # # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf 指出配置文件的所在
而/etc/rsyslog.d目录下,存在两个配置文件,分别为20-ufw.conf、50-default.conf。系统默认的配置信息存在于50-default.conf中。
openlog函数原型如下:
void openlog( char *ident, int option, int facility)
openlog(3)有三个参数,第一个参数是标志字符串,也就是日志中的第5个字段,不设的话缺省取程式名称;
第二个参数是选项,是下面一些标志位的组合:
LOG_CONS:日志信息在写给日志服务器的同时打印到终端
LOG_NDELAY:即时记录日志
LOG_PERROR:把日志信息也输出到标准错误流
LOG_PID:在标志字段中记录进程的PID值
第三个参数是说明日志类型的,定义了以下类型(意思简单明了):
LOG_AUTH
LOG_AUTHPRIV
LOG_CRON
LOG_DAEMON
LOG_KERN
LOG_LOCAL0 through LOG_LOCAL7
LOG_LPR
LOG_MAIL
LOG_NEWS
LOG_SYSLOG
LOG_USER(default)
LOG_UUCP
syslog函数原型如下:
void syslog(int priority, const char *format, ...);
这其中
priority一般为facility和priority两值的或操作,如:LOG_USER | LOG_DEBUG、LOG_KERN | LOG_INFO等等。
syslog支持的faclility如下:
/* facility codes */ #define LOG_KERN (0<<3) /* kernel messages */ #define LOG_USER (1<<3) /* random user-level messages */ #define LOG_MAIL (2<<3) /* mail system */ #define LOG_DAEMON (3<<3) /* system daemons */ #define LOG_AUTH (4<<3) /* security/authorization messages */ #define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ #define LOG_LPR (6<<3) /* line printer subsystem */ #define LOG_NEWS (7<<3) /* network news subsystem */ #define LOG_UUCP (8<<3) /* UUCP subsystem */ #define LOG_CRON (9<<3) /* clock daemon */ #define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ #define LOG_FTP (11<<3) /* 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文件中的配置选项对应起来。 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文件行的基本语法是这样的:
[消息类型(规则)] [处理方案(日记文件)]
这里需要注意的是,两者之间必须用一个或者多个Tab字符分开。消息类型是由”消息来源“(facility)和”紧急程度“(priority)构成,中间点号连接。
本系统中日志配置文件(50-default.conf)说明如下:
# Default rules for rsyslog. # # For more information see rsyslog.conf(5) and /etc/rsyslog.conf # # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log #指出auth.*和authpriv.*消息存放于/var/log/auth.log中,就是关于验证的一些日志信息 *.*;auth,authpriv.none -/var/log/syslog #除了上面的,其他的日志信息都存放于/var/log/syslog中 #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log #关于内核的日志信息存放于/var/log/syslog中 #lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log #关于邮件的日志信息存放于/var/log/syslog中 #user.* -/var/log/user.log # # Logging for the mail system. Split it up so that # it is easy to write scripts to parse these files. # #mail.info -/var/log/mail.info #mail.warn -/var/log/mail.warn mail.err /var/log/mail.err # # Logging for INN news system. # news.crit /var/log/news/news.crit news.err /var/log/news/news.err news.notice -/var/log/news/news.notice # # Some "catch-all" log files. # #*.=debug;\ # auth,authpriv.none;\ # news.none;mail.none -/var/log/debug #*.=info;*.=notice;*.=warn;\ # auth,authpriv.none;\ # cron,daemon.none;\ # mail,news.none -/var/log/messages # # Emergencies are sent to everybody logged in. # *.emerg :omusrmsg:* # # I like to have messages displayed on the console, but only on a virtual # console I usually leave idle. # #daemon,mail.*;\ # news.=crit;news.=err;news.=notice;\ # *.=debug;*.=info;\ # *.=notice;*.=warn /dev/tty8 # The named pipe /dev/xconsole is for the `xconsole' utility. To use it, # you must invoke `xconsole' with the `-file' option: # # $ xconsole -file /dev/xconsole [...] # # NOTE: adjust the list below, or you'll go crazy if you have a reasonably # busy site.. # daemon.*;mail.*;\ news.err;\ *.=debug;*.=info;\ *.=notice;*.=warn |/dev/xconsole
上述文件中,比如:mail.* -/var/log/mail.log中,存在一个“-”,这表示是使用异步的方式记录, 因为日志一般会比较大。
配置文件格式基本如下:
格式::
日志设备(类型).(连接符号)日志级别 日志处理方式(action)
日志设备(可以理解为日志类型):
———————————————————————-
auth –pam产生的日志
authpriv –ssh,ftp等登录信息的验证信息
cron –时间任务相关
kern –内核
lpr –打印
mail –邮件
mark(syslog)–rsyslog服务内部的信息,时间标识
news –新闻组
user –用户程序产生的相关信息
uucp –unix to unix copy, unix主机之间相关的通讯
local 1~7 –自定义的日志设备
日志级别:
———————————————————————-
debug –有调式信息的,日志信息最多
info –一般信息的日志,最常用
notice –最具有重要性的普通条件的信息
warning –警告级别
err –错误级别,阻止某个功能或者模块不能正常工作的信息
crit –严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert –需要立刻修改的信息
emerg –内核崩溃等严重信息
none –什么都不记录
从上到下,级别从低到高,记录的信息越来越少
这样通过编辑或了解日志配置文件,你可以发送指定日志信息到相应文件中去,比如如下代码,就是将信息写入到/var/log/mail.log日志文件中去:
#include<stdio.h> #include<syslog.h> int main(int argc,char*argv[]) { openlog("xxxx",LOG_CONS | LOG_PID,0); syslog(LOG_INFO|LOG_MAIL,"this is the test!xxxx,info");/*这里LOG_INFO和LOG_MAIL不分先后 */ closelog(); return 0; }
在/var/log/mail.log中,出现如下条目:
Sep 421:12:12 ubuntu xxxx[4928]: this is thetest!xxxx,info
如修改50-default.conf文件,可以指定特定的日志文件。假设我们现在要把调试(debug)日记记录写到文件/var/log/debug文件中。第一步要做的是,在配置文件添加如下消息规则作为第一条规则:
user.debug /var/log/debug
要是添加的新规则生效,第二步我们需要重启rsyslogd,/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; }
更多信息请参见:
http://www.cnblogs.com/wangkangluo1/archive/2012/05/30/2526011.html
http://www.yijiaqing.cn/blog/article.asp?id=477
http://blog.csdn.net/telehiker/article/details/1830575
本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008