可以通过uboot 添加time 或者打开CONFIG_PRINTK_TIME 来让通过prink 或者do_syslog 打印log的时候显示时间戳
1044 static bool printk_time = IS_ENABLED(CONFIG_PRINTK_TIME);
1045 module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
前面讲过prink 中的log都是通过console_unlock 来调用console driver来打印log的,在调用console driver之前会调用msg_print_text 来给log前面加上时间戳,我们来看看具体实现
2203 void console_unlock(void)
2204 {
2291 len += msg_print_text(msg, console_prev, false,
2292 text + len, sizeof(text) - len);
2293 if (nr_ext_console_drivers) {
2294 ext_len = msg_print_ext_header(ext_text,
2295 sizeof(ext_text),
2296 msg, console_seq, console_prev);
2297 ext_len += msg_print_ext_body(ext_text + ext_len,
2298 sizeof(ext_text) - ext_len,
2299 log_dict(msg), msg->dict_len,
2300 log_text(msg), msg->text_len);
2301 }
msg_print_text 的实现如下:
1086 static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
1087 bool syslog, char *buf, size_t size)
1088 {
1118 if (buf) {
1119 if (print_prefix(msg, syslog, NULL) +
1120 text_len + 1 >= size - len)
1121 break;
1122
1123 if (prefix)
1124 len += print_prefix(msg, syslog, buf + len);
1125 memcpy(buf + len, text, text_len);
1126 len += text_len;
1127 if (next || newline)
1128 buf[len++] = '\n';
1143 }
msg_print_text 又是调用print_prefix
1063 static size_t print_prefix(const struct printk_log *msg, bool syslog, char *buf)
1064 {
11082 len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
1083 return len;
1084 }
继续调用print_time
1047 static size_t print_time(u64 ts, char *buf)
1048 {
1049 unsigned long rem_nsec;
1050
1051 if (!printk_time)
1052 return 0;
1053
1054 rem_nsec = do_div(ts, 1000000000);
1055
1056 if (!buf)
1057 return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
1058
1059 return sprintf(buf, "[%5lu.%06lu] ",
1060 (unsigned long)ts, rem_nsec / 1000);
1061 }
哈哈哈终于看到sprintf来格式字符串加时间戳了吧
1044 static bool printk_time = IS_ENABLED(CONFIG_PRINTK_TIME);
1045 module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
前面讲过prink 中的log都是通过console_unlock 来调用console driver来打印log的,在调用console driver之前会调用msg_print_text 来给log前面加上时间戳,我们来看看具体实现
2203 void console_unlock(void)
2204 {
2291 len += msg_print_text(msg, console_prev, false,
2292 text + len, sizeof(text) - len);
2293 if (nr_ext_console_drivers) {
2294 ext_len = msg_print_ext_header(ext_text,
2295 sizeof(ext_text),
2296 msg, console_seq, console_prev);
2297 ext_len += msg_print_ext_body(ext_text + ext_len,
2298 sizeof(ext_text) - ext_len,
2299 log_dict(msg), msg->dict_len,
2300 log_text(msg), msg->text_len);
2301 }
msg_print_text 的实现如下:
1086 static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
1087 bool syslog, char *buf, size_t size)
1088 {
1118 if (buf) {
1119 if (print_prefix(msg, syslog, NULL) +
1120 text_len + 1 >= size - len)
1121 break;
1122
1123 if (prefix)
1124 len += print_prefix(msg, syslog, buf + len);
1125 memcpy(buf + len, text, text_len);
1126 len += text_len;
1127 if (next || newline)
1128 buf[len++] = '\n';
1143 }
msg_print_text 又是调用print_prefix
1063 static size_t print_prefix(const struct printk_log *msg, bool syslog, char *buf)
1064 {
11082 len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
1083 return len;
1084 }
继续调用print_time
1047 static size_t print_time(u64 ts, char *buf)
1048 {
1049 unsigned long rem_nsec;
1050
1051 if (!printk_time)
1052 return 0;
1053
1054 rem_nsec = do_div(ts, 1000000000);
1055
1056 if (!buf)
1057 return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
1058
1059 return sprintf(buf, "[%5lu.%06lu] ",
1060 (unsigned long)ts, rem_nsec / 1000);
1061 }
哈哈哈终于看到sprintf来格式字符串加时间戳了吧