linux系统日志
日志文件的默认路径是:/var/log
下面是几个重要的日志文件的路径及其包含的信息:
-
/var/log/syslog:它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息。
-
/var/log/messages:包括整体系统信息,其中也包含系统启动期间的日志。此外,还包括mail,cron,daemon,kern和auth等内容。
-
/var/log/user.log:记录所有等级用户信息的日志。
-
/var/log/auth.log:包含系统授权信息,包括用户登录和使用的权限机制等。
-
/var/log/daemon.log:包含各种系统后台守护进程日志信息。
-
/var/log/kern.log:包含内核产生的日志,有助于在定制内核时解决问题。
打印日志文件
上述的这些日志都是系统进程打印出的log日志。我们怎么能打印出自己的log日志呢?
首先,我们要分清楚需求是什么,是通过内核打印出来?还是非内核应用中打印出来?
1.内核打印日志
相信很多使用过内核模块的朋友已经很清楚,在linux内核模块中编程的话,使用简单的 printk("helloworld");就能达到打印日志的效果。下述是一个使用LSM的linux内核模块的部分代码,在对模块进行加载后,每一次动作的触发,都会在 /var/log/dmesg 文件中打印出相应的日志信息。
- #include<linux/security.h>
- #include<linux/sysctl.h>
- static unsigned long long count = 0;
- int task_create_hook(unsigned long clone_flags)
- {
- printk("[+geek] call task_create(). count=%llu\n", ++count);
- return 0;
- }
- static struct security_operations geek_ops = {
- .name = "geek",
- .task_create = task_create_hook,
- };
- static __init int geek_init(void)
- {
- printk("[+geek] loading...\n");
- if(register_security(&geek_ops)){
- printk("[+geek] register faild\n");
- }
- return 0;
- }
- security_initcall(geek_init);
在linux中使用dmesg命令即可查看内核输出的日志。
2.非内核编程打印日志
若想在非内核的环境下打印日志,就必须要使用syslog这样一个工具了(需要提醒的是ubuntu版本和Red Hat版本有很大区别,ubuntu使用的依旧是syslog,而Redhat和centos等版本则使用rsyslog替换掉系统自带的syslog)。因此我们分两部分对部分日志进行分析。
syslog
若你的系统还是使用的syslog,那就直接运行以下测试代码即可。
编译生成可执行程序后,运行一次程序将向/var/log/syslog文件添加一行信息如下:
1
|
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'
|
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'
可以看到的是,此程序导入了syslog库函数,使用了syslog函数向syslog文件输出日志,第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。。其中,syslog文件过大后,系统就会把文件分割并压缩,如下图所示。
如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。
还需要提醒的是,大家如果想删除日志,千万不要把日志文件直接删除,如果这样很有可能系统找不到文件,就无法再打印日志,恢复起来
修改完保存后重启rsyslog服务 :/etc/init.d/rsyslog restart 或service rsyslog restart 或systemctl restart rsyslog
rsyslog
如果上述方法无法打印syslog,很有可能你的系统已经把rsyslog替换了过去,这样,如果想要打印自己的日志,就需要先对rsyslog配置文件进行修改。
打开 /etc/rsyslog.conf
在最后写下自己日志的文件名称。
接下来就开始编写一个小的测试方法来验证一下。
编译运行上述代码后,就会在 /var/log 目录下多出一个mylog文件
不出什么问题的话,里面的内容应该是LOG_INFO,This is a syslog test message generated by program ./ 。
到现在,我所了解的linux 下c语言编程所能打印日志的方法已经阐述完毕。希望跟大家多多交流。
也是比较麻烦。直接清空日志内容即可 cat /dev/null > syslog