共享单车(二):项目日志

stdin, stdout, stderr

Linux系统下,当一个用户进程被创建时,与之对应的三个数据流(stdin,stdout和stderr,即三个文件)也会被创建。

stdin,标准输入文件,通常对应着终端的键盘。
stdout,标准输出文件,通常对应着终端的屏幕。
stderr,标准错误输出文件,通常对应着终端的屏幕。
默认情况下,三个数据流对应的文件描述符分别是stdin—0,stdout—1,stderr—2

#include <stdio.h>int main(){fprintf(stdout, "hello");fprintf(stderr, "world");return 0;
}

程序运行结果:

worldhello

stdout 存在一个缓冲区,它的输出会先放在缓冲区里面,遇到换行或者缓冲区刷新时才会输出到屏幕上。而 stderr 不存在缓冲区,也就是说 stderr 的输出内容会直接打印在屏幕上。所以会出现上面的输出结果。

重定向

为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。

命令说明
command > file将输出重定向到 file
command < file将输入重定向到 file
command >> file将输出以追加的方式重定向到 file
n > file将文件描述符为 n 的文件重定向到 file
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file
n >& m将输出文件 m 和 n 合并
n <& m将输入文件 m 和 n 合并
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入

原文链接:linux操作:重定向

Log4cpp

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。

日志库log4cpp剖析:日志记录和框架分析

Log4cpp有如下优点:
提供了可扩展的多种日志记录方式;
提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试;
提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级
可通过配置文件完成所有配置并动态加载;
性能优秀,内存占用小,经过编译后的log4cpp.dll大小仅有160kb;
代码级的平台无关性,Log4cpp源代码经过编译后,适用于大多数主流的操作系统和开发工具;
概念清晰,学习和使用方便,熟练程序员一天之内即可很好地应用log4cpp进行开发。

下载安装:

wget https://nchc.dl.sourceforge.net/project/log4cpp/log4cpp-1.1.x%20%28new%29/log4cpp-1.1/log4cpp-1.1.3.tar.gz
tar xzvf log4cpp-1.1.3.tar.gz
cd log4cpp-1.1.3
./configure --with-pthreads
./configure
make
make install

log4cpp库中主要分三大类:Category(种类)、Appender(附加目的地)、Layout(布局)
category类是日志记录的主要执行类,相当于log4j中的Logger,它负责写日志,就是执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方法。
appender类用来指明目的地,即日志要写到什么地方去。log4cpp已经实现了多种不同目标的输出方式,可以向文件输出日志、向控制台输出日志、向Socket输出日志等。
appender有以下这些:

log4cpp::FileAppender // 输出到文件
log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷
log4cpp::OstreamAppender // 输出到一个ostream类
log4cpp::RemoteSyslogAppender // 输出到远程syslog服务器
log4cpp::StringQueueAppender // 内存队列
log4cpp::SyslogAppender // 本地syslog
log4cpp::Win32DebugAppender // 发送到缺省系统调试器
log4cpp::NTEventLogAppender // 发送到win 事件日志

layout类指明日志输出的格式
日志输出格式控制有: PatternLayout supports following set of format characters:

%% - a single percent sign
%c - the category
%d - the date\n Date format: The date format character may be followed by a date format specifier enclosed between braces. For example, %d{%\H:%M:%S,%l} or %d{%\d %m %Y %H:%\M:%S,%l}. If no date format specifier is given then the following format is used: "Wed Jan 02 02:03:55 1980". The date format specifier admits the same syntax as the ANSI C function strftime, with 1 addition. The addition is the specifier %l for milliseconds, padded with zeros to make 3 digits.
%m - the message
%n - the platform specific line separator
%p - the priority
%r - milliseconds since this layout was created.
%R - seconds since Jan 1, 1970
%u - clock ticks since process start
%x - the NDC
%t - thread name
By default, ConversionPattern for PatternLayout is set to "%m%n".

此外还有Priority(优先级)和NDC(嵌套的诊断上下文)等。
Priority被用来指定Category的优先级和日志的优先级
日志的级别总共有:NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG日志级别的意思是低于该级别的日志不会被记录

NDC则是一种用来区分不同场景中交替出现的日志的手段。

应用时的大概流程:

  1. 定义一个logout类对象,确定输出日志信息的格式
  2. 定义一个appender类对象,确定日志输出到什么地方,然后把layout对象用setlayout方法绑定一下
  3. 定义一个category对象,与appender类对象绑定
  4. 调用category对象进行写日志

Category、Appender 和 Layout 三者的关系如下:
系统中可以有多个 Category,它们都是继承自同一个根,每个 Category 负责记录自己的日志
每个 Category 可以添加多个 Appender,每个 Appender 指定了一个日志的目的地,比如文件、网络、终端
当 Category 记录一条日志时,该复制被写入到所有附加到此Category的Appender
每个 Appender 都包含一个 Layout,该 Layout 定义了这个 Appender 上日志的格式(一个布局仅能绑定一个appender对象)

C/C++编程:log4cpp使用学习

实现

文件:conf/log.conf

#定义Root category的属性
log4cpp.rootCategory=DEBUG, RootLog
#定义RootLog属性
log4cpp.appender.RootLog=RollingFileAppender
log4cpp.appender.RootLog.layout=PatternLayout
#log4cpp.appender.RootLog.layout.ConversionPattern=%d{% m-%d %H:%M:%S %l} [%t][%p]%m%n
log4cpp.appender.RootLog.layout.ConversionPattern=%d{%m-%d %H:%M:%S %l} [%t][%p]%m%n
log4cpp.appender.RootLog.fileName=/home/feng/文档/feng/cppCode/shared_bike/log/shared_bike.log
log4cpp.appender.RootLog.maxFileSize=268435456 #256MB
log4cpp.appender.RootLog.fileNamePattern=shared_bike_%i.log
log4cpp.appender.RootLog.maxBackupIndex=256

文件:src/common/CMakeLists.txt
将 Log4cpp 添加:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)# 搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中
aux_source_directory(. SOURCE_COMMON_FILES)# add_ 1 ibrary (<name>[ STATIC | SHARED |MODULE] [ EXCLUDE_FROM_ALL] sourcel [source2...])
# 构建库供他人模块使用
ADD_LIBRARY(common ${SOURCE_COMMON_FILES})# 用来显式的定义变量
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")# 将指定目录添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(../../third/include)# 将指定目录添加到需要链接的库文件目录之下
LINK_DIRECTORIES(../../third/lib/iniparser)
LINK_DIRECTORIES(../../third/lib/log4cpp)# 该指令的作用为将目标文件与库文件进行链接
TARGET_LINK_LIBRARIES(common iniparser)
TARGET_LINK_LIBRARIES(common log4cpp)
TARGET_LINK_LIBRARIES(common dl)

cmake
在这里插入图片描述
在这里插入图片描述

文件:src/main.cpp

#include <iostream>
#include "iniconfig.h"
#include "configdef.h"#include "Logger.h"//shared_bike.exe conf/shared_bike.ini
int main(int argc, char const *argv[]){if(argc !=3){std::cout <<"Please input shared_bike <config file path> <log file config> !"<<std::endl;return -1;}if(!Logger::instance()->init(std::string(argv[2]))){fprintf(stderr, "init log module failed.\n");return -2;}Iniconfig config;if(!config.loadfile(std::string(argv[1]))){std::cout <<"Load "<< argv[1] << "failed!" << std::endl;LOG_ERROR("Load %s failed.", argv[1]); // Logger::instance()->GetHandle()->errorreturn -3;}st_env_config conf_args = config.getconfig();std::cout <<"[database] ip: "<<conf_args.db_ip.c_str()<<std::endl;std::cout <<"[database] port: "<<conf_args.db_port<<std::endl;std::cout <<"[database] user: "<<conf_args.db_user.c_str()<<std::endl;std::cout <<"[database] pwd: "<<conf_args.db_pwd.c_str()<<std::endl;std::cout <<"[server] port: "<<conf_args.svr_port<<std::endl;LOG_INFO("[database] ip:%s  port:%d  user:%s pwd:%s db:%s [server]port:%d\n",conf_args.db_ip.c_str(),conf_args.db_port,conf_args.db_user.c_str(),conf_args.db_pwd.c_str(),conf_args.db_name.c_str(),conf_args.svr_port);return 0;
}

文件:src/CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)# project name
PROJECT(shared_bike)# 将指定目录添加到编译器的头文件搜索路径之下
INCLUDE_DIRECTORIES(../third/include)
INCLUDE_DIRECTORIES(./common)# 将指定目录添加到需要链接的库文件目录之下
LINK_DIRECTORIES(../third/lib/iniparser)
LINK_DIRECTORIES(../third/lib/log4cpp)
LINK_DIRECTORIES(./common)# 搜集所有在指定路径下的源文件的文件名,将输出结果列表储存在指定的变量中
# 内置变量: CMAKE_SOURCE_DIR 定义了顶级 CMakeLists.txt 所在的文件夹,PROJECT_SOURCE_DIR 定义了包含最近的 project() 命令的 CMakeLists.txt 所在的文件夹
aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_FILES)# 使用给定的源文件,为工程引入一个可执行文件
ADD_EXECUTABLE(shared_bike ${SOURCE_FILES})# 用来显式的定义变量
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic -Wall -m64 -pipe -std=c++0x -lrt -Wno-reorder -Wdeprecated-declarations")TARGET_LINK_LIBRARIES(shared_bike iniparser)
TARGET_LINK_LIBRARIES(shared_bike log4cpp)
# TARGET_LINK_LIBRARIES(${PROJECT_NAME} liblog4cpp.a) //replace
TARGET_LINK_LIBRARIES(shared_bike pthread)
TARGET_LINK_LIBRARIES(shared_bike common)# 增加子目录
ADD_SUBDIRECTORY(common)SET(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
INSTALL(TARGETS shared_bike DESTINATION bin)

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微前端qiankun

webcomponent 微前端&#xff1a;将产品的各个功能模块作为一个个独立的应用系统&#xff0c;然后将这些模块整合起来组装成完整的产品。 具体使用 https://qiankun.umijs.org/zh/guide/tutorial 注意&#xff1a;微应用需要配置打包格式和跨域&#xff1b; 打包格式&#xf…

【C语言 |预处理指令】预处理指令详解(包括编译与链接)

目录 一、编译与链接 1.翻译环境 -预处理 -编译 -汇编 -链接 2.执行环境 二、预定义符号 三、#define定义常量 四、#define定义宏 五、带有副作用的宏参数 六、宏替换的规则 七、 宏函数的对比 八、#和## 1.#运算符 2.##运算符 九、命名约定 十、#undef 十一、 命…

IDEA本地将镜像推送到coding制品仓库

创建制品仓库 假设仓库名称为docker 在IDEA 添加Docker 注册表 IDEA必须先安装docker插件 地址 用户名和密码就是coding的登录名和密码服务器 最好本地安装docker桌面版&#xff0c;更容易操作 测试连接成功 推送镜像到coding的docker制品仓库 选中某个镜像 鼠标右键 注册表…

四.RocketMQ的几种消息发送方式应用

RocketMQ的几种消息发送方式应用 一&#xff1a;普通消息1&#xff09;发送同步消息2&#xff09;发送异步消息3&#xff09;单向发送消息4&#xff09;消费消息-负载均衡模式5&#xff09;消费消息-广播模式 二&#xff1a;顺序消息1.顺序消息指的是:严格按照消息的发送顺序进…

服务器数据恢复—ESXi无法识别数据存储和VMFS文件系统如何恢复数据?

服务器数据恢复环境&#xff1a; 一台某品牌服务器&#xff0c;通过FreeNAS来做iSCSI&#xff0c;然后使用两台同品牌服务器做ESXi虚拟化系统。 FreeNAS层为UFS2文件系统&#xff0c;使用整个存储建一个稀疏模式的文件&#xff0c;挂载到ESXi虚拟化系统。ESXi虚拟化系统中有3台…

react实现时钟翻牌效果

需求&#xff1a;随着数字的变动要求有时钟翻动动效 问题&#xff1a;只在加载时有动效 解决方案&#xff1a;通过判断数字改变&#xff08;这里通过新旧数值变动来判断&#xff0c;不贴代码啦&#xff09;&#xff0c;每次变动的时候手动把animationIterationCount设置为inf…

【blog项目】layui与jquery冲突导致鼠标悬停事件失效、如何调用layui.use()作用域里的方法

blog项目前台展示——查询数据库中的文章类型并展示时出现的bug 1 正常演示 2 用jquery查询数据库并添加到页面后 3 相关代码 <script src"/static/jquery-2.1.4.js"></script> <script src"/static/layui/layui.js"></script> …

dpdk tap设备不能转发大于1500报文问题分析

背景 在使用dpdk做流转发的时候,期望将部分流量转到tap设备,以供Linux协议栈消费。 做测试的时候发现两个问题, 问题一: 报文超过MTU 1500的报文,在tap设备上抓不到报文。 问题二: ifconfig 修改tap设备的MTU为 2000,在tap设备上依旧抓不到报文,猜测这个地方只是修改了L…

MySQL修改表时添加和删除约束

修改表时添加和删除约束 ①非空约束 alter table students modify column s_name varchar(20) not null; #添加 alter table students modify column s_name varchar(20) ; #删除 ②添加默认约束 alter table students modify column age int default 18; #添加 alter tabl…

分布式与一致性协议之CAP(一)

CAP理论 概述。 在开发分布式系统的时候&#xff0c;会遇到一个非常棘手的问题&#xff0c;那就是如何根据业务特点&#xff0c;为系统设计合适的分区容错一致性模型&#xff0c;以实现集群能力。这个问题棘手在当发生分区错误时&#xff0c;应该如何保障系统稳定运行而不影响…

面向对象设计与分析(41)建造者模式builder

文章目录 1 定义2 示例3 实际应用1 定义 看下builder模式的官方定义: The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so the same construction process can create different represe…

基于STM32和阿里云的智能台灯(STM32+ESP8266+MQTT+阿里云+语音模块)

一、主要完成功能 1、冷光模式和暖光模式两种灯光 主要支持冷光和暖光模式两种&#xff0c;可以通过语音模块或手机app远程切换冷暖光 2、自动模式和手动模式 主要支持手动模式和自动两种模式&#xff08;app或语音助手切换&#xff09; (1)自动模式&#xff1a;根据环境光照…

第七天 dfs剪枝优化

第七天 dfs剪枝&优化 1可行性剪枝 2最优性剪枝 3重复性剪枝 题 1 输入 5 5 6 …S. XX.X. …X… …D.X …X… 输出 YES —————————————— 题解 #include<iostream> #include<cstdio> using namespace std; const int N 10; int n,m,T; char …

架构师系列-Nginx、OpenResty(三)- 负载均衡配置

Nginx负载均衡 负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求&#xff0c;一个最基本的upstream模块是这样的&#xff0c;模块内的server是服务器列表&#xff1a; #动态服务器组 upstream dynamicserver {server 172.16.44.47:9001; #…

绿色便携方式安装apache+mysql+tomcat+php集成环境并提供控制面板

绿色便携方式安装带控制面板的ApacheMariaDBTomcatPHP集成环境 目录 绿色便携方式安装带控制面板的ApacheMariaDBTomcatPHP集成环境[TOC](目录) 前言一、XAMPP二、安装和使用1.安装2.使用 三、可能的错误1、检查端口占用2、修改端口 前言 安装集成环境往往配置复杂&#xff0c…

无人机飞行特点

你知道吗&#xff1f;无人机飞行竟然有这么多的神奇特点&#xff01; &#x1f929;想象一下&#xff0c;它们如同天空中的自由精灵&#xff0c;不受束缚地穿梭在云端。 &#x1f681; 首先&#xff0c;无人机的飞行高度和角度都可以随心所欲地调整&#xff0c;无论是俯瞰美景…

自动化立体库安全使用管理制度

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球 【智能仓储物流技术研习社】自行下载 关于自动化立体库安…

四、Flask进阶

Flask-Cache pip install flask-caching安装flask_cache初始化 # ext.py from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_caching import Cachedb SQLAlchemy() migrate Migrate() cache Cache(config{CACHE_TYPE: simple # 缓存…

webpack、rollup、vite、esbuild 前端构建工具到底有什么关系和区别?

一、为什么需要构建工具&#xff0c;前端构建工具具体干了些什么&#xff1f; 前端最开始的开发模式为HTMLJSCSS&#xff0c;写起来痛不欲生&#xff0c;要直面js操作dom、浏览器兼容js / css、代码压缩、开发中要不断手动刷新等问题。直到nodeJS后&#xff0c;出现了angular、…

MybatisPlus(简单CURD,MP的实体类注解,MP条件查询,MP分页查询,MP批量操作,乐观锁,代码生成器)

目录 一、MP入门 1. MP是什么 2. MP使用入门 1 说明 2 准备MP项目环境 1) 添加依赖 2) 创建配置文件 3) 创建引导类 3 MP使用入门 1 创建实体类 2 创建Mapper 3 使用测试 3. 小结 二、MP简单CURD【重点】 1. 说明 2. 示例 3. 小结 三、MP的实体类注解[重点] …