网站建设中两个月了,wordpress pv,提高工作效率的措施,做商城网站会不会被攻击日志方案
同步日志方案#xff1a;立即输出日志记录的方案才能继续执行其他任务。
异步日志方案#xff1a;先抛出一个日志记录的任务到某个地方#xff0c;不马上执行打印也不影响往下执行其他任务。
二者关键区别是产生日志记录并调用相关的日志任务接口之后#xff0…日志方案
同步日志方案立即输出日志记录的方案才能继续执行其他任务。
异步日志方案先抛出一个日志记录的任务到某个地方不马上执行打印也不影响往下执行其他任务。
二者关键区别是产生日志记录并调用相关的日志任务接口之后是否需要马上打印才能往下执行其他任务。
使用多线程的日志方案不一定是异步日志多线程也能通过锁实现日志的串行打印。
使用单线程的也不一定是同步日志方案也有可能通过网络通信将日志异步地抛给其他节点完成打印日志的任务。
Spdlog介绍
Spdlog是性能极高的C日志库。
Spdlog的特点
零成本抽象spdlog主要编程语言是CC的设计理念之一就是零成本抽象。零成本抽象主要通过内联函数和模板实现。抽象意思是先放置一个大致的框架在代码中等到真正使用的时候稍加输入和调用就能迅速地构建出要使用的复杂实例或数据结构不用从0开始编写。零成本指的是相比起用C语言从0开始构建的实例性能成本几乎一样没有额外的资源开销同时大大减少了开发成本。
可异步进行日志记录把日志信息发送到线程池异步地进行处理减少对主线程的影响。用户可以自定义线程的个数与队列的大小。如果队列已满可选抛弃部分日志或者阻塞。
高效格式化类似python的.format方法。
Spdlog的输出控制
Spdlog日志级别日志级别非spdlog独有由低到高重要等级从轻到重trace、debug、info、warn、error、critical。
Spdlog多种输出目标可以把日志输出到控制台、文件或者远程服务器。
格式化输出类似python的.format方法。
Spdlog抽象模型 Registry管理logger/async logger logger/async logger管理并输出到sinksink把日志按某种格式输出到目的地async logger需要依赖一个thread pool。
spd各部件主要功能
用伪代码介绍
Register
register是一个全局的单例。如果没有显式地创建一般在创建logger的时候会自动创建。
Spdlog::register_logger(std::shared_ptrlogger new_logger) //把logger配置到register中去进行管理
Spdlog::get(logger_name) #获取logger
Logger
如果没有显式地创建而是直接调用spd相关的输出函数会自动创建默认参数的logger。
Flush策略 #指定sink把日志刷到目的地的方式
Logger-log(…) #输入日志到sink
Set_level #设置日志级别只有大于等于设置的level才能输出出去
Async logger
Logger-log(…) #在异步日志中仅仅是发布一个消息到线程池
Sink
Set_level #自定义日志级别
Set_pattern #自定义日志格式
Set_formatter #补充Set_pattern的功能
Spdlog的使用
安装
方法一 方法二 初级应用 把日志按默认格式输出到控制台背后会按默认参数创建logger和register并完成注册。
创建logger
Spdlog工厂方法创建
工厂方法的目的屏蔽复杂的创建对象的流程。
工厂设计模式有多个具体工厂类继承自一个抽象类有多个具体产品类继承自另一个抽象类。每个具体工厂类里放置对应的具体产品生产类只要创建了一个具体工厂实例就能调用具体的产品生产、使用等相关函数。
Spdlog里由很多头文件不同的头文件里的有不同的“工厂”。
比如daily_file_sink.h指向的是把不同的日期的日志分开记录的“工厂”hourly_file_sink是把每小时的日志分开记录的“工厂”mongo_sink.h是把日志写到mongo数据库的“工厂”ratating_file_sink.h是把日志文件按大小或者条数分割的“工厂”。 需要导入相关的头文件才能实现具体的“工厂”。用相应的头文件里的函数就能实现工厂的实力并“生产”对应的“产品”了。
Mtmultigthread。Stsingle thread。
这里的stdout_color_mt主要做了几件事情
生成了一个对应的patten formatter(日志的输出格式)基于默认的sink创建了一个logger因为logger创建需要sink参数。给logger起了一个名字“console”。把logger注册到register。Register没有显式地创建而是在logger创建的时候自动创建的单例。
在工厂模式的封装下这些复杂的步骤和流程都被隐藏了。
手工方法创建
把工厂模式下被隐藏的步骤全部由自己显式书写在这种模式下更方便设置多个日志的输出sink参考sink模块。
创建sink
常规sink 如图创建两个sink都将其绑定到logger上于是logger可以输出日志到终端和文件上。
自定义pattern sink2被修改了输出格式。
%^表示日志级别的起始颜色标记。这个占位符可以用于在彩色控制台输出中设置日志级别的颜色。 %l表示日志级别的占位符。它将被替换为实际的日志级别例如 info、error 等。 %$表示日志级别的结束颜色标记。这个占位符用于终止彩色控制台输出中的日志级别颜色。 %v表示日志消息的占位符。它将被替换为实际的日志消息内容。
自定义formmater formmater一般和pattern一起使用是对pattern的补充。
class my_formatter_flag是固定用法不必深究只需要关注小红圈里的自定义的text的值。formatter-add_flagmy_formatter_flag(*) 是往pattern里插入了一个*也就是占位符*未来这个占位符会被替换成hct。
创建异步日志 如果先创建了一个队列8292线程数量为8的线程池。选择异步工厂的数据类型创建logger并导入线程池。最后一个参数表示如果等待队列已满覆盖队列里存在时间最长是日志事件。类似的还有
block: 当日志消息队列已满时调用线程将被阻塞直到有空间来写入新的消息。这种策略可以确保不会丢失任何日志消息但可能会导致调用线程的阻塞。
discard_log_msg: 当日志消息队列已满时新的日志消息将被直接丢弃而不进行任何处理。这可能会导致丢失部分日志消息。
discard_policy: 与 discard_log_msg 类似当日志消息队列已满时新的日志消息将被丢弃。但是相比于 discard_log_msgdiscard_policy 会尝试创建一个新的日志消息对象以便在资源释放后可以重新使用。这样可以减少内存分配的开销。
设置flush策略
sink输出日志一般都是先输出到缓存的什么时候把日志记录从缓冲区刷到磁盘中我们可以为此设置策略。