Linux内核编程学习--syslog等调试技术

目录

1、引言
2、调试方式
-------> 打印调试
-------> syslog
-------> rsyslog

一、引言

调试内核中的各种bug,相比应用程序,更加困难,因为整个内核十分庞大,难跟踪,还容易导致系统崩溃,破坏了现场,所以本篇文章来简单介绍下在linux中的调试方式

二、调试方式

1、调试配置

通常位于 ‘kernel hacking’ 菜单中,其中有很多debug开关,不过我目前没用过,就之后再分析了

2、打印调试
printk

与printf不同的是,printk专用于内核,附加了日志级别,编译时预处理器会将它和消息文本拼接在一起

printk(KERN_WARNING "3w-sas: Shutdown complete.\n");
printk(KERN_ERR "goodix_ts_suspend power on failed\n");

一个为警告log,一个为错误log,以下为所有打印级别

'\kernel\include\linux\kern_levels.h'

#define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
#define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
#define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
#define KERN_ERR	KERN_SOH "3"	/* error conditions */
#define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
#define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
#define KERN_INFO	KERN_SOH "6"	/* informational */
#define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */

#define KERN_DEFAULT	KERN_SOH "d"	/* the default kernel loglevel */

当前内核的默认打印级别设置在如下文件中

'kernel\kernel\printk.c'

#define CONFIG_DEFAULT_MESSAGE_LOGLEVEL 4

/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL

只有优先级小于当前设置的默认级别时,才会打印

修改打印级别

可以通过修改文本文件 ‘/proc/sys/kernel/printk’ 来配置日志打印级别

cat /proc/sys/kernel/printk
4 4 1 7

echo 7 >/proc/sys/kernel/printk
7 4 1 7

(1)第一个参数 7表示小于7优先级消息才会被输出到控制台。

(2)第二个参数4 表示默认的printk消息优先级别,即printk(“hell world”);优先级为4, 由于4<7,故可以被打印到控制台。

(3)第三个参数1 表示可接收的最高优先级,当printk disable控制台输出时,设置第一个参数为1,但是,从内核等级来看,还有优先级0,这个是printk最高级优先级,一般用于内核严重消息打印。比如内存错误或者 watchdog reset.也可以设置第一个和第三个参数为0

(4)第四个参数7 默认控制台优先级,即第一个参数的默认优先级。

syslog

大部分的系统维护都会用到它,也就是网络或系统管理员经常用到的log 文件。daemon在执行时其实是执行两个程序:syslogd和klogd,介绍如下,其分别负责不同种类的log,但全部的信息在系统刚开完机之后, 会全部存放在/var/log/message。

​ klogd:kernel,记录内核相关的日志
​ syslogd:service,记录应用程序的日志

1、klogd
当一开始写入/var/log/message时,klogd所记录的信息会比syslogd 的顺序优先,原因是klogd所记录的是尚未进入操作系统的信息,但其实一开始的这些信息并不是由klogd所记录的,而是自加载kernel 时,就已经开始记录的。在系统尚未进入操作系统阶段,还在加载kernel及执行initrd时,会将信息先记录在/proc/kmsg文件中(因为在 initrd阶段没有实体硬盘可供记录),等进入操作系统执行完klogd后,klogd再将/proc/kmsg的所有内容全数填入/var/log /message文件中,这也是为何在/var/log/message文件的一开始,依然可以看到刚开机在加载kernel以及initrd阶段的信息
如果运行了syslogd,内核消息会追加到’/var/log /message’ 目录下,我们可以直接从该目录下寻找log

Linux系统常见的日志文件

1)/var/log/secure:记录登录系统存取数据的文件;
例如:pop3,ssh,telnet,ftp等都会记录在此.

2)/ar/log/btmp:记录登录这的信息记录,被编码过,所以必须以last解析;
例如:lastb | awk ‘{ print $3}’ | sort | uniq -c | sort -nr | more

3)/var/log/message:几乎所有的开机系统发生的错误都会在此记录;

4)/var/log.boot.log:记录一些开机或者关机启动的一些服务显示的启动或者关闭的信息;

5)/var/log/maillog:记录邮件的存取和往来;

6)/var/log/cron:用来记录crontab这个服务的内容;

7)/var/log/httpd,/var/log/mysqld.log等等文件,记录几个不同的网络服务的记录文件;

8)/var/log/acpid , ACPI - Advanced Configuration and Power Interface,表示高级配置和电源管理接口。
后面的 d 表示 deamon 。 acpid 也就是 the ACPI event daemon 。 也就是 acpi 的消息进程。用来控制、获取、管理 acpi 的状态的服务程序。

9)/var/run/utmp 记录着现在登录的用户;
10)/var/log/lastlog 记录每个用户最后的登录信息;
11)/var/log/btmp 记录错误的登录尝试;
12)/var/log/dmesg内核日志;
13)/var/log/cpus CPU的处理信息;
14)/var/log/syslog 事件记录监控程序日志;
15)/var/log/auth.log 用户认证日志;
16)/var/log/daemon.log 系统进程日志;
17)/var/log/mail.err 邮件错误信息;

18)/var/log/mail.info 邮件信息;

19)/var/log/mail.warn 邮件警告信息;
20)/var/log/daemon.log 系统监控程序产生的信息;
21)/var/log/kern 内核产生的信息;
22)/var/log/lpr 行打印机假脱机系统产生的信息;

2、syslogd
在klogd填入所有kernel加载及initrd阶段的信息之后,接着执行的就是这一节所提到的服务级程序,而这些程序所产生的信息,就由 syslogd负责整理,所以,这些信息会直接加在刚刚klogd的信息后面。在进入操作系统后就没有依照klogd或syslogd的顺序,只要产生信息,就直接依/etc/syslog.conf文件的定义,写入/var/log/m essage信息文件。

从/etc/syslog.conf文件可以找出所有目前系统通过syslogd所记录的信息,有时候在找某软件的信息时,也可以从这个文件中看出要以哪一个信息文件为主,当然前提是该软件必须支持syslogd的信息记录格式。
‘/proc/kmsg’下的log可以直接用’dmesg’查看

rsyslog日志服务

rsyslog是一个C/S架构的服务,可监听于某套接字,帮其它主机记录日志信息,在linux系统中可以分类两个日志:

​ klogd:kernel,记录内核相关的日志

​ syslogd:service,记录应用程序的日志

rsyslog配置

​ 配置文件:/etc/rsyslog.conf, /etc/rsyslog.d/

​ 主程序:/usr/sbin/rsyslogd

​ 模块路径:/usr/lib64/rsyslog/

下面看一个具体的配置文件

#  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.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
kern.*                          -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
mail.*                          -/var/log/mail.log
#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

#
# 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

对应的格式解释

日志定义格式: facility.priority    Target
    facility: 设施,从功能或程序上对日志进行分类,并由专门的工具负责记录日志;
      常用的facility:
        lpr: 打印相关的日志
        auth:认证相关的日志
        user:用户相关的日志
        cron:计划任务相关的日志
        kern:内核相关的日志
        mail:邮件相关的日志
        mark:标记相关的日志
        news:新闻相关的日志
        uucp:文件copy相关的日志
        daemon:系统服务相关的日志
        authpri: 授权相关的日志
        security:安全相关的日志
        local0-local7:自定义相关的日志信息(自定义时可以使用通配符)
        通配符:
           *:所有
           f1,f2,f3......:列表
           !:取反
        
    priority:日志级别
    常用的日志级别:
		debug:   调试
		info:   消息
		notice: 注意
		    warn,warning: 警告
		err,error: 错误
		crit: 严重级别
		alert: 需要立即修改该的信息
		emerg,panic: 内核崩溃,内核恐慌等严重的信息
       通配符:
       *:所有日志级别
       none:没有任何级别,也就是不记录日志信息
         
    
    Target:文件路径
    可以使用的有:
        /var/log/messages
        用户:*当前登录系统的所有用户
        日志服务器:@SERAVER_IP
        管道:| COMMAND

可以说rsyslog就是一个控制器,决定了打印并收集log的类型、位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文艺小少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值