导航:首页 > 编程语言 > pythonglog使用

pythonglog使用

发布时间:2022-07-17 21:31:53

‘壹’ 如何解决使用glog和gflags时遇到的错误

错误是这样的:

/usr/local/lib/libgflags.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status
glog是通过下面方式安装的:
sudo apt-get install build-essential
sudo apt-get install vim cmake git
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
在上面的安装中同时安装了gflags,不仅如此,我还在git上下载了gflags的源码也进行了安装。
解决方法:
我对下载的gflags源码进行编译,在cmake时候加入了expor CXXFLAGS="-fPIC"、make VERBOSE=1就可以正常使用gflags和glog了。
即:
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install

‘贰’ 安装caffe一定要用cuda吗

如果你的caffe需要使用GPU计算,就一定要按照cuda,cuda相当于是专门用于GPU的语言。如果你只使用CPU计算,则不需要GPU,同理也就不需要cuda

‘叁’ linux下无cuda怎么pip安装pytorch

linux下安装caffe(无cuda)以及python接口
caffe(8)
主要过程稍微记录一下:
1.安装BLAS
sudo apt-get install libatlas-base-dev

2.安装依赖项
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler liblmdb-dev
3.安装glog
这个要FQ,我放在我的网络云上了。
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make
sudo make install

4.安装gflags

wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make
sudo make install

这一步需要cmake,如果没有安装可以用 sudo apt-get install cmake 安装。
5.安装lmdb
git clone https://gitorious.org/mdb/mdb.git
cd mdb/libraries/liblmdb
make
sudo make install

如果没有安装Git,也要用 sudo apt-get install git 来安装。
注:如果可以FQ,只用下面一句就可以安装gflags,glog和lmdb了,省了3,4,5这三步。
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

6.下载Caffe
git clone git://github.com/BVLC/caffe.git

7.安装Caffe
cd caffe
cp Makefile.config.example Makefile.config

因为这里没有gpu,所以需要设置Makefile.config文件中的CPU_ONLY:= 1,把这句的注释去掉就可以了。
然后编译
make all
make test
make runtest

安装好以后我们就可以试着在mnist上跑一下lenet了。
1.首先获取mnist数据
cd caffe
./data/mnist/get_mnist.sh

2.然后创建lenet
./examples/mnist/create_mnist.sh

注意一定要在caffe的根目录下运行以下命令,否则会报“ build/examples/mnist/convert_mnist_data.bin: not found”的错误,参见这里。
3.训练cnn
没有gpu的话要记得把caffe/examples/mnist/lenet_solver.prototxt中的solver_mode设置成solver_mode: CPU。然后在根目录下执行:
./examples/mnist/train_lenet.sh

准确率可以达到0.9912

因为caffe的tutorial上有很大一部分是Python的,所以后来又安装了一下python的接口。
1.首先安装python
2.安装pip
sudo apt-get install python-pip python-dev build-essential

3.运行以下代码安装必要的依赖项:
sudo pip install -r ./python/requirements.txt

4.这里我运行了make clean以及其他编译的caffe的命令,重新编译了一次caffe,但我不确定是不是必须的。
5.在caffe的根目录下运行:
make pycaffe

这里遇到了一个问题:
virtual memory exhausted: Cannot allocate memory
make: *** [python/caffe/_caffe.so] Error 1

按照这里的方法增加Linux虚拟机的内存就可以解决了。
6.把caffe/python的路径加到python路径中:
运行python进入python shell,然后运行下列命令:
import sys
sys.path.append("path/to/caffe/python/")
exit()

7. 这时候再次进入python shell,运行import caffe就没有报错了。

‘肆’ 如何使用Google 的Cartographer SLAM算法

0.安装所依赖项
sudo apt-get install -y google-mock libboost-all-dev libeigen3-dev libgflags-dev libgoogle-glog-dev liblua5.2-dev libprotobuf-dev libsuitesparse-dev libwebp-dev ninja-build protobuf-compiler Python-sphinx ros-indigo-tf2-eigen libatlas-base-dev libsuitesparse-dev liblapack-dev
1.首先安装ceres solver选择版本1.11,路径随意
Git clone
cd ceres-solver-1.11.0/build
cmake ..
make –j
sudo make install

2.安装 cartographer,路径随意
git clone
cd cartographer/build
cmake .. -G Ninja
ninja
ninja test
sudo ninja install

3.安装cartographer_ros
谷歌官提供安装比较繁琐我原文件进行少许修改核代码变修改编译文件
载catkin_ws面src文件夹
git clone
catkin_ws面运行catkin_make即

4.数据载测试
2d数据概500M用迅雷载

3d数据8G左右同用迅雷载

运行launch文件即
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=${HOME}/Downloads/cartographer_3d_deutsches_museum.bag
图左侧2d,右侧3d

‘伍’ ubuntu14.04搭建caffe要做哪些工作

首先吐槽一下本屌的笔记本,我现在的笔记本还是大一时候买的Dell INSPIRON 4010,没有Nvidia,没有Nvidia,没有Nvidia,没有Nvidia,重要的事情说四遍,呵呵。

操作系统: Ubuntu 14.04

是否使用PYTHON API: 是, 目标是安装后CAFFE能作为PYTHON MODULE来使用

硬件: 低端笔记本, 只使用CPU模式

1.安装依赖

1 sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
2 sudo apt-get install --no-install-recommends libboost-all-dev
3 sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
4 sudo apt-get install libatlas-base-dev

PYTHON需要2.7版本,这是操作系统本身已经安装好的. 输入python2.7 --version 会显示具体的版本号说明安装了.

但是还需要sudo apt-get install python-dev

2.下载Caffe
使用Git直接下载Caffe非常简单,或者去https://github.com/BVLC/caffe下载。由于我习惯去github上找代码,所以就直接去下载的源码。

下载完成后,会在家目录下的下载里找到caffe-master.zip,用unzip命令解压到家目录下,然后重命名为caffe.

3.编译Caffe
(1)切换到Caffe所在目录

cp Makefile.config.example Makefile.config

(2)修改配置文件Makefile.config

CPU_ONLY := 1
配置一些引用文件(增加部分主要是解决新版本下,HDF5的路径问题)

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
BLAS := atlas

计算能力 mkl > openlas >atlas

(3)编译 Caffe

make all
make test
make runtest

另外, 这个make默认是用CPU单核运算,如果想要快一点, 比如我想使用四核, 在make后面加上-j4标签。

如果上面4行某一行报错之后想要重试,建议先make clean再重新开始。

4.编译Python接口
Caffe拥有python\C++\shell接口,在Caffe使用python特别方便,在实例中都有接口的说明。

确保pip已经安装

sudo apt-get install python-pip

执行安装依赖

在caffe根目录的python文件夹下,有一个requirements.txt的清单文件,上面列出了需要的依赖库,按照这个清单安装就可以了。

在安装scipy库的时候,需要fortran编译器(gfortran),如果没有这个编译器就会报错,因此,我们可以先安装一下。

首先回到caffe的根目录,然后执行安装代码:

cd ~/caffe
sudo apt-get install gfortran
cd ./python
for req in $(cat requirements.txt); do pip install $req; done

安装完成以后,再次回到caffe根目录我们可以执行:

sudo pip install -r python/requirements.txt

就会看到,安装成功的,都会显示Requirement already satisfied, 没有安装成功的,会继续安装。

编译python接口

make pycaffe

--结果显示ALL TESTS PASSED就安装好了!

运行python结构

$ python2.7
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "right", "credits" or "license" for more information.
>>> import caffe
>>>

如果没有报错,说明caffe安装全部完成!

5.在Mnist运行Lenet

获取数据源

./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh

因为是CPU运行,所以修改在examples文件下的Mnist下的lenet_solver.prototxt中的solver_mode:CPU

solver_mode: CPU

训练模型

./examples/mnist/train_lenet.sh

整个训练时间会持续很久,这是因为本屌的笔记本还是i3处理器,且没有启用GPU,并且默认是单核,所以本屌足足等了3个小时 =。= ..... 自动脑补我心里的万马奔腾吧
6.最后,我的文章是基于各位前辈大神们的文章,虽然按他们的过程走我都报错了,但是最终还是帮助我安装成功。

‘陆’ imagenet是基于什么模型的

1、准备数据。
假设已经下载好数据集和验证集,存储路径为:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
首选需要创建一个txt文件,列举出所有图像以及对应的lable,caffe包“Python/caffe/imagenet/ilsvrc_2012_train.txt”和“ilsvrc_2012_val.txt”两个文件分别是标好的训练集和验证集的文件,共分为1000类。
还需要注意的是,所有的图像都需要归一到同样的尺寸。

2、转化生成训练集。
运行下面的命令:
GLOG_logtostderr=1 examples/convert_imageset.bin /path/to/imagenet/train/ python/caffe/imagenet/ilsvrc_2012_train.txt /path/to/imagenet-train-leveldb
生成文件存储在“/path/to/imagenet-train_leveldb”路径下。

3、计算图像均值。
执行命令:
examples/demo_compute_image_mean.bin /path/to/imagenet-train-leveldb /path/to/mean.binaryproto
第一个参数是执行脚本代码,第二个参数是上一步生成的数据集,第三个参数是存储图像均值的目录路径。

4、定义网络。
ImageNet的网络定义在“examples/imagenet.prototxt”文件中,使用时需要修改里面source和meanfile变量的值,指向自己文件的路径。
仔细观察imagenet.prototxt和imagenet_val.prototxt文件可以发现,训练和验证的参数大部分都相同,不同之处在于初始层和最后一层。训练时,使用softmax_loss层来计算损失函数和初始化后向传播,验证时,使用accuracy层来预测精确度。
在文件“examples/imagenet_solver.prototxt”中定义solver协议,同样需要修改train_net和test_net的路径。

5、训练网络。
执行命令:
GLOG_logtostderr=1 examples/train_net.bin examples/imagenet_solver.prototxt

6、在python中使用已经训练好的模型。
Caffe只提供封装好的imagenet模型,给定一副图像,直接计算出图像的特征和进行预测。首先需要下载模型文件。

‘柒’ 如何使用Google日志库

如何使用Google日志库 (glog)

介绍
Google glog是一个应用层的库. 它提供基于C++风格的流和多种宏接口.例如:
#include <glog/logging.h>

int main(int argc, char* argv[]) {
// Initialize Google's logging library.
google::InitGoogleLogging(argv[0]);

// ...
LOG(INFO) << "Found " << num_cookies << " cookies";
}
Google glog定义了一系列的宏处理普通的日志工作. 你可以分级记录, control loggingbehavior from the command line, 按条件记录, abort theprogram when expected conditions are not met, introce your ownverbose logging levels, 及其它. 文本只是简单的介绍了常用的glog功能而不是所有的细节.没介绍到的,自己读代码去吧.

严重等级
严重等级包括(按严重程度排序): INFO, WARNING,ERROR,和FATAL.记录一个FATAL级的错误后会自动终止程序执行(其实就是_asm int 3).一个严重等级高的记录不但记录在它自己的文件,也记录在比它低等的文件里.例如, 一个FATAL级的记录将会记在FATAL, ERROR,WARNING, 和INFO等级的日志里.
在debug状态下FATAL级记录也可以用DFATAL(当没定义NDEBUG宏的时候),发给客户的程序最好不要用FATAL小心客户对你使用_asm int 3,这时ERROR是个不错的选择.
glog默认把日志文件命名为"/tmp/...log...."(例如, "/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474").glog默认把ERROR 和 FATAL 级的记录发送一份到stderr.

设置标志
标志可以改变glog的输出行为.如果你安装了Googlegflags library, configure 脚本 (具体请参考它的INSTALL文件)会自动检测并使用标志,这时你可以通过命令行使用标志.例如, 若你想发送 --logtostderr 标志,像下面这样:
./your_application --logtostderr=1
如果你没装Google gflags library,你就只能用带GLOG_的环境变量实现,例如.
GLOG_logtostderr=1 ./your_application (貌似在Windows里不能这样用吧?)
常用的标志有:
logtostderr (bool, default=false)
写日志到stderr而不是日志文件.
Note: you can set binary flags to true by specifying1, true, or yes (caseinsensitive).Also, you can set binary flags to false by specifying0, false, or no (again, caseinsensitive).

stderrthreshold (int, default=2, whichis ERROR)
将某级及以上级别的记录同时发送到stderr和日志文件. 严重等级INFO, WARNING, ERROR, FATAL 分别对应 0, 1, 2, 3.

minloglevel (int, default=0, whichis INFO)
只记录某级及以上级别的记录.

log_dir (string, default="")
指定日志保存的目录.

v (int, default=0)
Show all VLOG(m) messages for m less orequal the value of this flag. Overridable by --vmole.See the section about verbose logging for moredetail.

vmole (string, default="")
Per-mole verbose level. The argument has to contain acomma-separated list of =.is a glob pattern (e.g., gfs* for all moles whose namestarts with "gfs"), matched against the filename base(that is, name ignoring .cc/.h./-inl.h). overrides any value given by --v.See also the section about verbose logging.
还有一些其它的标志,自己去logging.cc里面搜索"DEFINE_",爷就不多说了.

你也可以在程序里修改FLAGS_* 开头的全局变量. 通常设置FLAGS_*开头的变量会立即生效,和日志文件名或路径相关的变量例外.例如FLAGS_log_dir就不能放在google::InitGoogleLogging后面.例子代码:
LOG(INFO) << "file";
// Most flags work immediately after updating values.
FLAGS_logtostderr = 1;
LOG(INFO) << "stderr";
FLAGS_logtostderr = 0;
// This won't change the log destination. If you want to set this
// value, you should do this before google::InitGoogleLogging .
FLAGS_log_dir = "/some/log/directory";
LOG(INFO) << "the same file";
条件/ Occasional Logging
下面的宏用于根据条件写日志:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
只有当num_cookies > 10的时候才会记录"Got lots of cookies"
如果有的代码执行非常频繁,你肯定不会希望每次都写入日志.这时,你可以使用下面的方法:
LOG_EVERY_N(INFO, 10) < Got the googleCOUNTER th cookiepre>
上面的代码只有当第1次,第11次,第21次....执行时才写入日志.Note that the specialgoogle::COUNTER value is used to identify which repetition ishappening.
条件和计次可以混合使用,例如:
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER
<< "th big cookie";
除了间隔N次输出,还可以只输出前M次,例如:
LOG_FIRST_N(INFO, 20) < Got the googleCOUNTER th cookiepre>
只输出前20次.

Debug mode支持
"debug mode"的宏只在调试模式有效,其他模式不生效.上栗子:
DLOG(INFO) << "Found cookies";

DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
CHECK宏
经常检查是否会出错而不是等着程序执行出错是个不错的习惯.CHECK宏就是干这个滴,它的功能和assert一样,条件不符合时终止程序.
与assert不同的是它*不*受NDEBUG的限制,无论是不是debug编译它都执行.所以下面的fp-<Write(x)会被执行:
CHECK(fp->Write(x) == 4) << "Write failed!";
有各种各样的宏用于CHECK相等/不相等,包括: CHECK_EQ,CHECK_NE, CHECK_LE, CHECK_LT,CHECK_GE,和CHECK_GT.它们会记录一个FATAL级的记录到日志,牛X的是他们还会把对比的两个值也一起记录.(那两个值必须定义了 operator< ostreamcode> ).例如:
CHECK_NE(1, 2) << ": The world must be ending!";
We are very careful to ensure that each argument is evaluated exactlyonce, and that anything which is legal to pass as a function argument islegal here. In particular, the arguments may be temporary expressionswhich will end up being destroyed at the end of the apparent statement,for example:
CHECK_EQ(string("abc")[1], 'b');
The compiler reports an error if one of the arguments is apointer and the other is NULL. To work around this, simply static_castNULL to the type of the desired pointer.
CHECK_EQ(some_ptr, static_cast(NULL));
还有个好办法:用CHECK_NOTNULL宏:
CHECK_NOTNULL(some_ptr); some_ptr-<DoSomething();
这宏也常用于构造函数中.
struct S {
S(Something* ptr) : ptr_(CHECK_NOTNULL(ptr)) {}
Something* ptr_;
};
这宏的缺点是不能跟C++流一起用.这时就得用CHECK_EQ了.
如果你要对比一个C字符串(char *)可以用:CHECK_STREQ, CHECK_STRNE,CHECK_STRCASEEQ,和CHECK_STRCASENE.带CASE的区分大小写. 这个宏参数可以用NULL指针.NULL与non-NULL比不等.两个NULL是相等的.
Note that both arguments may be temporary strings which aredestructed at the end of the current "full expression"(e.g., CHECK_STREQ(Foo().c_str(), Bar().c_str()) whereFoo and Bar return C++'sstd::string).
CHECK_DOUBLE_EQ 用于对比浮点数,会有小小的误差.CHECK_NEAR 可以接受一个浮点数作为误差.
详细日志
用VLOG宏,你还可以定义自己的严重等级. The --v command line option controlswhich verbose messages are logged:
VLOG(1) << "I'm printed when you run the program with --v=1 or higher";
VLOG(2) << "I'm printed when you run the program with --v=2 or higher";
With VLOG, the lower the verbose level, the morelikely messages are to be logged. For example, if--v==1, VLOG(1) will log, butVLOG(2) will not log. This is opposite of the severitylevel, where INFO is 0, and ERROR is 2.--minloglevel of 1 will log WARNING andabove. Though you can specify any integers for both VLOGmacro and --v flag, the common values for them are smallpositive integers. For example, if you write VLOG(0),you should specify --v=-1 or lower to silence it. Thisis less useful since we may not want verbose logs by default in mostcases. The VLOG macros always log at theINFO log level (when they log at all).
Verbose logging can be controlled from the command line on aper-mole basis:
--vmole=maprece=2,file=1,gfs*=3 --v=0
will:
a. Print VLOG(2) and lower messages from maprece.{h,cc}
b. Print VLOG(1) and lower messages from file.{h,cc}
c. Print VLOG(3) and lower messages from files prefixed with "gfs"
d. Print VLOG(0) and lower messages from elsewhere
The wildcarding functionality shown by (c) supports both '*'(matches 0 or more characters) and '?' (matches any single character)wildcards. Please also check the section about command line flags.
There's also VLOG_IS_ON(n) "verbose level" conditionmacro. This macro returns true when the --v is equal orgreater than n. To be used as
if (VLOG_IS_ON(2)) {
// do some logging preparation and logging
// that can't be accomplished with just VLOG(2) << ...;
}
Verbose level condition macros VLOG_IF,VLOG_EVERY_N and VLOG_IF_EVERY_N behaveanalogous to LOG_IF, LOG_EVERY_N,LOF_IF_EVERY, but accept a numeric verbosity level asopposed to a severity level.
VLOG_IF(1, (size > 1024))
<< "I'm printed when size is more than 1024 and when you run the "
"program with --v=1 or more";
VLOG_EVERY_N(1, 10)
<< "I'm printed every 10th occurrence, and when you run the program "
"with --v=1 or more. Present occurence is " << google::COUNTER;
VLOG_IF_EVERY_N(1, (size > 1024), 10)
<< "I'm printed on every 10th occurence of case when size is more "
" than 1024, when you run the program with --v=1 or more. ";
"Present occurence is " << google::COUNTER;
Failure Signal Handler
The library provides a convenient signal handler that will mp usefulinformation when the program crashes on certain signals such as SIGSEGV.The signal handler can be installed bygoogle::InstallFailureSignalHandler(). The following is an example of outputfrom the signal handler.
*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date ***
*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
PC: @ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f892fb417d0 (unknown)
@ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f89304f7f06 google::LogMessage::SendToLog()
@ 0x7f89304f35af google::LogMessage::Flush()
@ 0x7f89304f3739 google::LogMessage::~LogMessage()
@ 0x408cf4 TestLogSinkWaitTillSent()
@ 0x4115de main
@ 0x7f892f7ef1c4 (unknown)
@ 0x4046f9 (unknown)
By default, the signal handler writes the failure mp to the standarderror. You can customize the destination by InstallFailureWriter().
Miscellaneous Notes
Performance of Messages
The conditional logging macros provided by glog (e.g.,CHECK, LOG_IF, VLOG, ...) arecarefully implemented and don't execute the right hand sideexpressions when the conditions are false. So, the following checkmay not sacrifice the performance of your application.
CHECK(obj.ok) << obj.();
User-defined Failure Function
FATAL severity level messages or unsatisfiedCHECK condition terminate your program. You can changethe behavior of the termination byInstallFailureFunction.
void YourFailureFunction() {
// Reports something...
exit(1);
}

int main(int argc, char* argv[]) {
google::InstallFailureFunction(&YourFailureFunction);
}
By default, glog tries to mp stacktrace and makes the programexit with status 1. The stacktrace is proced only when you run theprogram on an architecture for which glog supports stack tracing (asof September 2008, glog supports stack tracing for x86 and x86_64).
Raw Logging
The header file can beused for thread-safe logging, which does not allocate any memory oracquire any locks. Therefore, the macros defined in thisheader file can be used by low-level memory allocation andsynchronization code.Please check src/glog/raw_logging.h.in for detail.
Google Style perror()
PLOG() and PLOG_IF() andPCHECK() behave exactly like their LOG* andCHECK equivalents with the addition that they append adescription of the current state of errno to their output lines.E.g.
PCHECK(write(1, NULL, 2) <= 0) < Write NULL failedpre>
This check fails with the following error message.
F0825 185142 test.cc:22] Check failed: write(1, NULL, 2) <= 0 Write NULL failed: Bad address [14]
Syslog
SYSLOG, SYSLOG_IF, andSYSLOG_EVERY_N macros are available.These log to syslog in addition to the normal logs. Be aware thatlogging to syslog can drastically impact performance, especially ifsyslog is configured for remote logging! Make sure you understand theimplications of outputting to syslog before you use these macros. Ingeneral, it's wise to use these macros sparingly.
Strip Logging Messages
Strings used in log messages can increase the size of your binaryand present a privacy concern. You can therefore instruct glog toremove all strings which fall below a certain severity level by usingthe GOOGLE_STRIP_LOG macro:
If your application has code like this:
#define GOOGLE_STRIP_LOG 1 // this must go before the #include!
#include <glog/logging.h>
The compiler will remove the log messages whose severities are lessthan the specified integer value. SinceVLOG logs at the severity level INFO(numeric value 0),setting GOOGLE_STRIP_LOG to 1 or greater removesall log messages associated with VLOGs as well asINFO log statements.
对于Windows用户
glog的ERROR级错误与windows.h冲突. You can make glog not defineINFO, WARNING, ERROR,and FATAL by definingGLOG_NO_ABBREVIATED_SEVERITIES beforeincluding glog/logging.h . Even with this macro, you canstill use the iostream like logging facilities:
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <windows.h>
#include <glog/logging.h>

// ...

LOG(ERROR) << "This should work";
LOG_IF(ERROR, x > y) << "This should be also OK";
However, you cannotuse INFO, WARNING, ERROR,and FATAL anymore for functions definedin glog/logging.h .
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <windows.h>
#include <glog/logging.h>

// ...

// This won't work.
// google::FlushLogFiles(google::ERROR);

// Use this instead.
google::FlushLogFiles(google::GLOG_ERROR);
If you don't need ERROR definedby windows.h, there are a couple of more workaroundswhich sometimes don't work:
#define WIN32_LEAN_AND_MEAN or NOGDIbefore you #include windows.h .
#undef ERRORafter you #include windows.h .
See this issue for more detail.

阅读全文

与pythonglog使用相关的资料

热点内容
python人工智能搭建 浏览:248
安卓m6用什么下载 浏览:997
对程序员有偏见吗 浏览:292
如何让服务器运行缓慢 浏览:238
黑马程序员入学流程 浏览:448
win732位安装python什么版本 浏览:786
压缩方式标准 浏览:558
免费低吸指标源码 浏览:183
MO命令是 浏览:47
python入门常见错误 浏览:410
改加密包名 浏览:785
程序员在线编译器 浏览:247
山东兼职程序员收费标准 浏览:424
物业管理系统项目java源码 浏览:15
林皋pdf 浏览:586
vue编译后命名 浏览:732
可以发布命令的 浏览:954
安卓系统如何领取国旗 浏览:330
chromium编译linux 浏览:472
exe在线反编译工具 浏览:368