glog 使用

来源:http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html

一、安装配置

1、简介

  google 出的一个C++轻量级日志库,支持以下功能:

◆ 参数设置,以命令行参数的方式设置标志参数来控制日志记录行为;
◆ 严重性分级,根据日志严重性分级记录日志;
◆ 可有条件地记录日志信息;
◆ 条件中止程序。丰富的条件判定宏,可预设程序终止条件;
◆ 异常信号处理。程序异常情况,可自定义异常处理过程;
◆ 支持debug功能;
◆ 自定义日志信息;
◆ 线程安全日志记录方式;
◆ 系统级日志记录;
◆ google perror风格日志信息;
◆ 精简日志字符串信息

2、安装

  下载地址:https://code.google.com/p/google-glog/downloads/list

  解压安装:

tar zxvf glog-0.3.3.tar.gz && cd glog-0.3.3 && ./configure && make

  头文件目录为 /src/glog ,链接库为 .libs/libglog.{a,so}

  帮助文档为 doc/glog.html 或直接访问以下 URL: http://google-glog.googlecode.com/svn/trunk/doc/glog.html

3、简单 Demo 

#include <glog/logging.h>

int main(int argc,char* argv[])
{
LOG(INFO) << "Hello,GLOG!";
}

  链接时,需要 -lglog ,也可能会需要 -lunwind -lpthread (有一次遇到的,记不起来了,一般不需要)

  执行时,可使用 ./glogdemo 将日志输出到 stderr,可使用 valgrind 检测,未发现内存泄漏。

二、使用方法

1、错误级别

  GLOG 有四个错误级别,枚举如下:

enum SeverityLevel
{
  google::INFO = 0,
  google::WARNING = 1,
  google::ERROR = 2,
  google::FATAL = 3,
};

2、Flags 设置:

  在上面的简单 Demo 中,只能将日志输出到 stderr ,如果想将日志重定向到文件,需要:

google::InitGoogleLogging(argv[0]);
/*
GLOG代码
*/
google::ShutdownGoogleLogging();

  则默认运行会将日志输出到 /tmp 目录下(格式为 "<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>"),也可以使用设置临时环境变量的方式(给命令行参数加上 GLOG_ 前缀),如 GLOG_logtostderr=1 ./your_application 将日志输出到 stderr。

  另外,glog 使用了 gflags 库,如果已经安装好了 gflags 库(./configure && make && make install 然后再配置编译GLOG库)还可以通过 ./your_application --logtostderr=1 来指定运行参数,但需要在使用时加上如下代码:(详见http://www.cnblogs.com/tianyajuanke/p/3467572.html

google::ParseCommandLineFlags(&argc, &argv, true);
/*
GLOG代码
*/
google::ShutDownCommandLineFlags();

  但此方法会使 valgrind 检测有内存泄漏(截止 valgrind 3.9.0 依然如此),这是由于使用 gflags 库造成的。(即使不使用此方法,但只要在编译 glog 库之前安装好了 gflags 库,就会使 libglog.so 有内存泄漏,介意者可进入 gflags 目录 make uninstall 之后,再对 glog 进行 ./configure && make )。

  常用的运行参数如下:

logtostderr (bool, default=false)    //是否将所有日志输出到 stderr,而非文件
alsologtostderr(bool,default=false)  //是否同时将日志输出到文件和stderr
minloglevel (int, default=google::INFO)  //限制输出到 stderr 的部分信息,包括此错误级别和更高错误级别的日志信息
stderrthreshold (int, default=google::ERROR)  //除了将日志输出到文件之外,还将此错误级别和更高错误级别的日志同时输出到 stderr,这个只能使用 -stderrthreshold=1 或代码中设置,而不能使用环境变量的形式。(这个参数可以替代上面两个参数)
colorlogtostderr(bool, default=false)  //将输出到 stderr 上的错误日志显示相应的颜色
v (int, default=0)  //只记录此错误级别和更高错误级别的 VLOG 日志信息
log_dir (string, default="")  //设置日志文件输出目录
v (int, default=0)  //只有当自定义日志(VLOG)级别值小于此值时,才进行输出,默认为0(注:自定义日志的优先级与GLOG内置日志优级相反,值越小优先级越高!!!)。
vmodule (string, default="")  //分文件(不包括文件名后缀,支持通配符)设置自定义日志的可输出级别,如:GLOG_vmodule=server=2,client=3 表示文件名为server.* 的只输出小于 2 的日志,文件名为 client.* 的只输出小于 3 的日志。如果同时使用 GLOG_v 选项,将覆盖 GLOG_v 选项。

  更多运行参数见 logging.cc 中的 DEFINE_ 开头的定义。

  运行参数设置的第三种方法是,可以在代码里通过加上 FLAGS_ 前缀来设置,如:

FLAGS_stderrthreshold=google::INFO;
FLAGS_colorlogtostderr=true;

3、条件输出:

LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";   //当条件满足时输出日志
LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";  //google::COUNTER 记录该语句被执行次数,从1开始,在第一次运行输出日志之后,每隔 10 次再输出一次日志信息
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER << "th big cookie";  //上述两者的结合,不过要注意,是先每隔 10 次去判断条件是否满足,如果滞则输出日志;而不是当满足某条件的情况下,每隔 10 次输出一次日志信息。
LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";  //当此语句执行的前 20 次都输出日志,然后不再输出

  演示代码如下:

#include <glog/logging.h>

int main(int argc,char* argv[])
{
google::InitGoogleLogging(argv[0]);
FLAGS_stderrthreshold=google::INFO;
FLAGS_colorlogtostderr=true;
for(int i = 1; i <= 100;i++)
{
LOG_IF(INFO,i==100)<<"LOG_IF(INFO,i==100) google::COUNTER="<<google::COUNTER<<" i="<<i;
LOG_EVERY_N(INFO,10)<<"LOG_EVERY_N(INFO,10) google::COUNTER="<<google::COUNTER<<" i="<<i;
LOG_IF_EVERY_N(WARNING,(i>50),10)<<"LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER="<<google::COUNTER<<" i="<<i;
LOG_FIRST_N(ERROR,5)<<"LOG_FIRST_N(INFO,5) google::COUNTER="<<google::COUNTER<<" i="<<i;
}
google::ShutdownGoogleLogging();
}

  输出结果如下:

I1210 13:23:20.059790  6322 test01.cpp:11] LOG_EVERY_N(INFO,10)  google::COUNTER=1  i=1
E1210 13:23:20.060670 6322 test01.cpp:13] LOG_FIRST_N(INFO,5) google::COUNTER=1 i=1
E1210 13:23:20.061272 6322 test01.cpp:13] LOG_FIRST_N(INFO,5) google::COUNTER=2 i=2
E1210 13:23:20.061337 6322 test01.cpp:13] LOG_FIRST_N(INFO,5) google::COUNTER=3 i=3
E1210 13:23:20.061393 6322 test01.cpp:13] LOG_FIRST_N(INFO,5) google::COUNTER=4 i=4
E1210 13:23:20.061450 6322 test01.cpp:13] LOG_FIRST_N(INFO,5) google::COUNTER=5 i=5
I1210 13:23:20.061506 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=11 i=11
I1210 13:23:20.061529 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=21 i=21
I1210 13:23:20.061553 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=31 i=31
I1210 13:23:20.061575 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=41 i=41
I1210 13:23:20.061599 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=51 i=51
W1210 13:23:20.061621 6322 test01.cpp:12] LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER=51 i=51
I1210 13:23:20.061667 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=61 i=61
W1210 13:23:20.061691 6322 test01.cpp:12] LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER=61 i=61
I1210 13:23:20.061738 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=71 i=71
W1210 13:23:20.061761 6322 test01.cpp:12] LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER=71 i=71
I1210 13:23:20.061807 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=81 i=81
W1210 13:23:20.061831 6322 test01.cpp:12] LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER=81 i=81
I1210 13:23:20.061877 6322 test01.cpp:11] LOG_EVERY_N(INFO,10) google::COUNTER=91 i=91
W1210 13:23:20.061902 6322 test01.cpp:12] LOG_IF_EVERY_N(INFO,(i>50),10) google::COUNTER=91 i=91
I1210 13:23:20.062140 6322 test01.cpp:10] LOG_IF(INFO,i==100) google::COUNTER=0 i=100

4、日志类型

LOG    //内置日志
VLOG //自定义日志
DLOG //DEBUG模式可输出的日志
DVLOG //DEBUG模式可输出的自定义日志
SYSLOG //系统日志,同时通过 syslog() 函数写入到 /var/log/message 文件
PLOG //perror风格日志,设置errno状态并输出到日志中
RAW_LOG //线程安全的日志,需要#include <glog/raw_logging.h>

  前六种的日志使用方法完全相同(包括条件日志输出),而 RAW_LOG 使用方法比较特殊,且不支持条件日志输出,另外不接受  colorlogtostderr 的颜色设置。自定义日志也不接受 colorlogtostderr 的颜色设置,另外其日志严重级别也为自定义数字,且与默认日志严重级别相反,数字越小严重级别越高。如:

 1 #include <glog/logging.h>
2 #include <glog/raw_logging.h>
3
4 class GLogHelper
5 {
6 public:
7 GLogHelper(char* program)
8 {
9 google::InitGoogleLogging(program);
10 FLAGS_stderrthreshold=google::INFO;
11 FLAGS_colorlogtostderr=true;
12 FLAGS_v = 3;
13 }
14 ~GLogHelper()
15 {
16 google::ShutdownGoogleLogging();
17 }
18 };
19
20 int main(int argc,char* argv[])
21 {
22 GLogHelper gh(argv[0]);
23 LOG(ERROR)<<"LOG";
24 VLOG(3)<<"VLOG";
25 DLOG(ERROR)<<"DLOG";
26 DVLOG(3)<<"DVLOG";
27 SYSLOG(ERROR)<<"SYSLOG";
28 PLOG(ERROR)<<"PLOG";
29 RAW_LOG(ERROR,"RAW_LOG");
30 }

  输出结果如下:

E1211 03:04:22.718116 13083 test01.cpp:23] LOG
I1211 03:04:22.719225 13083 test01.cpp:24] VLOG
E1211 03:04:22.719297 13083 test01.cpp:25] DLOG
I1211 03:04:22.719365 13083 test01.cpp:26] DVLOG
E1211 03:04:22.719391 13083 test01.cpp:27] SYSLOG
E1211 03:04:22.719650 13083 test01.cpp:28] PLOG: Success [0]
E1211 03:04:22.719650 13083 test01.cpp:29] RAW: RAW_LOG

5、CHECK 宏

  当通过该宏指定的条件不成立的时候,程序会中止,并且记录对应的日志信息。功能类似于ASSERT,区别是 CHECK 宏不受 NDEBUG 约束,在 release 版中同样有效。

  目前这个功能我暂时不需要,就不实践了,简单介绍下,如:

CHECK(port == 80)<<"HTTP port 80 is not exit.";

  其它还有:CHECK_EQ、 CHECK_NOTNULL、CHECK_STREQ、CHECK_DOUBLE_EQ 等判断数字、空指针,字符串,浮点数的 CHECK 宏,需要使用时可以搜索 glog/logging.h 文件中以 CHECK_ 开头的宏定义。

  此外,类似的,还有 PCHECK 和 RAW_CHECK 版本,使用方法类似,只是 RAW_CHECK 使用方法特殊,形如 RAW_CHECK(i<3,"RAW_CHECK");

6、core dumped 

  通过 google::InstallFailureSignalHandler(); 即可注册,将 core dumped 信息输出到 stderr,如:

#include <glog/logging.h>
#include <string>
#include <fstream>

//将信息输出到单独的文件和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
std::ofstream fs("glog_dump.log",std::ios::app);
std::string str = std::string(data,size);
fs<<str;
fs.close();
LOG(ERROR)<<str;
} class GLogHelper
{
public:
GLogHelper(char* program)
{
google::InitGoogleLogging(program);
FLAGS_colorlogtostderr=true;
google::InstallFailureSignalHandler();
//默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出方式:
google::InstallFailureWriter(&SignalHandle);
}
~GLogHelper()
{
google::ShutdownGoogleLogging();
}
}; void fun()
{
int* pi = new int;
delete pi;
pi = 0;
int j = *pi;
} int main(int argc,char* argv[])
{
GLogHelper gh(argv[0]);
fun();
}

  输出的错误报告如下,可定位错误于 fun() 函数内:

E1211 06:07:04.787719 15444 test01.cpp:11] *** Aborted at 1386742024 (unix time) try "date -d @1386742024" if you are using GNU date ***
E1211 06:07:04.789120 15444 test01.cpp:11] PC: @ 0x401227 fun()
E1211 06:07:04.789481 15444 test01.cpp:11] *** SIGSEGV (@0x0) received by PID 15444 (TID 0x7f03ce478720) from PID 0; stack trace: ***
E1211 06:07:04.791168 15444 test01.cpp:11] @ 0x7f03cd505960 (unknown)
E1211 06:07:04.791453 15444 test01.cpp:11] @ 0x401227 fun()
E1211 06:07:04.791712 15444 test01.cpp:11] @ 0x40125b main
E1211 06:07:04.792908 15444 test01.cpp:11] @ 0x7f03cd4f1cdd __libc_start_main
E1211 06:07:04.793227 15444 test01.cpp:11] @ 0x400fc9 (unknown)
段错误 (core dumped)

  如果不使用  google::InstallFailureSignalHandler();  则只会输出 “段错误” 三个字,难于排查。

7、其它常用配置

google::SetLogDestination(google::ERROR,"log/prefix_");   //第一个参数为日志级别,第二个参数表示输出目录及日志文件名前缀。
google::SetStderrLogging(google::INFO);   //输出到标准输出的时候大于 INFO 级别的都输出;等同于 FLAGS_stderrthreshold=google::INFO;
FLAGS_logbufsecs =0;  //实时输出日志
FLAGS_max_log_size =100;  //最大日志大小(MB)
#define GOOGLE_STRIP_LOG 3 // 小于此级别的日志语句将在编译时清除,以减小编译后的文件大小,必须放在 #include 前面才有效。

8、日志文件说明

  如果可执行文件名为 "test",则将日志输出到文件后,还会生成 test.ERROR,test.WARNING,test.INFO 三个链接文件,分别链接到对应级别的日志文件。如果日志输出超过 FLAGS_max_log_size 设置的大小,则会分为多个文件存储,链接文件就会指向其中最新的对应级别的日志文件。所以当日志文件较多时,查看链接文件来查看最新日志挺方便的。

三、实用封装

  GLogHelper.h 如下:

#include <glog/logging.h>
#include <glog/raw_logging.h> //将信息输出到单独的文件和 LOG(ERROR)
void SignalHandle(const char* data, int size); class GLogHelper
{
public:
//GLOG配置:
GLogHelper(char* program);
//GLOG内存清理:
~GLogHelper();
};

  GlogHelper.cpp 如下:

#include <stdlib.h>
#include "GLogHelper.h" //配置输出日志的目录:
#define LOGDIR "log"
#define MKDIR "mkdir -p "LOGDIR //将信息输出到单独的文件和 LOG(ERROR)
void SignalHandle(const char* data, int size)
{
std::string str = std::string(data,size);
/*
std::ofstream fs("glog_dump.log",std::ios::app);
fs<<str;
fs.close();
*/
LOG(ERROR)<<str;
//也可以直接在这里发送邮件或短信通知,不过这个方法是被回调多次的(每次回调只输出一行错误信息,所以如上面的记录到文件,也需要>以追加模式方可),所以这里发邮件或短信不是很适合,不过倒是可以调用一个 SHELL 或 PYTHON 脚本,而此脚本会先 sleep 3秒左右,然后将错
误信息通过邮件或短信发送出去,这样就不需要监控脚本定时高频率执行,浪费效率了。
} //GLOG配置:
GLogHelper::GLogHelper(char* program)
{
system(MKDIR);
google::InitGoogleLogging(program); google::SetStderrLogging(google::INFO); //设置级别高于 google::INFO 的日志同时输出到屏幕
FLAGS_colorlogtostderr=true; //设置输出到屏幕的日志显示相应颜色
//google::SetLogDestination(google::ERROR,"log/error_"); //设置 google::ERROR 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::INFO,LOGDIR"/INFO_"); //设置 google::INFO 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::WARNING,LOGDIR"/WARNING_"); //设置 google::WARNING 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::ERROR,LOGDIR"/ERROR_"); //设置 google::ERROR 级别的日志存储路径和文件名前缀
FLAGS_logbufsecs =0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size =100; //最大日志大小为 100MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
google::SetLogFilenameExtension("91_"); //设置文件名扩展,如平台?或其它需要区分的信息
google::InstallFailureSignalHandler(); //捕捉 core dumped
google::InstallFailureWriter(&SignalHandle); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr,可以通过下面的方法自定义输出>方式:
}
//GLOG内存清理:
GLogHelper::~GLogHelper()
{
google::ShutdownGoogleLogging();
}

  测试文件 test.cpp 如下:

#include "GLogHelper.h"

int main(int argc,char* argv[])
{
//要使用 GLOG ,只需要在 main 函数开始处添加这句即可
GLogHelper gh(argv[0]); LOG(INFO)<<"INFO";
LOG(ERROR)<<"ERROR";
}

三、自定义修改

参考:http://www.cppfans.org/1566.html

1、增加日志按天输出

glog默认是根据进程ID是否改变和文件大小是否超过预定值来确定是否需要新建日志文件的,此处可以参考glog源码 logging.cc 文件中的 void LogFileObject::Write 函数中

if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||
PidHasChanged()) {

我们只需要在此处加一个日期判断就可以了,PidHasChanged() 定义于 utilities.cc 文件中,可以加一个类似的 DayHasChanged() 函数(注意 utilities.h 文件中加上函数声明):

static int32 g_main_day = 0;
bool DayHasChanged()
{
time_t raw_time;
struct tm* tm_info; time(&raw_time);
tm_info = localtime(&raw_time); if (tm_info->tm_mday != g_main_day)
{
g_main_day = tm_info->tm_mday;
return true;
} return false;
}

再修改 void LogFileObject::Write 函数中的判断条件即可:

if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||
PidHasChanged() || DayHasChanged()) {

(注:参考 http://www.cppfans.org/1566.html)

装glog和gflags

来源 https://www.cnblogs.com/burningTheStar/p/6986048.html

1.下载

git clone https://github.com/google/glog

2.配置

sudo apt-get install autoconf automake libtool

3.编译&安装

进入源码根目录
./autogen.sh
./configure
make -j 24
sudo make install

4.结果

make[1]: Entering directory '/home/xxx/Downloads/glog'
/bin/mkdir -p '/usr/local/lib'
/bin/bash ./libtool --mode=install /usr/bin/install -c libglog.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libglog.so.0.0.0 /usr/local/lib/libglog.so.0.0.0
libtool: install: (cd /usr/local/lib && { ln -s -f libglog.so.0.0.0 libglog.so.0 || { rm -f libglog.so.0 && ln -s libglog.so.0.0.0 libglog.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libglog.so.0.0.0 libglog.so || { rm -f libglog.so && ln -s libglog.so.0.0.0 libglog.so; }; })
libtool: install: /usr/bin/install -c .libs/libglog.lai /usr/local/lib/libglog.la
libtool: install: /usr/bin/install -c .libs/libglog.a /usr/local/lib/libglog.a
libtool: install: chmod 644 /usr/local/lib/libglog.a
libtool: install: ranlib /usr/local/lib/libglog.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf' See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/share/doc/glog-0.3.5'
/usr/bin/install -c -m 644 AUTHORS COPYING ChangeLog INSTALL NEWS README README.windows doc/designstyle.css doc/glog.html '/usr/local/share/doc/glog-0.3.5'
/bin/mkdir -p '/usr/local/include/glog'
/usr/bin/install -c -m 644 src/glog/log_severity.h '/usr/local/include/glog'
/bin/mkdir -p '/usr/local/include/glog'
/usr/bin/install -c -m 644 src/glog/logging.h src/glog/raw_logging.h src/glog/vlog_is_on.h src/glog/stl_logging.h '/usr/local/include/glog'
/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 libglog.pc '/usr/local/lib/pkgconfig'
make[1]: Leaving directory '/home/xxx/Downloads/glog'

5.下载gflags

git clone https://github.com/gflags/gflags

6.编译&安装

进入源码目录
cmake .
make -j 24
sudo make install

7.简单示例

#include <glog/logging.h>
//#include<gflags/flags.h>
int main(int argc,char* argv[]) {
// 要使用下面的api,需要安装额外的gflags,以及添加上面注释的头文件
// google::ParseCommandLineFlags(&argc, &argv, true); // Initialize Google's logging library.
google::InitGoogleLogging(argv[0]); FLAGS_log_dir = "./log";
//or google::SetLogDestination(google::GLOG_INFO, "./log_"); LOG(INFO) << "hello world"; return 0;
}

编译时加上glog的动态库

如:g++ test.cc -lglog -lgflags -lpthread -o test

log目录要事先创建好再在程序中指定才行,亲测。

glog 使用的更多相关文章

  1. window环境下glog的安装

    window环境下glog的安装 分类: c++2014-09-23 14:12 32人阅读 评论(0) 收藏 举报 下载后解压,利用Visual Studio打开google-glog.sln.生成 ...

  2. Google glog 使用

    Google glog 使用 1        简介 Googleglog 库实现了应用级的日志记录,提供了C++ 风格的流操作和各种助手宏. 代码示例: #include <glog/logg ...

  3. glog使用

    How To Use Google Logging Library Glog 的基本使用方法在google code上有介绍:How To Use Google Logging Library ;最好 ...

  4. glog摘记

    projcet url:https://code.google.com/p/google-glog/ usage: application-level logging setting flags GL ...

  5. 谷歌日志库GLog 使用说明

    1 引用头文件 加载库 #include <glog/include/logging.h> #pragma comment(lib,"libglog.lib") 2 初 ...

  6. Glog

    Glog的简单入门,glog虽然在配置参数方面比较麻烦,但是在小规模程序中,由于其简单灵活,也许会有优势. 0,  glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活 ...

  7. glog另启动线程写文本日志

    glog本身是很高效的,google的大牛肯定知道大规模的写日志用glog的话肯定会影响业务线程的处理,带负荷的磁盘IO谁都桑不起.比方levelDB就是默认异步写,更不用说google的三驾马车都是 ...

  8. Glog 和 Log4cxx 的对比

    转自:http://monkeycn.iteye.com/blog/1021703 #1 Log4cxx有比较完整的配置文档方式,xml和java配置档:GLog只能通过启动程序的时候的输入参数来配置 ...

  9. GLOG使用Demo

    GLOG使用Demo GLOG是Google开源的一个精简的日志系统,博主简单学习了一下并记录常见用法,以备日常查询 一.安装 照例是编译安装,不过没有使用cmake git clone https: ...

随机推荐

  1. 《MATLAB从入门到放弃》打通 “矩阵” 障碍

    目录: »   矩阵的生成与大小  >   简单矩阵的生成  >  随机矩阵的生成  >   矩阵的大小 »  矩阵的索引与访问 »  矩阵的拼接与裁剪 >  矩阵的拼接 &g ...

  2. 系统学习java高并发系列三

    转载请注明原创出处,谢谢! 首先需要说说线程安全?关于线程安全一直在提,比如StringBuilder和StringBuffer有什么区别? 经常就会出现关于线程安全与线程非安全,可能一直在提自己没有 ...

  3. js中的||与&&用法

    &&和||在JQuery源代码内尤为使用广泛,由网上找了些例子作为参考,对其用法研究了一下: &&: function a(){ alert("a" ...

  4. [ASP.NET教程] 防止表单重复提交

    第一种方法:javascript控制.缺点,一般用户使用没问题,但是懂点js的还是可以强行重复提交.而且,后退再提交,你也没啥办法.第二种方法:服务器控制.后台生成一个token,存入session或 ...

  5. bzoj1036 [ZJOI2008]树的统计

    一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从 ...

  6. Reliability diagrams

    Reliability diagrams (Hartmann et al. 2002) are simply graphs of the Observed frequency of an event ...

  7. Tomcat服务器如何读取本地磁盘数据?

    实际问题: 如何让用户下载本地磁盘的资源文件呢?  在server.xml文件中配置虚拟路径如下(以下代码放在Host标签之中即可): 例如: 具体含义: 把本地磁盘目录 "D:\uploa ...

  8. Python自学笔记-进程,线程(Mr serven)

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...

  9. es6零基础学习之项目目录创建(一)

    和大家分享一下在学习es6的过程中所积累的东西,也希望更多的朋友能够互相学习 首先创建项目目录 打开你的命令行,什么文件下都可以,大家请随意,我自己用的git,输入 mkdir es6 创建一个完整的 ...

  10. 关于Struts与Ajax整合时的异常处理

     关于Struts与Ajax整合时的异常处理问题: 问题还原: 从而当有异常发出时,会将异常信息发送到页面上.如下图所示:这是一个比较经典的过程: 错误提示页面: 由于sendError()方法里 ...