{"id":1332,"date":"2022-07-02T21:13:16","date_gmt":"2022-07-02T21:13:16","guid":{"rendered":"https:\/\/www.budus.it\/Blog\/?p=1332"},"modified":"2022-07-02T21:13:16","modified_gmt":"2022-07-02T21:13:16","slug":"funzione-per-scrivere-su-file-di-log-come-una-printf","status":"publish","type":"post","link":"https:\/\/www.budus.it\/Blog\/funzione-per-scrivere-su-file-di-log-come-una-printf\/","title":{"rendered":"Funzione per scrivere su File di LOG come una printf"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ho cercato in giro qualcosa come &#8220;write log file in C like printf&#8221; senza grandi risultati, o meglio: nulla di &#8220;prefatto&#8221;, ho realizzato una cozzaglia di codice trovato qua e l\u00e0, realizzando quanto propongo.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">In pratica desideravo qualcosa di semplice, non mi serviva utilizzare chiss\u00e0 quale libreria o funzionalit\u00e0 impestata, sostanzialmente: <strong>volevo scrivere su un file di testo una stringa &#8220;formattata&#8221; passando i parametri come fosse una &#8220;printf&#8221;.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00ec, detta cos\u00ec \u00e8 un po&#8217; criptica la faccenda, ma se qualcuno cerca di risolvere questo problema &#8211; probabilmente &#8211; capisce cosa intendo dire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mi aspetto che lo capisca almeno dal codice che ho scritto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdarg.h>\n#include &lt;stdlib.h>\n#include &lt;stdio.h>\n#include &lt;string.h>\n#include &lt;time.h>\n\n#define MAXBUFFERSIZE   2048\n\nint print_log(const char *log_file,     \/\/ Path of log file\n              const char log_msg_type,  \/\/ Letter of Log Type (ex: I = Info, A = Alert, E = Error)\n              const char *format,       \/\/ Parameters like printf\n              ...\n              ) {\n  va_list arg;\n  int done;\n\n  char  psBuffer&#91;MAXBUFFERSIZE];\n  char  psLogData&#91;MAXBUFFERSIZE * 2];\n  char  psTime&#91;MAXBUFFERSIZE];\n\n  time_t t;   \/\/ not a primitive datatype\n  struct tm *tmp;\n\n  memset(psBuffer, '\\0', MAXBUFFERSIZE - 1);\n  memset(psLogData, '\\0', (MAXBUFFERSIZE * 2) - 1);\n  memset(psTime, '\\0', MAXBUFFERSIZE - 1);\n\n  va_start (arg, format);\n  done = vsnprintf(psBuffer, MAXBUFFERSIZE - 2, format, arg);\n  va_end (arg);\n\n  time(&amp;t);\n  tmp = localtime(&amp;t);\n  if (tmp == NULL) {\n    perror(\"localtime\");\n    exit(EXIT_FAILURE);\n  }\n  strftime(psTime, MAXBUFFERSIZE - 1, \"%F %T\", tmp);\n  sprintf(psLogData, \"&#91;%c] %s :: %s\\n\", log_msg_type, psTime, psBuffer);\n\n  FILE* fp;\n  fp = fopen(log_file, \"a+\");\n  fputs(psLogData, fp);\n  fclose(fp);\n\n  return done;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Per usare il tutto \u00e8 sufficiente salvare il codice di cui sopra in un file che potrebbe chiamarsi &#8220;printlog.h&#8221; e quindi usarlo in qualcosa di simile a questo:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"printlog.h\"\n\nint main (int argc, char **argv) {\n  print_log(\"\/tmp\/test.log\", 'I', \"Parametro: %s\", argv&#91;1]);\n\n  return EXIT_SUCCESS;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il programma di test l&#8217;ho salvato in &#8220;printlog.c&#8221; e compilato (su Linux Debian) con questo comando:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gcc -o printlog printlog.c<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Spero sia utile a qualcuno, fatemi sapere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PS: Se uno guarda bene il codice, si accorger\u00e0 che fa un po&#8217; schifo, soprattutto nella gestione della dimensione massima delle stringhe, ma avevo fretta&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ho cercato in giro qualcosa come &#8220;write log file in C like printf&#8221; senza grandi risultati, o meglio: nulla di &#8220;prefatto&#8221;, ho realizzato una cozzaglia di codice trovato qua e l\u00e0, realizzando quanto propongo.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[9],"class_list":["post-1332","post","type-post","status-publish","format-standard","hentry","category-software","tag-linux"],"_links":{"self":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1332","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/comments?post=1332"}],"version-history":[{"count":1,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1332\/revisions"}],"predecessor-version":[{"id":1333,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/posts\/1332\/revisions\/1333"}],"wp:attachment":[{"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/media?parent=1332"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/categories?post=1332"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.budus.it\/Blog\/wp-json\/wp\/v2\/tags?post=1332"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}