google log的使用

本文详细介绍Google的glog库,包括其安装配置、日志级别、日志文件格式、宏使用等核心内容,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

log是Google维护的一个开源的C++ log库,使用Free BSC license


glog作用:日志库
安装方法
./configure
make
make install
Hello world
foo_1.cpp
[cpp]  view plain copy
  1. #include <glog/logging.h>  
  2.   
  3. int main(int argc,char* argv[]) {  
  4.     // If glog is used to parse the command line   
  5.     // google::ParseCommandLineFlags(&argc, &argv, true);  
  6.   
  7.     // Initialize Google's logging library.  
  8.     google::InitGoogleLogging(argv[0]);  
  9.   
  10.     FLAGS_log_dir = "./log";  
  11.   
  12.     LOG(INFO) << "hello world";  
  13.   
  14.     return 0;  
  15. }  


g++ -o foo_1 -lglog foo_1.cpp
运行后会在log目录下生成日志文件。
  • FLAGS_log_dir设置日志输出目录。
  • google::ParseCommandLineFlags(&argc, &argv, true); 使用时,可解析命令行参数。如 foo_1 --log_dir=log
日志级别
INFO, WARNING, ERROR, FATAL、分别对应数字
0, 1, 2, 3
对应级别的日志打印在对应级别的日志文件中。
并且高级别的日志同时打印在本级别和低级别中。
例如 INFO中会有WARNING级别的输出。
日志文件
默认输出在“/tmp/”目录下,修改输出目录方法:
  • FLAGS_log_dir值修改
  • google::ParseCommandLineFlags(&argc, &argv, true); 使用时,命令行参数log_dir设置。
日志文件名称格式: <program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>
例如:hello_world.example.com.hamaji.log.INFO.20080709-222411.10474
本文开始处的例子中的 google : :InitGoogleLogging(argv[ 0]); 参数便为设置程序名称。
初始化参数
FLAGS_log_dir       日志输出目录
FLAGS_v                 自定义VLOG(m)时,m值小于此处设置值的语句才有输出
FLAGS_max_log_size     每个日志文件最大大小(MB级别)
FLAGS_minloglevel       输出日志的最小级别,即高于等于该级别的日志都将输出。
 
更多参数可见 logging.h
并且各个参数均可以通过命令行参数的方式设置。
 
LOG_XX
满足一定条件下输出日志,例如:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
 
该宏为:
#define LOG_IF(severity, condition) \
  !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
 
上一条语句则为num_cookies > 10为真时, LOG(INFO) << "Got lots of cookies";
logging.h 中还定义了很多其他的条件输出,可根据需要查找使用。
DLOG_XX
依赖于编译参数的LOG_XX,当使用-DNDEBUG编译时失效。该宏为:
#ifndef NDEBUG
#define DLOG(severity) LOG(severity)
还有很多其他的DLOG_XX, 参见头文件。
CHECK_XX
check检查失败时直接退出程序。类似assert()。
和assert的区别是不依赖于编译时的NDEBUG选项, 目的是尽快发现隐藏的问题。例如:
CHECK( fd != NULL ) << " fd is NULL, can not be used ! ";
 
#define CHECK(condition)  \
      LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \
             << "Check failed: " #condition " "
 
还有很多CHECK_XX的宏,可参见头文件。
VLOG_XX
可以独立于默认的日志级别,用户自己定义自己的日志级别。
个人感觉不常用。

信号处理
个人感觉很有用,会输出导致程序结束的信号。SIGKILL 这个信号因为不可捕获所以不在这个信号处理之列。
只需使用google::InstallFailureSignalHandler(); 注册一下即可。
默认是打印到stderr中。
可以使用InstallFailureWriter()定义输出方式。该宏为:
GOOGLE_GLOG_DLL_DECL void InstallFailureWriter(
    void (*writer)(const char* data, int size));
}
RAW_XX  线程安全方式
<glog/raw_logging.h>中的各个RAW_XX为线程安全的使用方式。
官方特意说明“which does not allocate any memory or acquire any locks”。
结束
// Shutdown google's logging library.
GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging();
<think>好的,我需要回答用户的问题:如何在Python中实现和使用Datalog数据逻辑库。首先,我需要了解Datalog是什么。Datalog是一种声明式逻辑编程语言,常用于数据库和知识库查询,基于一阶逻辑的子集。它通过规则和事实来表达数据关系。 接下来,用户希望知道在Python中如何实现和使用Datalog库。我记得Python中有一些第三方库支持Datalog,比如`pyDatalog`。需要确认这个库的安装和使用方法。 首先,安装部分,用户可能需要使用pip安装pyDatalog。然后,基本步骤包括定义逻辑变量、创建事实(Facts)、定义规则(Rules)和进行查询。例如,用pyDatalog定义一些事实,比如父子和兄弟关系,然后通过规则推导出祖孙关系。 同时,用户可能关心如何处理更复杂的数据结构或外部数据源,比如从CSV文件加载数据到Datalog中。这可能需要结合pandas库读取数据,然后将数据转换为Datalog的事实。 还需要提到可能的优化方法,比如使用索引提高查询效率,或者如何调试Datalog程序。此外,引用相关资源,如官方文档或教程,帮助用户深入学习。 另外,考虑到用户提供的引用中有提到逻辑回归和pandas的使用,可能需要将Datalog与这些库结合使用,例如用逻辑回归处理Datalog查询后的结果数据。但需要确保引用正确,比如引用[1]和[4]提到了逻辑回归和statsmodels,引用[3]提到了pandas处理日志数据,这些可能与数据处理相关,但Datalog更多是逻辑推理,所以引用可能需要适当调整。 最后,生成相关问题,引导用户进一步探索,比如与其他逻辑编程语言的比较,性能优化,或者实际应用案例。</think>### 如何在 Python 中实现和使用 Datalog 数据逻辑库? Datalog 是一种基于逻辑的声明式查询语言,常用于知识推理和数据库查询。在 Python 中,可以通过第三方库 `pyDatalog` 实现其核心功能。以下是具体实现步骤和示例: --- #### 1. 安装 pyDatalog 使用 `pip` 安装库: ```bash pip install pyDatalog ``` --- #### 2. 基本使用示例 ```python from pyDatalog import pyDatalog # 定义逻辑变量 pyDatalog.create_terms('X, Y, Z, parent, grandparent, ancestor') # 添加事实(Facts) + parent('Alice', 'Bob') # Alice 是 Bob 的父节点 + parent('Bob', 'Charlie') # Bob 是 Charlie 的父节点 # 定义规则(Rules) grandparent(X, Y) <= parent(X, Z) & parent(Z, Y) # X 是 Y 的祖父母,若存在 Z 使得 X 是 Z 的父节点且 Z 是 Y 的父节点 ancestor(X, Y) <= parent(X, Y) # 直接父节点是祖先 ancestor(X, Y) <= parent(X, Z) & ancestor(Z, Y) # 递归定义祖先关系 # 查询祖父母关系 print(grandparent(X, 'Charlie')) # 输出:X = Alice ``` --- #### 3. 结合外部数据源 可以将 `pandas` 数据加载为 Datalog 事实: ```python import pandas as pd from pyDatalog import pyDatalog # 示例数据 data = pd.DataFrame({ 'parent': ['Alice', 'Bob'], 'child': ['Bob', 'Charlie'] }) # 将数据转换为 Datalog 事实 pyDatalog.create_terms('parent_from_csv') for _, row in data.iterrows(): + parent_from_csv(row['parent'], row['child']) # 使用 CSV 中的事实查询 pyDatalog.create_terms('X, Y') print(pyDatalog.ask("parent_from_csv(X, 'Charlie')")) # 输出:X = Bob ``` --- #### 4. 优化与调试 - **索引优化**:为高频查询字段添加索引,例如 `parent(X, Y).index(X)`。 - **调试规则**:使用 `pyDatalog.Trace()` 跟踪规则执行过程。 --- #### 5. 相关资源 - **官方文档**:[pyDatalog 文档](https://sites.google.com/site/pydatalog/) 提供详细语法和示例[^4]。 - **应用场景**:Datalog 适用于知识图谱、规则引擎和递归查询,例如社交网络关系推理[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值