LTE Manual ——Logging(翻译)
LTE Manual ——Logging(翻译)
(本文为个人学习笔记,如有不当的地方,欢迎指正!)
9 Logging
9.1 概述
if (address == iaddr.GetBroadcast ())
{
NS_LOG_LOGIC ("For me (interface broadcast address)");
return true;
}
9.1.1 启用输出
$ NS_LOG="*" ./waf --run first
$ NS_LOG="Ipv4L3Protocol" ./waf --run first
int main (int argc, char *argv[]){
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
...
9.1.2 NS_LOG 语法
$ NS_LOG="<log-component>:<log-component>..."
$ NS_LOG="<log-component>=<option>|<option>...:<log-component>..."
9.1.3 日志组件
WifiHelper wifiHelper;wifiHelper.EnableLogComponents ();
$ NS_LOG="print-list" ./waf --run ... $ NS_LOG="foo" # a token not matching any log-component
9.1.4 Severity 和 Level 选项
| Severity Class | Meaning |
| LOG_NONE | The default, no logging |
| LOG_ERROR | Serious error messages only |
| LOG_WARN | Warning messages |
| LOG_DEBUG | For use in debugging |
| LOG_INFO | Informational |
| LOG_FUNCTION | Function tracing |
| LOG_LOGIC | Control flow tracing within functions |
| Level | Meaning |
| LOG_LEVEL_ERROR | Only LOG_ERROR severity class messages. |
| LOG_LEVEL_WARN | LOG_WARN and above. |
| LOG_LEVEL_DEBUG | LOG_DEBUG and above. |
| LOG_LEVEL_INFO | LOG_INFO and above. |
| LOG_LEVEL_FUNCTION | LOG_FUNCTION and above. |
| LOG_LEVEL_LOGIC | LOG_LOGIC and above. |
| LOG_LEVEL_ALL | All severity classes. |
| LOG_ALL | Synonym for LOG_LEVEL_ALL |
| Class | Level |
| error | level_error |
| warn | level_warn |
| debug | level_debug |
| info | level_info |
| function | level_function |
| logic | level_logic |
| level_allall* |
$ NS_LOG="<log-component>:..."
9.1.5 前缀选项
| Prefix Symbol | Meaning |
| LOG_PREFIX_FUNC | Prefix the name of the calling function. |
| LOG_PREFIX_TIME | Prefix the simulation time. |
| LOG_PREFIX_NODE | Prefix the node id. |
| LOG_PREFIX_LEVEL | Prefix the severity level. |
| LOG_PREFIX_ALL | Enable all prefixes. |
| Token | Alternate |
| prefix_func | func |
| prefix_time | time |
| prefix_node | node |
| prefix_level | level |
| prefix_all | all* |
$ NS_LOG="<log-component>:..."
$ NS_LOG="*=all|prefix_level" ./waf --run scratch-simulator
Scratch Simulator
[ERROR] error message
[WARN] warn message
[DEBUG] debug message
[INFO] info message
[FUNCT] function message
[LOGIC] logic message
$ NS_LOG="***" ... $ NS_LOG="*=all|*" ... $ NS_LOG="*=*|all" ...
$ NS_LOG="*=**" ... $ NS_LOG="*=level_all|*" ... $ NS_LOG="*=*|prefix_all" ...
$ NS_LOG="*=*|*" ...
9.2 如何在代码中添加日志功能
(1)调用 namespace ns3 里的 NS_LOG_COMPONENT_DEFINE (...); 宏。
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("Ipv4L3Protocol");...
(2)在函数和函数体中添加日志声明(宏调用)。
9.2.1 Logging Macros(日志宏)
| Severity Class | Macro |
| LOG_NONE | (none needed) |
| LOG_ERROR | NS_LOG_ERROR (...); |
| LOG_WARN | NS_LOG_WARN (...); |
| LOG_DEBUG | NS_LOG_DEBUG (...); |
| LOG_INFO | NS_LOG_INFO (...); |
| LOG_FUNCTION | NS_LOG_FUNCTION (...); |
| LOG_LOGIC | NS_LOG_LOGIC (...); |
void MyClass::Check (int value, char * item){
NS_LOG_FUNCTION (this << arg << item);
if (arg > )
{
NS_LOG_ERROR ("encountered bad value " << value <<
" while checking " << name << "!");
}
...}
9.2.2 Unconditional Logging(无条件的日志)
9.2.3 Guidelines(指南)
- 使用 NS_LOG_FUNCTION (this << args...); 开始每个类的方法。 这会启用简单的函数调用 tracing 。
- 除了: 不要记录运算符或明确的副本构造函数,因为这些会造成无穷递归和堆栈溢出。
- 对于没有参数的方法,使用相同形式:NS_LOG_FUNCTION (this);
- 对于静态函数:
- 有参数的话,像往常一样使用 NS_LOG_FUNCTION (...); 。
- 没有参数的话使用 NS_LOG_FUNCTION_NOARGS ();
- NS_LOG_ERROR 用于错误严重的条件(可能使仿真执行无效)。
- NS_LOG_WARN 用于不寻常的条件(可以纠正的)。 请给出问题本质以及如何纠正它的的有关提示。
- NS_LOG_DEBUG 通常以一种特别的方式使用,目的是理解模型的执行。
- NS_LOG_INFO 用于执行的附加信息,例如数据结构的大小(当添加/移除数据结构时)。
- NS_LOG_LOGIC 用于 trace 一个函数的重要逻辑分支
- 测试你的日志变化不会打破代码(break the code)。运行一些启用所有日志组件的示例程序(例如 NS_LOG="***")。
- 使用显式类型转换,用于任何类型的变量 uint8_t 或 int8_t,例如, NS_LOG_LOGIC ("Variable i is " << static_cast<int> (i));。没有了 cast, 整数会被理解为一个字符,结果最可能不符合期望。这是一个有据可查的 C++ ‘feature’。
LTE Manual ——Logging(翻译)的更多相关文章
- 【socket编程】select manual page翻译
原文: select manual page 依赖的头文件 /* According to POSIX.1-2001, POSIX.1-2008 */ #include <sys/select. ...
- trove manual installation 翻译
目标 此文件提供了一步一步的指导手动安装trove在一个现有OpenStack的环境为了开发. 该文件将不包括: OpenStack的设置 trove服务配置 要求 正在运行的OpenStack的环境 ...
- 开始进行lammps手册的学习啦,跟着Manual一边翻译一边做吧!(转载)
转载自:http://blog.sina.com.cn/s/blog_64813e370100ngsz.html 注明:黄色部分基本上为不懂的部分,红色字体为所做注释 一.各种文件的介绍: 1 in ...
- Manual——Test (翻译1)
LTE Manual ——Logging(翻译) (本文为个人学习笔记,如有不当的地方,欢迎指正!) 1.17.3 Testing framework(测试框架) ns-3 包含一个仿真核心引擎. ...
- day18 logging模块 sys shelve
昨日回顾 re 正则表达式 匹配字符串 场景 例如:爬虫,密码规则验证,邮箱地址验证,手机号码 学习re主要学习的就是 那一堆特殊符号 hashlib hash是一种算法 lib表示库 该模块包含了一 ...
- 如何使用Python的logging模块
几个学习连接: Python官方链接: https://docs.python.org/3.4/library/logging.html?highlight=logging 翻译(不过是2.3版本的) ...
- MySQL - Show Processlist 整理
MySQL - Show Processlist 整理 原文来源:MySQL 5.5 Reference Manual 部分翻译取自:<MySQL_5.1中文参考手册> 转载请注明原文 ...
- MySQL - Show Processlist 整理(转)
原文来源:MySQL 5.5 Reference Manual 部分翻译取自:<MySQL_5.1中文参考手册> 转载请注明原文链接http://www.cnblogs.com/len ...
- Show Global Status 整理
原文来源:MySQL 5.5 Reference Manual 部分翻译取自:<MySQL_5.1中文参考手册> 转载请注明原文链接http://www.cnblogs.com/lenag ...
随机推荐
- Spark on Yarn:java.sql.SQLException: No suitable driver found for jdbc:microsoft:sqlserver://localhost\\db_instance_name:1433;databaseName=db_name
本文只是针对当前特定环境下,出现的问题找不到sqljdbc驱动的案例.具体出现原因,可能是spark版本问题,也可能是集群配置问题. yarn-client方式下: 通过--jars参数指定驱动文件位 ...
- python基础:算法是什么
"算法"是什么? 简单来说,算法就是告诉计算机要做什么,是对如何做一件事情的详细描述或者详细的操作步骤. 待补充~~~
- linux-------------linux的scp
scp是有Security的文件copy,基于ssh登录. 命令基本格式: scp [OPTIONS] file_source file_target OPTIONS: -v 和大多数 linux 命 ...
- spring Date JPA的主要编程接口
Repository:最顶层的接口,是一个空接口,主要目的是为了同一所有Repository的类型,并且让组件扫描的时候自动识别. CrudRepository:是Repository的子接口,提供增 ...
- ubuntu command
uninstall software: sudo apt-get purge openjdk*
- 存储过程中的output跟return区别及实例说明
存储过程return,表示该存储过程执行到当当前return位置,不再向下执行: 存储过程写法:set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER ...
- C++多级指针与多维数组详细介绍
多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下: int val=10; int *ptr=&val; int **pptr= ...
- lisp等
- 自学android半年,已从.net转型成android程序员,分享下这个过程
自学从来都是一件难以坚持的事情,看过太多人三分钟热度之后就颓然放弃,然后告诉下一个要自学的人,自学很难,还是正儿八经去培训机构吧 所以首先你要对安卓开发非常感兴趣,发自内心喜欢安卓系统,日常手机如果是 ...
- app加固
为什么要加固APP? 答:因为黑客通过反编译APK得到源码后,会在应用中插入代码,获取利益,比如添加广告,盗取用户账号.密码,后台定制活动等. 反编译的方法? 反编译是指apk文件通过反编译工具( ...