{"id":137,"date":"2020-09-10T12:47:27","date_gmt":"2020-09-10T11:47:27","guid":{"rendered":"http:\/\/blog.uclm.es\/felixvillanueva\/?p=137"},"modified":"2020-09-10T12:47:27","modified_gmt":"2020-09-10T11:47:27","slug":"el-sistema-de-log-de-ns3","status":"publish","type":"post","link":"https:\/\/blog.uclm.es\/felixvillanueva\/2020\/09\/10\/el-sistema-de-log-de-ns3\/","title":{"rendered":"El sistema de log de NS3"},"content":{"rendered":"<p>Un buen entorno de logging te permite depurar y entender qu\u00e9 est\u00e1 pasando en tu simulaci\u00f3n, as\u00ed como entender c\u00f3mo est\u00e1 estructurado el simulador NS3 y sus diferentes m\u00f3dulos.<br \/>\nEl sistema de logging de NS3 se usa mediante variables de entorno y mediante el propio c\u00f3digo de tu simulaci\u00f3n si quieres habilitar logging en tu propia simulaci\u00f3n.<\/p>\n<p>Se establecen siete niveles de log proporcionando de menos a mas informaci\u00f3n:<\/p>\n<ol>\n<li>NS_LOG_ERROR: mensajes de error<\/li>\n<li>NS_LOG_WARN: mensajes de aviso<\/li>\n<li>NS_LOG_DEBUG: mensajes espec\u00edficos de depuraci\u00f3n<\/li>\n<li>NS_LOG_INFO: mensajes de informaci\u00f3n gen\u00e9ricos<\/li>\n<li>NS_LOG_FUNCTION: mensajes de llamadas a funciones para la trazabilidad de llamadas<\/li>\n<li>NS_LOG_LOGIC: mensajes de log con el flujo l\u00f3gico dentro de cada funci\u00f3n<\/li>\n<li>NS_LOGIC_ALL: todos los mensajes<\/li>\n<\/ol>\n<p>Adicionalmente hay un nivel incondicional que imprime la salida con independencia de los niveles de log activos o no. Este es NS_LOG_UNCOND<br \/>\n\u00bfC\u00f3mo visualizamos la informaci\u00f3n de log en ns3?, bien, vamos a comenzar con nuestro ejemplo IoT b\u00e1sico donde, precisamente, uno de los problemas es que no gener\u00e1bamos ning\u00fan tipo de informaci\u00f3n acerca de la simulaci\u00f3n.<br \/>\nEfectivamente si lo ejecutamos, habiendo colocado previamente el archivo basic-iot-sensors.cc en el directorio scratch:<br \/>\n<code><br \/>\n$.\/waf --run basic-iot-sensors<br \/>\nWaf: Entering directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nWaf: Leaving directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nBuild commands will be stored in build\/compile_commands.json<br \/>\n'build' finished successfully (2.047s)<br \/>\n<\/code><br \/>\nVemos que no sale ning\u00fan tipo de informaci\u00f3n \u00fatil acerca de la simulaci\u00f3n salvo que se ha compilado y ejecutado sin errores.<br \/>\nVamos a estudiar la informaci\u00f3n que nos genera el m\u00f3dulo de YansWifiPhy, para ello:<br \/>\n<code><br \/>\n$ export NS_LOG=YansWifiPhy<br \/>\nfelix@homer:~\/tools\/ns-allinone-3.30.1\/ns-3.30.1$ .\/waf --run basic-iot-sensors<br \/>\nWaf: Entering directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nWaf: Leaving directory `\/\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nBuild commands will be stored in build\/compile_commands.json<br \/>\n'build' finished successfully (1.701s)<br \/>\n+0.000000000s -1 YansWifiPhy:YansWifiPhy(0x5641614960f0)<br \/>\n+0.000000000s -1 YansWifiPhy:SetChannel(0x5641614960f0, 0x564161490400)<br \/>\n+0.000000000s -1 YansWifiPhy:YansWifiPhy(0x56416153d640)<br \/>\n+0.000000000s -1 YansWifiPhy:SetChannel(0x56416153d640, 0x564161490400)<br \/>\n+0.000000000s -1 YansWifiPhy:YansWifiPhy(0x564161541e90)<br \/>\n...<br \/>\n<\/code><br \/>\nvemos que usamos la variable de entorno NS_LOG para fijar el m\u00f3dulo en el que estamos interesados. Si ponemos NS_LOG a un nombre de un m\u00f3dulo que no existe se imprimir\u00e1 un listado de todos los m\u00f3dulos que NS3 tiene implementados. El nivel de log por defecto en la mayor\u00eda de los m\u00f3dulos ser\u00e1 todos, podemos especificarlo tambi\u00e9n a la hora de definir el m\u00f3dulo. Por ejemplo vamos a definir el nivel info para el m\u00f3dulo UdpClient:<br \/>\n<code><br \/>\n$ export NS_LOG=UdpClient=level_info<br \/>\n$ .\/waf --run basic-iot-sensors<br \/>\nWaf: Entering directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nWaf: Leaving directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nBuild commands will be stored in build\/compile_commands.json<br \/>\n'build' finished successfully (1.480s)<br \/>\nTraceDelay TX 32 bytes to 10.1.1.1 Uid: 0 Time: 2<br \/>\nTraceDelay TX 32 bytes to 10.1.1.1 Uid: 1 Time: 2<br \/>\nTraceDelay TX 32 bytes to 10.1.1.1 Uid: 2 Time: 2<br \/>\nTraceDelay TX 32 bytes to 10.1.1.1 Uid: 33 Time: 2.5<br \/>\n....<br \/>\n<\/code><br \/>\nVemos que ahora sale la informaci\u00f3n de las aplicaciones UDP instaladas en los nodos IoT enviando informaci\u00f3n. Substituye level_info por level_all en el primer comando para que veas como sale mucha m\u00e1s informaci\u00f3n.<br \/>\nSi alg\u00fan m\u00f3dulo no se usa en t\u00fa simulaci\u00f3n y pones NS_LOG a ese m\u00f3dulo no saldr\u00e1 ninguna informaci\u00f3n adicional.<br \/>\nSi quieres indicar que el nombre de la funci\u00f3n que genera el mensaje tambi\u00e9n se imprima, puedes hacer un OR con prefix_fund. En bash necesitar\u00e1s comillas:<br \/>\n<code><br \/>\n$export 'NS_LOG=UdpClient=level_all|prefix_func'<br \/>\n<\/code><br \/>\nPara habilitar varios m\u00f3dulos, puedes encadenar usando : varios m\u00f3dulos.<br \/>\n<code><br \/>\n$ export 'NS_LOG=UdpClient:UdpServer'<br \/>\n<\/code><br \/>\nVamos a crear un m\u00f3dulo para nuestra simulaci\u00f3n y a sacar nuestro mensaje de log. Para ello, edita el archivo basic-iot-sensors.cc y a\u00f1ade estas dos l\u00edneas, por ejemplo, justo debajo de donde se inicia la funci\u00f3n main:<br \/>\n<code><br \/>\nint main (int argc, char *argv[]){<br \/>\nNS_LOG_COMPONENT_DEFINE (\"IotEjemplo\");<br \/>\nNS_LOG_INFO (\"Creando la simulaci\u00f3n\");<br \/>\n<\/code><br \/>\nAunque ya estaba incluido en dicho archivo, si lo utilizas en tu simulaci\u00f3n acuerdate incluir los archivos de cabezera de log (\u00abns3\/log.h\u00bb).<br \/>\nEn la primera funci\u00f3n definimos el m\u00f3dulo IotEjemplo y en la segunda sacamos nuestro primer mensaje. Si ahora queremos ver esa informaci\u00f3n:<br \/>\n<code><br \/>\n$export 'NS_LOG=IotEjemplo'<br \/>\n$ .\/waf --run basic-iot-sensors<br \/>\nWaf: Entering directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\n[2876\/2963] Compiling scratch\/basic-iot-sensors.cc<br \/>\n[2921\/2963] Linking build\/scratch\/basic-iot-sensors<br \/>\nWaf: Leaving directory `\/ns-allinone-3.30.1\/ns-3.30.1\/build'<br \/>\nBuild commands will be stored in build\/compile_commands.json<br \/>\n'build' finished successfully (6.339s)<br \/>\nIotEjemplo:main(): [INFO ] Creando la simulaci\u00f3n<br \/>\n<\/code><br \/>\nDonde, como podemos ver, se muestra nuestro mensaje.<\/p>\n<p>Es buena idea usar el mecanismo de log en cualquier simulaci\u00f3n de ns3 pero se hace imprescindible si aspiras a crear un nuevo m\u00f3dulo para el simulador destinado a ser usado por la comunidad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un buen entorno de logging te permite depurar y entender qu\u00e9 est\u00e1 pasando en tu simulaci\u00f3n, as\u00ed como entender c\u00f3mo est\u00e1 estructurado el simulador NS3 y sus diferentes m\u00f3dulos. El sistema de logging de NS3 se usa mediante variables de &hellip; <a href=\"https:\/\/blog.uclm.es\/felixvillanueva\/2020\/09\/10\/el-sistema-de-log-de-ns3\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":182,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,4,5,6],"tags":[30,43],"class_list":["post-137","post","type-post","status-publish","format-standard","hentry","category-ejemplos","category-ns3","category-simulacion","category-tutorial","tag-ns3","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/137","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/users\/182"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/comments?post=137"}],"version-history":[{"count":0,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/posts\/137\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/media?parent=137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/categories?post=137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.uclm.es\/felixvillanueva\/wp-json\/wp\/v2\/tags?post=137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}