网上一般介绍日志日志文件时,都说日志文件存放在/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;
}
更多信息请参见:
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