当前位置: 代码迷 >> 综合 >> 怎样实时显示kernel log 、命令行内容如何保存到log日志文件、dmesg、logger、logread
  详细解决方案

怎样实时显示kernel log 、命令行内容如何保存到log日志文件、dmesg、logger、logread

热度:24   发布时间:2023-10-27 10:50:47.0

一、cat /proc/kmsg //实时显示kernel log

dmesg //打印已生成的kernel log
两种办法可以实现实时显示kernel log
1、cat /proc/kmsg

/ # find -name *kmsg*
find -name *kmsg*
./dev/kmsg
./sys/devices/virtual/mem/kmsg
./sys/class/mem/kmsg
./sys/module/printk/parameters/always_kmsg_dump
./proc/kmsg

2、dmesg | tail -f

dmesg |tail -f    //显示文件后十行内容 并在文件内容增加后 自动显示新增的文件内容head example.txt        //显示文件 example.txt 的前十行内容
head -n 20 example.txt  //显示文件 example.txt 的前二十行内容
tail example.txt        //显示文件 example.txt 的后十行内容
tail -n 20 example.txt  //显示文件 example.txt 的后二十行内容
tail -f example.txt     //显示文件 example.txt 的后十行内容 并在文件内容增加后 自动显示新增的文件内容

最后一条命令非常有用 尤其在监控日志文件时 可以在屏幕上一直显示新增的日志信息.

二、不管kernel 的printk还是应用层的printf的log都可以通过主串口直接输出。

应用层实时打印log接口:

printf("write lcd cmd fail reto %d data %d\n",reto,data);
or
logger "This is just a simple log line"

kernel层实时打印log接口:

printk( "keypad KBR%d row%d %d new_state(%d) = %d \n",row,pdata->row_gpios[row],row_asserted(pdata, row),col,new_state[col]);
printk("simcom %s, %d\n", __FUNCTION__,g_enable_switch_spidev_write);

printf和logger区别:
1、都是在应用层添加log,但是printf是c语言代码中加log,logger是linux指令,可以加在脚本中,效果和echo差不多
2、用printf加的log在系统运行时如果代码执行到就可以在主串口中看到,logger加的log需要执行命令logread才能在控制台看到

三、linux/ubuntu系统下怎么保存命令行终端的输入、输出到指定log日志文件

在终端输入以下命令,之后,终端上的全部内容都会保存到文件。

script -q log.txt

这样,在当前目录下就会自动创建一个log.txt文件,保存终端的一切内容。

如果要停止保存,需要使用exit。

参数详解:
>script -t   指明输出录制的时间数据
>script -f   在输出到日志文件的同时,也可以查看日志文件的内容
>script -a   以追加的形式,放入文件
>script -q   静默模式运行,可以后台运行自动记录
>scriptreplay time.txt record.txt
>exit  退出

四、dmesg

  • dmesg -c 在显示的同时,clean掉dmesg缓存中信息
  • dmesg -T 以当前时间的方式显示时间信息,而不是图1所示的开机时间
  • dmesg -d 显示dmesg中两条打印信息的时间间隔
dmesg -c|iwpriv ra0 show stainfo
dmesg | grep MAC -A 20 >/tmp/wifista.txt

如何只显示kernel前100行log?

root@FS1:/tmp# dmesg |head -100     # 只显示前100行log
root@FS1:/tmp# dmesg |tail -100     # 只显示后100行log

五、logger

logger,用于将日志添加到本地/var/log/syslog文件或远程Syslog服务器。 记录器提供了用于添加日志的不同选项,例如设置优先级,指定远程系统或显式定义Syslog端口。
用法:

$ logger "This is just a simple log line"

六、logread

logged则用来读取log.
例如在控制台执行logger “This is just a simple log line”,然后在控制台执行logread,就可以看到。

root@OpenWrt:/# logread
Thu Jan  1 08:00:00 1970 kern.emerg kernel: 
root@OpenWrt:/# logger "This is just a simple log line"
root@OpenWrt:/# logread
Wed Dec 21 09:44:15 2022 user.notice root: This is just a simple log line
#include "common.h"
#include "web_system.h"#define LOGFILE_NAME ("/tmp/log.log")
#define SYSLOG_LEN_MAX (64*1024)int read_log(server *srv,char *log){
    FILE *fp=NULL;char strs[128];int len = 0;int res = -1;fp = fopen(LOGFILE_NAME , "r");if(fp == NULL){
    perror("open error");return -1;}memset(log,'\0',sizeof(log));while(fgets(strs, sizeof(strs), fp)!=NULL){
    //printf("strs = %s \n",strs);len = len + strlen(strs);if(len < SYSLOG_LEN_MAX){
    strcat(log,strs);}else{
    break;}}//printf("resp_buff = %s \n",resp_buff);fclose(fp);return 1;  
}int web_sys_log_get(server *srv,char *log){
    int res =-1;system("rm -rf /tmp/log.log");system("logread >/tmp/log.log");res = read_log(srv,log);if(res !=1){
    memset(log,'\0',SYSLOG_LEN_MAX);strcat(log,"sys log read error\n");}return res;
}int web_sys_log_clear(server *srv,char *json_data,char *json_res){
    system("rm -rf /tmp/log.log");//system("dmesg -c >/dev/null");system("/etc/init.d/log restart");return 1;	
}
  相关解决方案