{"id":17975927,"url":"https://github.com/aiekick/logtograph","last_synced_at":"2025-06-13T12:08:25.415Z","repository":{"id":65424415,"uuid":"570656708","full_name":"aiekick/LogToGraph","owner":"aiekick","description":"Numerical signals based Log To Graph Converter ","archived":false,"fork":false,"pushed_at":"2024-12-04T18:34:04.000Z","size":59295,"stargazers_count":45,"open_issues_count":26,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-13T12:08:19.065Z","etag":null,"topics":["analyzer","cmake","curve","electric","formater","generic","glfw","graph","imgui","implot","log","logging","lua","numerical","opengl","signals","simulator","tool"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aiekick.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-11-25T18:29:45.000Z","updated_at":"2025-06-02T14:49:07.000Z","dependencies_parsed_at":"2023-02-12T19:15:15.740Z","dependency_job_id":"20ef3dd0-7c31-4ae4-87ca-14491eed6967","html_url":"https://github.com/aiekick/LogToGraph","commit_stats":{"total_commits":66,"total_committers":1,"mean_commits":66.0,"dds":0.0,"last_synced_commit":"3729726c5067586a1af13f017dec23e1d5e62aa7"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/aiekick/LogToGraph","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aiekick%2FLogToGraph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aiekick%2FLogToGraph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aiekick%2FLogToGraph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aiekick%2FLogToGraph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aiekick","download_url":"https://codeload.github.com/aiekick/LogToGraph/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aiekick%2FLogToGraph/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259642344,"owners_count":22888992,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analyzer","cmake","curve","electric","formater","generic","glfw","graph","imgui","implot","log","logging","lua","numerical","opengl","signals","simulator","tool"],"created_at":"2024-10-29T17:21:24.090Z","updated_at":"2025-06-13T12:08:20.398Z","avatar_url":"https://github.com/aiekick.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LogToGraph\n\n| Backend | Win64 | Linux |\n| ------- | --- | ----- |\n| Opengl 3 | [\u003cimg src=\"https://github.com/aiekick/LogToGraph/workflows/Win64/badge.svg\" width=\"150\"/\u003e](https://github.com/aiekick/LogToGraph/actions?query=workflow%3AWin64) | [\u003cimg src=\"https://github.com/aiekick/LogToGraph/workflows/Linux/badge.svg\" width=\"165\"/\u003e](https://github.com/aiekick/LogToGraph/actions?query=workflow%3ALinux) |\n\nMacOs is not officially maintained but i think he can compile on it.\nSo i let the cmake infos about MacOs in bottom of this ReadMe.\n\n## Goal :\n\nLogToGraph have been designed to display numerical signals based logs as graph.\n\nThe kind of logs you have in mesuring systems like, profiler, electric system/simulator, etc...\n\nThis tool can be adapted to many log formats, since the log pattern matching is achieved by a lua script.\n\n## How is working :\n\n1) The tool will read your log row by row.\n2) Each row will be put in the memory space of your lua script inside a lua variable\n3) The lua script will parse the row and will add a signal tick with infos (category, epoch time, signal name, signal value)\n4) the tool will display all signal in graph\n\nwith this tool you can :\n - display many signals in separate graph\n - display many signals grouped per graph group\n - display all signals in a minimal view\n - search for a signal name\n - show the values of all signals at the timeframe hovered by the mouse\n - show zone of signals (start / end)\n - show a special tag for point event (like erreors by ex)\n - show the changed signals values between two timeframe markers\n - display the whole singals tick in a log view\n - display the whole singals tick in a second log view (for compare with the first)\n - display a code pane for let you test/design your lua script\n - the project file is a sqlite database, so you can open it again without reparse or do treatment with other apps\n - you can parse many log file at same time but with the same parsing lua file\n \n## Howto : Lua Script file\n\nyou must have at least a function 'Init\" in the lua script. (this is the entry point)\n```lua\nfunction Init()\n\tSetRowBufferName(\"buffer_row\");\n\tSetFunctionForEachRow(\"eachRow\");\nend\nfunction eachRow()\n\t_section, _time, _name, _value = string.match(buffer_row, \"\u003cprofiler section=\\\"(.*)\\\" epoch_time=\\\"(.*)\\\" name=\\\"(.*)\\\" render_time_ms=\\\"(.*)\\\"\u003e\")\n\tif _section ~= nil and _time ~= nil and _name ~= nil and _value ~= nil then\n\t\tAddSignalValue(_section, _name, _time, _value)\n\tend\nend\n```\n\nin this 'Init' fucntion you will call :\n\n1) \"SetRowBufferName\" =\u003e will indicate to the tool the name of the varaible who will contain the log file row\n2) \"SetFunctionForEachRow\" =\u003e will indicate to the tool the name of the function who will be called each log file row\n\nin the eachRow function we can have a parsing system (here based on string.match)\nWho will be used for separate log file row components to add as a signal via the fucntion \"AddSignalValue\"\n\nIn the sample directory you have a lua file and his corresponding log file.\nYou have more fucntions available, you can check theme in the sample lua script doc/log_parsing.lua \n\n## Howto : Analyse of the log file in LogToGraph\n\n### Open lua and log file then analyse them\n\n1) open the app\n2) in menu, click new\n3) in the tool pane, you have three buttons\n4) in the tool pane, select your lua script\n5) in the tool pane, select your log file\n6) in the tool pane, click on the analyse buttons\n\n![Open_lua_and_log_file_then_analyse_them](doc/gifs/Open_lua_and_log_file_then_analyse_them.gif)\n\n### show graph of some signals, mouse over, log pane\n\n1) in the tool pane, expand some category\n2) click on some signals\n3) mouse over some signals to see infos of hovered timeframe\n4) click on log pane title and explore it\n\n![show_graph_of_some_signals](doc/gifs/show_graph_of_some_signals.gif)\n\n### group some signals on the same graph, modify signal color mode (auto rainbow or custom)\n\n1) in the group graph pane\n2) on a signal row, select anpother group column. \n   each new comlumn except the gdef, will be group graph\n3) click on a color button, and change the color of the signal.\n4) then click back on the auto coloring nbutton in pane menu\n\n![group_some_signals_on_the_same_graph](doc/gifs/group_some_signals_on_the_same_graph.gif)\n\n### graph navigation\n\n1) mouse hover a graph\n2) with the wheel button, zoom in\n3) with the left mouse button, slide horizontally -you will see than all grpah are synchronized)\n4) with the right mouse button, you can click and drag for define a custom time range\n5) click right on it and a menu will appear, with it you can do many thing and by ex move the legend\n\n![graph_navigation](doc/gifs/graph_navigation.gif)\n\n### display a minimal view of all signals graph\n\n1) go in layout menu\n2) select entry \"all graph signals\"\n3) explore this new pane\n\n![display_a_minimal_view_of_all_signals_graph](doc/gifs/display_a_minimal_view_of_all_signals_graph.gif)\n\n### display a list of signal at the mouse hovered frametime \n\n1) go in layout menu\n2) select entry \"Signals Hovered List\"\n3) now go over signals with mouse and observe the \"Signals Hovered List\" pane change his values\n\n![display_a_list_of_signal_at_the_mouse_hovered_frametime](doc/gifs/display_a_list_of_signal_at_the_mouse_hovered_frametime.gif)\n\n### display a diff list of signal between two frame time markers \n\n1) go in layout menu\n2) select entry \"Signals Hovered Diff\"\n3) now mouse over a signal and press the key \"f\" like first, you will see a red vertical line, you can move it with mouse\n3) move the mouse horizontally over a signal and press the key \"s\" like second, you will see a blue vertical line, you can move it with mouse\n4) observe the pane \"Signals Hovered Diff\", you will see in it all signals who have change their value between the two markers\n5) you can press the key \"r\" like reset, for remove the markers\n6) you have a tip explaining this, in the graphs pane menu\n\n![display_a_diff_list_of_signal_between_two_frame_time_markers](doc/gifs/display_a_diff_list_of_signal_between_two_frame_time_markers.gif)\n\n### measure delta time between two time marks\n\n1) available only on alone graph\n2) mouse hover a curve\n3) when the cruve is thick, clik with the middle mouse button\n4) then move the mouse on another part of the curve\n5) when this new pos is thick too, click with the middle mouse ubtton agian\n6) and you have a Annotation wiht the delta time. hte biggest unit is the day, the lowest the nano seconds.\n\nfor delete or see all your Annotations, open the layout menu, then click on Annotation Pane\nthen you have a list of all annotations per signal, then you can click on the cross on the left for delete what you want.\n\n![measure_delta_time_between_two_time_marks](doc/gifs/measure_delta_time_between_two_time_marks.gif)\n\n### save project file\n\n1) got in menu then press on close item\n2) a dialog appear in the center of the app\n3) you can save the current proejct, save as a new project, continue without saving or cancel\n4) the project is closed\n\nyou also have this dialog when you quit the app\n  \n![save_project](doc/gifs/save_project.gif)\n\n## Lua Parsing Api :\n\n```lua\n\n----------------------------------------------\n-- is the entry point of the script. this function is needed\nInit() \t\t\t\t\t\t\t\t\t \n-- will set the description of your script in app\nSetScriptDescription(description_string)\t \n-- set the lua string varaible name who will be filled with the content of the row file\nSetRowBufferName(\"buffer_row\");\t\t\t \n-- set the function name who will be called at each row of the file\nSetFunctionForEachRow(\"eachRow\");\t\t\t \n-- set the function name who will be called at the end of the file\nSetFunctionForEndFile(\"endFile\");\n\n----------------------------------------------\n-- will log the message in the in app console \nLogInfo(infos_string) \t\t\t\t\n-- will log the message in the in app console \nLogWarning(warning_string) \t\t\t\t \n-- will log the message in the in app console \nLogError(error_string)\n\n----------------------------------------------\n -- return the row number of the file\nGetRowIndex()\t\t\t\t\t\t\t\t\n-- return the number of rows of the file\nGetRowCount()\t\t\t\t\t\t\t\t \n -- get epoch time from datetime in format \"YYYY-MM-DD HH:MM:SS,MS\" or \n -- \"YYYY-MM-DD HH:MM:SS.MS\" with hour offset in second param\nGetEpochTime(\"2023-01-16 15:24:26,464\", 0)    \n\n-- Add Signal ticks\n-- add a signal tag with date, color a name. the help will be displayed when mouse over the tag\nAddSignalTag(date, r, g, b, a, name, help) \n--will add a signal string status\nAddSignalStatus(signal_category, signal_name, signal_epoch_time, signal_status)\n--will add a signal numerical value \nAddSignalValue(signal_category, signal_name, signal_epoch_time, signal_value)\n--will add a signal start zone\nAddSignalStartZone(signal_category, signal_name, signal_epoch_time, signal_string)\n--will add a signal end zone\nAddSignalEndZone(signal_category, signal_name, signal_epoch_time, signal_string)\n```\n\n## Limitations :\n\n1) The log file must be ascii file\n2) You need opengl for using it, since the ui is a opengl based gui\n\n## Howto Build :\n\nYou need to use cMake.\nFor the 3 Os (Win, Linux, MacOs), the cMake usage is exactly the same, \n\n1) Choose a build directory. (called here my_build_directory for instance) and\n2) Choose a Build Mode : \"Release\" / \"MinSizeRel\" / \"RelWithDebInfo\" / \"Debug\" (called here BuildMode for instance)\n3) Run cMake in console : (the first for generate cmake build files, the second for build the binary)\n```cpp\ncmake -B my_build_directory -DCMAKE_BUILD_TYPE=BuildMode\ncmake --build my_build_directory --config BuildMode\n```\n\nSome cMake version need Build mode define via the directive CMAKE_BUILD_TYPE or via --Config when we launch the build. \nThis is why i put the boths possibilities\n\nBy the way you need before, to make sure, you have needed dependencies.\n\n### On Windows :\n\nYou need to have the opengl library installed\n\n### On Linux :\n\nYou need many lib : (X11, xrandr, xinerama, xcursor, mesa)\n\nIf you are on debian you can run :  \n\n```cpp\nsudo apt-get update \nsudo apt-get install libgl1-mesa-dev libx11-dev libxi-dev libxrandr-dev libxinerama-dev libxcursor-dev\n```\n\n### On MacOs :\n\nyou need many lib : opengl and cocoa framework\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faiekick%2Flogtograph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faiekick%2Flogtograph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faiekick%2Flogtograph/lists"}