首页| 论坛| 消息
主题:Qt自制简易好看的日志系统
dd759378563发表于 2019-05-01 02:18
简介预览原理html格式的logQt的log系统融合github仓库链接

简介

一个完善的软件工程,自然是少不了log系统的。
这次涛哥教大家,用最少的代码做一个轻量又好看的log系统。
涛哥知道有现成的log4cpp、log4cplus之类的,也有使用过。
这次是抱着学习的心态来造这个轮子的,造轮子的过程才能学到
更多知识,才能有进步、有提升,难道不是么?

预览

先看一下成果

原理

html格式的log

为了实现 “代码最少” 和 “好看” 的需求,涛哥把log写进了一个html文件。
这样的log相当于一个静态的网页,只要装有浏览器的操作系统,都可以打开并看到上面图示那样的log。
涛哥给这个html文件设计了一个固定的模板的:

TaoLogger

body {
background: #18242b;
color: #afc6d1;
margin-right: 20px;
margin-left: 20px;
font-size: 14px;
font-family: Arial, sans-serif, sans;
}
a {
text-decoration: none;
}
a:link {
color: #a0b2bb;
}
a:active {
color: #f59504;
}
a:visited {
color: #adc7d4;
}
a:hover {
color: #e49115;
}
h1 {
text-align: center;
}
h2 {
color: #ebe5e5;
}
.d,
.w,
.c,
.f,
.i {
padding: 3px;
overflow: auto;
}
.d {
background-color: #0f1011;
color: #a8c1ce;
}
.i {
background-color: #294453;
color: #a8c1ce;
}
.w {
background-color: #7993a0;
color: #1b2329;
}
.c {
background-color: #ff952b;
color: #1d2930;
}
.f {
background-color: #fc0808;
color: #19242b;
}

TaoLogger 日志文件
function objHide(obj) {
obj.style.display="none"
}
function objShow(obj) {
obj.style.display="block"
}
function selectType() {
var sel = document.getElementById("typeSelect");
const hideList = new Set(['d', 'i', 'w', 'c', 'f']);
if (sel.value === 'a') {
hideList.forEach(element => {
var list = document.querySelectorAll('.' + element);
list.forEach(objShow);
});
} else {
var ss = hideList;
ss.delete(sel.value);
ss.forEach(element => {
var list = document.querySelectorAll('.' + element);
list.forEach(objHide);
});
var showList = document.querySelectorAll('.' + sel.value);
showList.forEach(objShow);
}
}

All
Debug
Info
Warning
Critical
Fatal

(如果你不懂html,也没关系,直接拿过去用就好了)
这个模板只使用了一些很基本的html元素和css样式表,筛选器那里用了一点JavaScript。
(筛选器功能,我去请教了一下前端的同事,给了我一个JQuery版本,只要很少几行代码,但是要带上一个大大的JQuery.js。。。)
(涛哥我也写了不少qml,多多少少还是懂点js的,于是就自己写了这么一个筛选器。不到20行代码,真是自己动手丰衣足食啊。)
Log模板的用法很简单的,模板作为html文件的前面部分,接下来每一行log,以追加的方式跟在模板后面就行了。
(html的body结束标记并没有写,浏览器都能正常打开。容错性真的强!)
当然, 每一条log有个格式要求:
山有木兮木有枝,心悦君兮君不知。

就是增加了一对div标记, div的class属性要设置为d、i、w、c、f这几个字符中的一个,分别是
debug、info、warning、critical、fatal的首字母, 这正是Qt所提供的log分类。
设置div的class属性,就是给筛选器用来做筛选。
Log模板的存取文件读取? 不,太慢了。
这就是一段固定的字符串,直接编译进代码里,程序启动的时候直接装载到内存就好了。
那么C++里面,怎么才能装下这段带有转义字符的字符串呢?涛哥的答案是:C++11的 “原始字符串字面量”或者叫 “R字符串”
可以参考这里 cppreference
简单来说,是这样写的:
string logTemplate = R"(xxxxxx)";

只要有了 R"()" 这个写法,括号中间随便写转义字符、换行符都行。当然为了方便让编译器识别哪个
才是真正的’结束括号’,C++11标准提出了括号前后增加分隔符的写法,即:
string logTemplate = R"prefix(xxxxxx)prefix";
左括号的前面和右括号的后面, 是同样的一段字符串作为分隔符就行了。
涛哥的代码里是这么用的
namespace Logger
{
下一页 (1/3)
回帖(6):
6楼:
5楼:往事纯白:
在写的过程中界面是卡住的
感谢反馈,修改了一下。主要是std::thread join了 ..
4楼:在写的过程中界面是卡住的

全部回帖(6)»