SOUI4新版本的日志系统介绍
原来的日志输出宏用法有点奇怪,感觉总是不够理想。这近有点时间终于把它重整了一下。
以前的用法就不介绍了,重点介绍一下新版本的用法。
在SOUI中使用的日志系统包含两个部分:日志输出宏及日志到文件的打印模块。
日志打印模块主体是抄自一份log4z的代码,然后做了一点简单的修改来适合SOUI的接口。
日志输出宏原来的用法有点奇怪,特别是流式输出日志的样式和传统的C++看起来有点不兼容的样子。
新版本借鉴webrtc里的流式输出日志方法,让日志输出格式更简单。
要在SOUI4中使用日志,可以配置日志打印模块,也可以不配置,配置打印模块,日志可以直接输出到log文件,不配置打印模块,则默认使用OutputDebugString输出到调试窗口。
1 if (pComMgr->CreateLog4z((IObjRef**)&pLogMgr) && pLogMgr)
2 {
3 //uncomment next line to disable log mgr to output debug string.
4 pLogMgr->setLoggerDisplay(LOG4Z_MAIN_LOGGER_ID, false);
5
6 //uncomment next line to record info level log.
7 pLogMgr->setLoggerLevel(LOG4Z_MAIN_LOGGER_ID, LOG_LEVEL_INFO);
8 pLogMgr->start();
9 }
10
11 //定义一个唯一的SApplication对象,SApplication管理整个应用程序的资源
12 SApplication* theApp = new SApplication2(pRenderFactory, hInstance);
13
14 //将日志模块交给SApp管理
15 theApp->SetLogManager(pLogMgr);
下面重点介绍日志输出宏:
SOUI4提供了一系列的日志输出宏:
//流式输出日志,当kLogTag有效时使用,否则编译失败,kLogTag可以是当前定义的宏,也可以是当前对象的成员变量。
#define SLOGD() SLOG(kLogTag,SOUI::Log::LOG_DEBUG,0)
#define SLOGI() SLOG(kLogTag,SOUI::Log::LOG_INFO,0)
#define SLOGW() SLOG(kLogTag,SOUI::Log::LOG_WARN,0)
#define SLOGE() SLOG(kLogTag,SOUI::Log::LOG_ERROR,0)
#define SLOGF() SLOG(kLogTag,SOUI::Log::LOG_FATAL,0) //流式输出日志,每条日志手动指定tag
#define SLOGD2(tag) SLOG(tag,SOUI::Log::LOG_DEBUG,0)
#define SLOGI2(tag) SLOG(tag,SOUI::Log::LOG_INFO,0)
#define SLOGW2(tag) SLOG(tag,SOUI::Log::LOG_WARN,0)
#define SLOGE2(tag) SLOG(tag,SOUI::Log::LOG_ERROR,0)
#define SLOGF2(tag) SLOG(tag,SOUI::Log::LOG_FATAL,0) //格式化输出日志,当kLogTag有效时使用,否则编译失败,kLogTag可以是当前定义的宏,也可以是当前对象的成员变量。
#define SLOGFMTD(logformat, ...) SLOG_FMT(kLogTag,SOUI::Log::LOG_DEBUG,0,logformat,##__VA_ARGS__)
#define SLOGFMTI(logformat, ...) SLOG_FMT(kLogTag,SOUI::Log::LOG_INFO,0,logformat,##__VA_ARGS__)
#define SLOGFMTW(logformat, ...) SLOG_FMT(kLogTag,SOUI::Log::LOG_WARN,0,logformat,##__VA_ARGS__)
#define SLOGFMTE(logformat, ...) SLOG_FMT(kLogTag,SOUI::Log::LOG_ERROR,0,logformat,##__VA_ARGS__)
#define SLOGFMTF(logformat, ...) SLOG_FMT(kLogTag,SOUI::Log::LOG_FATAL,0,logformat,##__VA_ARGS__) //格式化输出日志,每条日志手动指定tag
#define SLOGFMTD2(tag,logformat, ...) SLOG_FMT(tag,SOUI::Log::LOG_DEBUG,0,logformat,##__VA_ARGS__)
#define SLOGFMTI2(tag,logformat, ...) SLOG_FMT(tag,SOUI::Log::LOG_INFO,0,logformat,##__VA_ARGS__)
#define SLOGFMTW2(tag,logformat, ...) SLOG_FMT(tag,SOUI::Log::LOG_WARN,0,logformat,##__VA_ARGS__)
#define SLOGFMTE2(tag,logformat, ...) SLOG_FMT(tag,SOUI::Log::LOG_ERROR,0,logformat,##__VA_ARGS__)
#define SLOGFMTF2(tag,logformat, ...) SLOG_FMT(tag,SOUI::Log::LOG_FATAL,0,logformat,##__VA_ARGS__) //SOUI4内部使用的日志输出,自动将TAG定义为soui4
#define kSoui4Tag "soui4"
#define SSLOGD() SLOG(kSoui4Tag,SOUI::Log::LOG_DEBUG,0)
#define SSLOGI() SLOG(kSoui4Tag,SOUI::Log::LOG_INFO,0)
#define SSLOGW() SLOG(kSoui4Tag,SOUI::Log::LOG_WARN,0)
#define SSLOGE() SLOG(kSoui4Tag,SOUI::Log::LOG_ERROR,0)
#define SSLOGF() SLOG(kSoui4Tag,SOUI::Log::LOG_FATAL,0) #define SSLOGFMTD(logformat, ...) SLOG_FMT(kSoui4Tag,SOUI::Log::LOG_DEBUG,0,logformat,##__VA_ARGS__)
#define SSLOGFMTI(logformat, ...) SLOG_FMT(kSoui4Tag,SOUI::Log::LOG_INFO,0,logformat,##__VA_ARGS__)
#define SSLOGFMTW(logformat, ...) SLOG_FMT(kSoui4Tag,SOUI::Log::LOG_WARN,0,logformat,##__VA_ARGS__)
#define SSLOGFMTE(logformat, ...) SLOG_FMT(kSoui4Tag,SOUI::Log::LOG_ERROR,0,logformat,##__VA_ARGS__)
#define SSLOGFMTF(logformat, ...) SLOG_FMT(kSoui4Tag,SOUI::Log::LOG_FATAL,0,logformat,##__VA_ARGS__)
SLOGx及SLOGx2提供流式输出日志方法,区别在于SLOGx要求当前代码中有一个kLogTag宏或者可访问变量。
例如在一个模块的cpp文件开始使用#define kLogTag “XXX”,配合SLOGx使用,自动在log中生成tag为XXX的日志。
以demo.cpp为例
#define kLogTag "demo"
SLOGFMTE(L"log output using unicode format,str=%s, tick=%u", L"中文", GetTickCount());
SLOGFMTE("log output using ansi format,str=%s, tick=%u", "test", GetTickCount());
SLOGI()<<"test=" << 200;
如果希望使用不同的tag,则可以使用SLOGx2系列宏
1 SLOGI2(“tag1”)<<"test=" << 200;
2 SLOGI2(“tag2”)<<"test=" << 200;
3 SLOGI2(“tag3”)<<"test=" << 200;
除了流式输出日志,另一种常用的日志输出方式是格式化输出,SOUI4提供了SLOGFMTx和SLOGFMTx2两组宏。
SLOGFMTx和SLOGFMTx2都是格式化输出日志,区别和SLOGx与SLOGx2的区别类似。
#define kLogTag "demo"
SLOGFMTE2("newtag",L"log output using unicode format,str=%s, tick=%u", L"中文", GetTickCount());
SLOGFMTE("log output using ansi format,str=%s, tick=%u", "test", GetTickCount());
注意,格式化输出宏中会根据format参数,自动选择以宽字符还是Ansi字符串来格式化输出。如果format是宽字符,则后续的%s对应的字符串也必须是宽字符串。
SSLOGx系列宏是SOUI4内部使用的宏,和前面几组宏唯一的区别在于自动将tag固定为"soui4"。
用户也可以参考这组宏的形式固定一个业务代码中使用的tag。
启程软件 2022-09-23
SOUI4新版本的日志系统介绍的更多相关文章
- ELK日志系统介绍
ELK介绍 需求背景: 业务发展越来越庞大,服务器越来越多 各种访问日志.应用日志.错误日志量越来越多,导致运维人员无法很好的去管理日志 开发人员排查问题,需要到服务器上查日志,不方便 运营人员需要一 ...
- linux日志系统介绍 —— syslog(),openlog(),closelog()
函数使用介绍 这里面的三个函数openlog, syslog.closelog是一套系统日志写入接口.另外那个vsyslog和syslog功能一样,仅仅是參数格式不同. 通常.sysl ...
- ElasticSearch实战系列九: ELK日志系统介绍和安装
前言 本文主要介绍的是ELK日志系统入门和使用教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一 ...
- Slf4j+Log4j日志框架入门
(一).日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的 ...
- 开源组件ELK日志系统配置与管理
ELK日志系统介绍 开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch.Logstash和Kiabana三个开源工具组成.官方网站:https://www.el ...
- Java日志框架Slf4j+Log4j入门
一.日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的日志 ...
- ES系列十七、logback+ELK日志搭建
一.ELK应用场景 在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制.无论是开发人员还是运维人员都无法准确的定位服务.服务器上面出现的种种问题,也没有高效搜索日志内容 ...
- ELK Stack企业日志平台文档
ELK Stack企业日志平台文档 实验环境 主机名 IP地址 配置 系统版本 用途 controlno ...
- 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...
- Bitcask 存储模型
Bitcask 存储模型 Bitcask 是一个日志型.基于hash表结构的key-value存储模型,以Bitcask为存储模型的K-V系统有 Riak和 beansdb新版本. 日志型数据存储 何 ...
随机推荐
- Java方法参数太多怎么办—Part 1—自定义类型
本文由 ImportNew - 王村平 翻译自 dzone.如需转载本文,请先参见文章末尾处的转载要求. 本文是这个系列的第一篇文章,介绍了采用自定义类型处理参数过多的问题.如果你也希望参与类似的系列 ...
- golang之fmt格式化
常用fmt中用于格式化的占位符 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式. Printf("%v", people) {zhangsan}, %+v 打印结构体 ...
- linux之Zip
安装: apt-get) apt-get install zip yum) yum install -y unzip zip 语法: zip [选项] 压缩包名 源文件或源目录列表 注意,zip 压缩 ...
- ZCMU-1179
我的错误: 明知道是大数问题但不是不想写数组或者字符串的结构. 思路 网上查阅后发现可以使用JAVA的大数类型做. 若不使用JAVA则就是整型数组或者字符串的情况. 将a^b结果放在数组当中,实时更新 ...
- 通用的定时任务工具 schedule-server
背景: 我曾经在一个自动化测试平台中集成定时任务,基于 APScheduler 库花了好长时间解决重复执行的问题.定时任务集成在服务中也让服务变得复杂.最后,我们选择了公司其他团队go语言开发的一个定 ...
- nrm安装后无法使用
前情 在使用node.js的过程中,经常会时不是遇到有些包下载安装慢或者失败,有时可以尝试切换源来解决这类问题 坑 通过npm install nrm -g安装完nrm后运行nrm一直报错 Why? ...
- ArkTs布局入门02——弹性布局(Flex)
1.概述 弹性布局(Flex)提供更加有效的方式对容器中的子元素进行排列.对齐和分配剩余空间.容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴方向的尺寸称为主轴尺寸,在交叉轴方向的尺寸称为 ...
- Excel使用IF{1,0}虚拟数组+VLOOKUP实现联合查询
以此案例举例: 使用IF({1,0})建立虚拟数据的方法,整体输入的公式是: =VLOOKUP(E2&F2,IF({1,0},A:A&B:B,C:C),2,0) 输入完公式之后,需要按 ...
- Elm 和 Jetpack Compose 殊途同归及 MVVM 缺点分析
Html.lazy · An Introduction to Elm 可能搞 vdom 的都会到 lazy renderer 这一步,react 可能也可以这么搞或者已经这么搞了我不知道,Elm 提到 ...
- 聊一聊 C#线程池 的线程动态注入 (上)
一:背景 1. 讲故事 在线程饥饿的场景中,我们首先要了解的就是线程是如何动态注入的?其实现如今的ThreadPool内部的实现逻辑非常复杂,而且随着版本的迭代内部逻辑也在不断的变化,有时候也没必要详 ...