当前位置: 首页 > news >正文

如何提升网站速度/站长工具seo综合查询权重

如何提升网站速度,站长工具seo综合查询权重,广州做网站服务,网站开发语言有哪几种后山coder:C中级程序员教程 全集目录(必读)背景介绍日志库是生产环境的程序生成日志的工具。生产环境是指脱离了调试环境,程序放到用户电脑上、手机上、硬件设备上运行对应的环境。调试环境是开发阶段,程序员一边开发代码,一边调试…

后山coder:C++中级程序员教程 全集目录(必读)

背景介绍

日志库是生产环境的程序生成日志的工具。

生产环境是指脱离了调试环境,程序放到用户电脑上、手机上、硬件设备上运行对应的环境。

调试环境是开发阶段,程序员一边开发代码,一边调试查看自己的代码是否符合自己预期的环境。调试环境通常由IDE提供,比如Visual Studio,IntellJ,eclipse,MyEclipse等。

由于程序放到生产环境运行之后,摆脱了程序员的控制,现场发生了错误如果想解决,基本上是毫无办法。所以只能记录程序内存执行的关键路径,重要逻辑流程以及当时各种关键变量的值,将这些信息实时的写入文件里。这样的文件就叫做程序日志

程序日志是程序员分析现场问题,解决现场问题最为重要的途径和手段。

一个好用的日志应该符合下面的这些最基本的需求。

需求

1 支持输出日志到文件,控制台;可以指定单独输出到文件,单独输出到控制台,也可以同时输出到文件和控制台。

2 输出日志到文件时,日志文件的文件名以及路径可以指定。

3 支持按级别输出日志;日志的优先级从低到高提供:“调试”,“信息”,“错误”,“致命”四个日志级别;当指定一个输出级别时,大于等于该级别的日志都可以输出。

4 支持日志输出格式定制;日志输出的内容由以下5中元素组成:日志发生的时间、日志级别、日志内容、生成日志的源代码全路径、生成日志的源代码行号。日志格式定制时可以指定这些元素是否显示在日志中,以及它们的位置顺序。

5 日志做到C++跨平台。

6 日志不阻塞当前输出日志的线程(可以先不支持多线程)。

7 提供测试代码。

效果展示

测试代码

#include <iostream>
#include "Log.h"void funLog(void)
{LOG_DEBUG("Hello funLog Debug!");LOG_INFO("Hello funLog Infor!");LOG_ERROR("Hello funLog Error!");LOG_FATAL("Hello funLog Fatal!");
}int main()
{try{LOG_INIT("log.txt", Log::LOG_LEVEL::DEBUG, Log::LOG_TARGET::ALL, "level_datetime_log_source_line");//LOG_INIT("log.txt", Log::LOG_LEVEL::DEBUG, Log::LOG_TARGET::ALL, "level_datetime_log_source");//LOG_INIT("log.txt", Log::LOG_LEVEL::DEBUG, Log::LOG_TARGET::ALL, "level_log_source_datetime");}catch (const std::exception& e){std::cout << e.what() << std::endl;return -1;}funLog();LOG_DEBUG("Hello main Debug!");LOG_INFO("Hello main Infor!");LOG_ERROR("Hello main Error!");LOG_FATAL("Hello main Fatal!");
}

测试输出:控制台

dd48e6ed4013d9bc8db11e53ded11dff.png

测试输出:文件

d83ce0006b848be06633bc038c07e493.png

设计思路:

1 输出源文件全路径可以使用宏:__FILE__

2 输出源代码行号可以使用宏:__LINE__

3 上面多个需求实现并无顺序,根据自己的理解,由易到难顺序实现即可

4 由于日志初始化影响打印,为了将初始化信息和打印不分散开给用户使用带来记忆负担,考虑用单例实现。为了让程序退出时自己释放单例对象,考虑用静态单例实现日志对象。

5 为了最简化用户使用,考虑用宏定义来包装对日志的调用

#define LOG_DEBUG(str) Log::instance().debug(str, __FILE__, __LINE__)

难点1:

一条日志记录的内容由五部分组成。每一部分可以启用也可以不启用,而且顺序也可以自由调整。

思路:由于用if else枚举所有可能的组合几乎非常困难,所以考虑使用map来解析并存储用户配置的日志各部分,并同时存储日志各部分的优先级。

打印日志的时候,先把和部分内容得到;再按照优先级逐个检查该部分是否需要打印,最后拼接成一条完整的日志记录字符串交给打印模块去输出到目的地。

当前版本百度云下载:实现90%的功能,难点1之前的所有功能

链接:https://pan.baidu.com/s/1EXibuSmjOce4b5yoMqvD7g

提取码:1234

难点2:

日志支持流式操作,比如可以在一条日志里连续输出多个不同类型的变量:

	LOG_DEBUG("Hello main Debug!"<<1<<" from int");

思路:只有流对象的输出操作符重载才可以使用 连续输出操作,类似 a<<"str"<<1;

所以,上面的宏定义应该被翻译成首先获取日志对象的流对象,然后用流对象接管连续输出的内容。其余部分不变即可。

关键代码:

#define LOG_DEBUG(str) Log::instance().getOss()<< str; Log::instance().log( __FILE__, __LINE__, Log::LOG_LEVEL::DEBUG)
//Log类的成员增加
std::ostringstream& getOss(void) { return m_oss; }
std::ostringstream m_oss;

宏定义的调整:原来的一条宏命令列变成两条语句执行,第一条语句把要输出的内容写到流对象;第二条语句获取流对象中被写入的内存输出到日志目的地,重置流对象。

与上一版本的区别:

f49fc7f889d1e35d0a4ceda4bab58deb.png

36302a5f29618ed1a9689f58d40e4760.png

当前版本百度云下载:

链接:https://pan.baidu.com/s/1Zzz4cf3NKzzsTmhGyTgQsw

提取码:1234

难点3:

支持多线程环境下的正常输出日志功能。

思路:解决多线程并发问题的方法总是对临界区增加保护,也就是并发访问控制,让同一时刻只有一个线程可以写入日志。

关键代码:讲要输出的日志内容先用流式输出过去到一个临时的string对象中,然后打印再打印这个string对象。

#define LOG_DEBUG(str1) Log::instance().log((std::ostringstream()<<str1).str(), __FILE__, __LINE__, Log::LOG_LEVEL::DEBUG)

4b11659cde6d9f17031abca5b9577389.png

临时的string对象可以保证多线程环境下是安全的,不会受多线程影响,反而是如果把流式对象设置成成员变量会产生并发场景。

8d523f8c70f5d3bb22471d55cf8d79f1.png

934f02bf3e35fd9a3542824e407899ad.png

下图为单线程环境下运行两个函数:

可以看到先输出 0 2 4 6 8 ,后输出 1 3 5 7 9 。

55430fc81191dccbaf434274f3434331.png

下图是支持多线程的情况下两个函数作为线程函数执行的情况(并发执行,顺序不再保证):

fd124400a1d2a7d0213e1656f9bf200e.png

下图是去掉了锁之后,多线程不再安全,运行出问题的截图(其中一个日志的换行还没打印就被另一条日志插入进来部分日志导致格式乱了):

451ca4cbc83051860411b93d97ea867d.png

当前版本百度云下载:

链接:https://pan.baidu.com/s/1W5isTjHI18VwLhB4TEaqoQ

提取码:1234

说明:

1 以上内容就包括了所有的日志基础功能,很实用;

2 代码量包括测试代码一起260行左右;

3 代码规范,简洁明了。代码设计基本符合应届生可以接受的水平。

祝你好运!

后山coder:C++中级程序员教程 全集目录(必读)

http://www.lbrq.cn/news/1455985.html

相关文章:

  • 在那个上面做网站都能搜到/东莞百度seo推广公司
  • 重庆网购平台/重庆seo技术教程
  • 如何建设手机网站/网站建设7个基本流程
  • 北仑建设银行网站/外贸平台排名
  • 东莞网站建设营销的企业/济南网站seo优化
  • 网站模板可以自己做吗/互联网营销师是干什么
  • 谷歌企业网站seo/做个电商平台要多少钱
  • 做企业营销网站/绍兴seo排名收费
  • ueditor上传wordpress/seo整站排名
  • 织梦网站模板如何安装教程视频/世界羽联最新排名
  • 电商网站建设实训步骤/推广怎么做才可以赚钱
  • 自己做的网站能备案吗/掉发脱发严重是什么原因
  • wordpress怎么加关键词和描述/seo专业培训班
  • 网站关键字优化价格/bt最佳磁力搜索引擎吧
  • 二维码生成器 制作/郑州seo网站排名
  • 设计说明万能模板500字/宁波网站快速优化
  • 网络策划书一般包括哪些内容/湖南正规seo优化报价
  • 公司网站设计/企业建站都有什么网站
  • 南京网站做的好的公司/万能优化大师下载
  • 建设通网站源码/软文推广方案
  • c 企业网站开发/网站开发流程有哪几个阶段
  • 网站密码是什么情况/百度查重软件
  • 重庆做网站建设公司/深圳做seo有哪些公司
  • 游戏交易网站怎么做/营销策略怎么写
  • 做微信公众号的是哪个网站/网络营销组织的概念
  • 网站设计就业方向/网络优化的意义
  • 网站特色栏目重要性/百度推广年费多少钱
  • app和网站的关系/怎么写软文
  • 西宁网站制作费用是多少钱/网站推广策划书
  • 五合一网站定制/友链对网站seo有帮助吗
  • CCF-GESP 等级考试 2025年6月认证C++一级真题解析
  • Nginx负载均衡配置
  • #C语言——刷题攻略:牛客编程入门训练(四):运算
  • STM32-ESP8266通过MQTT与阿里云通讯
  • Rust:如何访问 *.ini 配置文件?
  • 【LeetCode刷题指南】--二叉树的后序遍历,二叉树遍历