在写代码的过程中,打log肯定是少不了的,毕竟不能总靠调试来发现问题。log库的选用就很纠结了,成熟的log库非常多,log4cpp、log4cxx、poco.log、boost.log、glog等等,以前我用过log4cxx,觉得配置巨麻烦,一大段看着好纠结,不过用起来很舒服。这次我决定使用比较轻量的glog

glog来自于google,google提供给大家不少好东西,所以功能和质量上都是可以保证的。而且很轻量,用起来很灵活。

glog项目地址:https://code.google.com/p/google-glog/

glog的文档:英文 http://google-glog.googlecode.com/svn/trunk/doc/glog.html

glog入门代码就不多写了,在文档中也有,网上也是一大片,大家请自行搜索。他提供了vs工程和configure文件,编译方法见文档。

修改的部分

1.增加文件按天区分

glog是根据进程ID来区分文件的,如果你重新启动了程序,则log文件的名字就会变,这样似乎不太满足我的需求,我还要求它可以每天生成文件,方便我整理和分析log,其实也有办法,自己增加一个按天滚文件的函数就可以了。

在utilities.cc中增加函数如下,(因为PidHasChanged()在这个文件里)

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;
}

在logging.cc的LogFileObject::Write函数中将

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

改成

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

这样就会按照天来输出log了。

2.glog默认有四种log级别,高级别的log中会包含低级别的log,这个我也是不需要的,我希望每一个分级一个文件。

我增加了一个宏来控制这个开关,以免影响到原来的功能。

在glog/src/windows/glog/logging.h (我在windows上用的,linux的请自己查找)

DECLARE_bool(servitysinglelog);

然后修改 logging.cc中的LogDestination::LogToAllLogfiles为如下

inline void LogDestination::LogToAllLogfiles(LogSeverity severity,
time_t timestamp,
const char* message,
size_t len) {
if ( FLAGS_logtostderr ) { // global flag: never log to file
ColoredWriteToStderr(severity, message, len);
} else {
if (FLAGS_servitysinglelog)
{
LogDestination::MaybeLogToLogfile(severity, timestamp, message, len);
}
else
{
for (int i = severity; i >= 0; --i)
LogDestination::MaybeLogToLogfile(i, timestamp, message, len);
}
}
}

我整体的初始化函数如下:

bool Init()
{
google::InitGoogleLogging("");
#ifdef DEBUG_MODE
google::SetStderrLogging(google::GLOG_INFO); //设置级别高于 google::INFO 的日志同时输出到屏幕
#else
google::SetStderrLogging(google::GLOG_FATAL);//设置级别高于 google::FATAL 的日志同时输出到屏幕
#endif
FLAGS_colorlogtostderr = true; //设置输出到屏幕的日志显示相应颜色
FLAGS_servitysinglelog = true;// 用来按照等级区分log文件
google::SetLogDestination(google::GLOG_FATAL, "./log/log_fatal_"); // 设置 google::FATAL 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_ERROR, "./log/log_error_"); //设置 google::ERROR 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_WARNING, "./log/log_warning_"); //设置 google::WARNING 级别的日志存储路径和文件名前缀
google::SetLogDestination(google::GLOG_INFO, "./log/log_info_"); //设置 google::INFO 级别的日志存储路径和文件名前缀
FLAGS_logbufsecs = 0; //缓冲日志输出,默认为30秒,此处改为立即输出
FLAGS_max_log_size = 100; //最大日志大小为 100MB
FLAGS_stop_logging_if_full_disk = true; //当磁盘被写满时,停止日志输出
//google::SetLogFilenameExtension("91_"); //设置文件名扩展,如平台?或其它需要区分的信息
//google::InstallFailureSignalHandler(); //捕捉 core dumped (linux)
//google::InstallFailureWriter(&Log); //默认捕捉 SIGSEGV 信号信息输出会输出到 stderr (linux) return true;
}

这些改动之后我的功能基本就满足了,修改下log输出的格式,原来的log格式大致是这样的 I1234 02/11 12:20:50.123456 xxx.cpp 12] 你的log内容,是 级别的首字母 线程ID 月/日 时分秒微秒 文件名 行号],我将它修改成为  [级别名 线程ID 年/月/日 时分秒毫秒 文件名 行号],在logging.cc的LogMessage::Init函数中修改

再加上一个log(severity_level, format, …)函数就可以打印log了。

最新文章

  1. iOS runloop初步学习
  2. 问题解决——使用串口调试助手发送控制字符 协议指令 &lt;ESC&gt;!?
  3. Sql 随机更新一条数据返回更新数据的ID编号
  4. X-UA-Compatible是神马
  5. sort,ksort,asort的区别
  6. Mac 与 PC 键盘布局对比
  7. springMVC学习笔记三
  8. [转]如何从MySQL官方Yum仓库安装MySQL5.6
  9. springmvc中的page
  10. Spring源码学习:第0步--环境准备
  11. Java面试题—初级(2)
  12. java-递归练习
  13. Python3.4 枚举类型的使用
  14. 升讯威微信营销系统开发实践:(2)中控服务器的详细设计( 完整开源于 Github)
  15. 029_mac下nginx管理
  16. oracle按时间创建分区表
  17. Maven项目下servlet异常
  18. 【HTTP】 认证和单点登录 【瞎写的…】
  19. 关于ORA-06508 , ORA-04068异常的详细说明
  20. levenshtein函数

热门文章

  1. Python-信号量和线程池-semaphore ThreadPollExector
  2. Centos-检查文件系统并尝试修复-fsck
  3. # mac使用homebrew安装jdk和tomcat
  4. Spring Cloud系列(二):Eureka应用详解
  5. Java 获取屏幕的宽度和高度
  6. 诊断日志知多少 | DiagnosticSource 在.NET上的应用
  7. Nginx作为反向代理时传递客户端IP的设置方法
  8. OpenSSL编程模型
  9. 实验五 css进阶应用
  10. php中,posix_getpid() 和 getmypid() 有什么不同