YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
YarpLoggerFiles.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include <iostream>
7#include <cstring>
8#include <string>
9#include <sstream>
10#include <cstdio>
11#include <fstream>
12#include <iterator>
13#include <yarp/os/RpcClient.h>
14#include <yarp/os/SystemClock.h>
16
17using namespace yarp::os;
18using namespace yarp::yarpLogger;
19
20bool LoggerEngine::export_log_to_text_file (std::string filename, std::string portname)
21{
22 if (log_updater == nullptr) {
23 return false;
24 }
25 if (filename.size() == 0) {
26 return false;
27 }
28
29 log_updater->mutex.lock();
30 std::list<LogEntry>::iterator it;
31 for (it = log_updater->log_list.begin(); it != log_updater->log_list.end(); it++)
32 {
33 if (it->logInfo.port_complete == portname)
34 {
35 std::ofstream file1;
36 file1.open(filename.c_str());
37 if (file1.is_open() == false) {log_updater->mutex.unlock(); return false;}
38 std::vector<MessageEntry>::iterator it1;
39 for (it1 = it->entry_list.begin(); it1 != it->entry_list.end(); it1++)
40 {
41 file1 << it1->yarprun_timestamp << " " << it1->local_timestamp << " <" << it1->level.toString() << "> " << it1->text << '\n';
42 }
43 file1.close();
44 }
45 }
46 log_updater->mutex.unlock();
47 return true;
48}
49
50void SaveToFile(std::ofstream& file, unsigned int data)
51{
52 file << data << '\n';
53}
54
55void SaveToFile(std::ofstream& file, std::string data)
56{
57 if (data.empty())
58 {
59 file << "NULL-DATA" << '\n';
60 }
61 else
62 {
63 file << data << '\n';
64 }
65}
66
67void LoadFromFile(std::ifstream& file, std::string& data)
68{
69 file >> data;
70 if (data =="NULL-DATA") data="";
71}
72
73void LoadFromFile(std::ifstream& file, unsigned int& data)
74{
75 file >> data;
76}
77
78std::string start_string = "<#STRING_START#>";
79std::string end_string = "<#STRING_END#>";
80
81bool LoggerEngine::save_all_logs_to_file (std::string filename)
82{
83 if (log_updater == nullptr) {
84 return false;
85 }
86 if (filename.size() == 0) {
87 return false;
88 }
89
90 const int LOGFILE_VERSION_1 = 1;
91
92 std::ofstream file1;
93 file1.open(filename.c_str());
94 if (file1.is_open() == false) {
95 return false;
96 }
97
98 bool wasRunning = log_updater->isRunning();
99 if (wasRunning) {
100 log_updater->stop();
101 }
102 std::list<LogEntry>::iterator it;
104 SaveToFile(file1, log_updater->log_list.size());
105 for (it = log_updater->log_list.begin(); it != log_updater->log_list.end(); it++)
106 {
107 SaveToFile(file1, it->logInfo.ip_address);
108 SaveToFile(file1, it->logInfo.port_complete);
109 SaveToFile(file1, it->logInfo.port_prefix);
110 SaveToFile(file1, it->logInfo.port_system);
111 SaveToFile(file1, it->logInfo.process_name);
112 SaveToFile(file1, it->logInfo.process_pid);
113 SaveToFile(file1, it->logInfo.get_number_of_traces());
114 SaveToFile(file1, it->logInfo.get_number_of_debugs());
115 SaveToFile(file1, it->logInfo.get_number_of_infos());
116 SaveToFile(file1, it->logInfo.get_number_of_warnings());
117 SaveToFile(file1, it->logInfo.get_number_of_errors());
118 SaveToFile(file1, it->logInfo.get_number_of_fatals());
119 SaveToFile(file1, it->logInfo.logsize);
120 SaveToFile(file1, it->entry_list.size());
121
122 std::vector<MessageEntry>::iterator it1;
123 for (it1 = it->entry_list.begin(); it1 != it->entry_list.end(); it1++)
124 {
125 SaveToFile(file1, it1->yarprun_timestamp);
126 SaveToFile(file1, it1->local_timestamp);;
127 SaveToFile(file1, it1->level.toInt());
129 for (char s : it1->text)
130 {
131 file1.put(s);
132 }
133 file1 << end_string << '\n';
134 }
135 }
136 file1.close();
137 if (wasRunning) {
138 log_updater->start();
139 }
140 return true;
141}
142
143std::streamoff get_tag(std::ifstream& file, const char* tag)
144{
145 std::streamoff pos=file.tellg();
146 int tag_size=strlen(tag);
147 char* buff = new char[tag_size+2];
148 for (int i = 0; i < tag_size + 2; i++) {
149 buff[i] = 0;
150 }
151 std::streamoff off=0;
152 for (; ;off++)
153 {
154 file.seekg(pos+off);
155 file.read(buff,tag_size);
156 if (file.good()==false)
157 {
158 delete [] buff;
159 return -1;
160 }
161 if (strcmp(buff, tag) == 0) {
162 break;
163 }
164 }
165 delete [] buff;
166 return pos+off;
167}
168
169bool LoggerEngine::load_all_logs_from_file (std::string filename)
170{
172 int end_string_size=strlen(end_string.c_str());
173
174 if (log_updater == nullptr) {
175 return false;
176 }
177 if (filename.size() == 0) {
178 return false;
179 }
180
181 const int LOGFILE_VERSION_1 = 1;
182
183 std::ifstream file1;
184 file1.open(filename.c_str(),std::ifstream::binary);
185 if (file1.is_open() == false) {
186 return false;
187 }
188
190 bool wasRunning = log_updater->isRunning();
191 if (wasRunning) {
192 log_updater->stop();
193 }
196 {
197 unsigned int size_log_list;
199
200 log_updater->log_list.clear();
201 for (unsigned int i=0; i< size_log_list; i++)
202 {
203 LogEntry l_tmp(true, 10000);
204 unsigned int dummy;
205 LoadFromFile(file1, l_tmp.logInfo.ip_address);
206 LoadFromFile(file1, l_tmp.logInfo.port_complete);
207 LoadFromFile(file1, l_tmp.logInfo.port_prefix);
208 LoadFromFile(file1, l_tmp.logInfo.port_system);
209 LoadFromFile(file1, l_tmp.logInfo.process_name);
210 LoadFromFile(file1, l_tmp.logInfo.process_pid);
211 LoadFromFile(file1, dummy); //l_tmp.logInfo.number_of_traces;
212 LoadFromFile(file1, dummy); //l_tmp.logInfo.number_of_debugs;
213 LoadFromFile(file1, dummy); //l_tmp.logInfo.number_of_infos;
214 LoadFromFile(file1, dummy); //l_tmp.logInfo.number_of_warning;
215 LoadFromFile(file1, dummy); //l_tmp.logInfo.number_of_errors;
216 LoadFromFile(file1, dummy); //l_tmp.logInfo.number_of_fatals;
217 LoadFromFile(file1, l_tmp.logInfo.logsize);
218 unsigned int size_entry_list;
220 for (size_t j=0; j< size_entry_list; j++)
221 {
223 LoadFromFile(file1, m_tmp.yarprun_timestamp);
224 LoadFromFile(file1, m_tmp.local_timestamp);
225 unsigned int tmp_level;
227 m_tmp.level.setLevel(tmp_level);
228
229 std::streamoff start_p = get_tag(file1, start_string.c_str());
230 std::streamoff end_p = get_tag(file1, end_string.c_str());
231 //validity check
232 if (start_p < 0 || end_p < 0 || end_p - start_p + start_string_size <= 0) {
233 return false;
234 }
235 char *buff = new char[(unsigned int)(end_p-start_p+start_string_size)];
236 //memset(buff,0,end_p-start_p+start_string_size);
239 {
241 }
242 else
243 {
244 //skip empty strings
245 }
247 m_tmp.text=buff;
248 delete [] buff;
249 l_tmp.entry_list.push_back(m_tmp);
250 }
251 log_updater->log_list.push_back(l_tmp);
252 }
253 }
254 file1.close();
255 if (wasRunning) {
256 log_updater->start();
257 }
258 return true;
259}
std::streamoff get_tag(std::ifstream &file, const char *tag)
std::string end_string
std::string start_string
void SaveToFile(std::ofstream &file, unsigned int data)
void LoadFromFile(std::ifstream &file, std::string &data)
A mini-server for performing network communication in the background.
void close() override
Stop port activity.
bool open(const std::string &name) override
Start port operation, with a specific name, with automatically-chosen network parameters.
T * read(bool shouldWait=true) override
Read an available object from the port.
bool load_all_logs_from_file(std::string filename)
bool save_all_logs_to_file(std::string filename)
bool export_log_to_text_file(std::string filename, std::string portname)
An interface to the operating system, including Port based communication.