linux/ubuntu下日志系统和syslog函数相关

网上一般介绍日志日志文件时,都说日志文件存放在/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
#include

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    
  
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文件都会增加一条新的记录。

更多信息请参见:

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

你可能感兴趣的:(linux)