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 文件中打印出相应的日志信息。
  1. #include<linux/security.h>  
  2. #include<linux/sysctl.h>  
  3. static unsigned long long count = 0;  
  4. int task_create_hook(unsigned long clone_flags)  
  5.   {  
  6.     printk("[+geek] call task_create(). count=%llu\n", ++count);      
  7.     return 0;  
  8.   }  
  9.     
  10.   static struct security_operations geek_ops = {  
  11.     .name = "geek",  
  12.     .task_create = task_create_hook,  
  13.   };  
  14.     
  15. static __init int geek_init(void)  
  16.   {  
  17.     printk("[+geek] loading...\n");   
  18.     if(register_security(&geek_ops)){  
  19.         printk("[+geek] register faild\n");   
  20.     }  
  21.     return 0;  
  22.   }  
  23.     
  24. security_initcall(geek_init);  
在linux中使用dmesg命令即可查看内核输出的日志。

2.非内核编程打印日志

若想在非内核的环境下打印日志,就必须要使用syslog这样一个工具了(需要提醒的是ubuntu版本和Red Hat版本有很大区别,ubuntu使用的依旧是syslog,而Redhat和centos等版本则使用rsyslog替换掉系统自带的syslog)。因此我们分两部分对部分日志进行分析。
syslog
若你的系统还是使用的syslog,那就直接运行以下测试代码即可。
  1. #include <syslog.h>  
  2. int main(int argc, char **argv)  
  3. {  
  4.     openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);  
  5.     syslog(LOG_DEBUG,  
  6.            "This is a syslog test message generated by program '%s'\n",  
  7.            argv[0]);  
  8.     closelog();  
  9.     return 0;  
  10. }  

编译生成可执行程序后,运行一次程序将向/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

如果上述方法无法打印syslog,很有可能你的系统已经把rsyslog替换了过去,这样,如果想要打印自己的日志,就需要先对rsyslog配置文件进行修改。
打开  /etc/rsyslog.conf
在最后写下自己日志的文件名称。
[cpp] view plain copy
  1. #Mylog  
  2. local2.* /var/log/mylog  
修改完保存后重启rsyslog服务     :/etc/init.d/rsyslog restart    或service rsyslog restart  或systemctl restart rsyslog

接下来就开始编写一个小的测试方法来验证一下。

[cpp] view plain copy
  1. #include <syslog.h>  
  2. int main(int argc, char **argv)  
  3. {  
  4.     openlog("MyLog", LOG_CONS | LOG_PID, LOG_LOCAL2);  
  5.     syslog(LOG_INFO,  
  6.            "This is a syslog test message generated by program '%s'\n",  
  7.            argv[0]);  
  8.     closelog();  
  9.     return 0;  
  10. }  
编译运行上述代码后,就会在 /var/log 目录下多出一个mylog文件

不出什么问题的话,里面的内容应该是LOG_INFO,This is a syslog test message generated by program ./ 。
到现在,我所了解的linux 下c语言编程所能打印日志的方法已经阐述完毕。希望跟大家多多交流。
也是比较麻烦。直接清空日志内容即可  cat /dev/null > syslog  



sitemap