Linux的日誌系統一直以來都是在linux上開發必學的一部分內容。之前在學習OpenStack的時候,在對openstack組件的發生的錯誤進行調試時,老師就說要多看日誌的報錯,從這裏找到相關線索再去修改配置文件。結果很多的報錯都是通過組件對應的日誌文件反映出來而修改成功的,因此使用好linux日誌系統對了解linux編程有很大的幫助。
日誌文件簡述
其中日誌一般都在/var/log目錄下。該目錄下有以下幾個重要的的日誌文件。
/var/log/maillog:記錄郵件的往來信息,其實主要是記錄sendmail與dovecot所產生的信息。
/var/log/dmesg:記錄開機開始到現在的內核檢測過程所產生的各項信息。如果內核編程的模塊中使用printk(),將會把相關信息打印到這裏。
/var/log/messages:系統發生的重要信息或者是錯誤信息都會記錄在這個文件中,如果系統發生錯誤,這個文件就是需要查閱的文件之一。
/var/log/httpd:這個文件裏面主要記錄各種網絡服務信息。
/var/log/cron:這個日誌跟例行工作調度有關。即crontab有沒有被執行,執行過程中有沒有發生錯誤,在這個日子中均有體現。
打印日誌文件
1.內核打印日誌
- #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.非內核編程打印日誌
- #include <syslog.h>
- int main(int argc, char **argv)
- {
- openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
- syslog(LOG_DEBUG,
- "This is a syslog test message generated by program '%s'\n",
- argv[0]);
- closelog();
- return 0;
- }
編譯生成可執行程序後,運行一次程序將向/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'
如果我們的程序要使用系統日誌功能,只需要在程序啓動時使用openlog函數來連接syslogd程序,後面隨時用syslog函數寫日誌就行了。
rsyslog
- #Mylog
- local2.* /var/log/mylog
- #include <syslog.h>
- int main(int argc, char **argv)
- {
- openlog("MyLog", LOG_CONS | LOG_PID, LOG_LOCAL2);
- syslog(LOG_INFO,
- "This is a syslog test message generated by program '%s'\n",
- argv[0]);
- closelog();
- return 0;
- }
轉載自:http://blog.csdn.net/ls7011846/article/details/52626952