sdis_log.c (3724B)
1 /* Copyright (C) 2016-2025 |Méso|Star> (contact@meso-star.com) 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #define _POSIX_C_SOURCE 200112L /* snprintf support */ 17 18 #include "sdis_device_c.h" 19 #include "sdis_log.h" 20 21 #include <rsys/logger.h> 22 23 #include <stdarg.h> 24 25 /******************************************************************************* 26 * Helper functions 27 ******************************************************************************/ 28 static void 29 log_msg 30 (const struct sdis_device* dev, 31 const enum log_type stream, 32 const char* msg, 33 va_list vargs) 34 { 35 ASSERT(dev && msg); 36 if(dev->verbose) { 37 CHK(logger_vprint(dev->logger, stream, msg, vargs) == RES_OK); 38 } 39 } 40 41 static void 42 print_info(const char* msg, void* ctx) 43 { 44 struct sdis_device* dev = ctx; 45 46 if(dev->no_escape_sequence) { 47 fprintf(stderr, MSG_INFO_PREFIX_PLAIN_TEXT"%s", msg); 48 } else { 49 fprintf(stderr, MSG_INFO_PREFIX"%s", msg); 50 } 51 } 52 53 static void 54 print_err(const char* msg, void* ctx) 55 { 56 struct sdis_device* dev = ctx; 57 if(dev->no_escape_sequence) { 58 fprintf(stderr, MSG_ERROR_PREFIX_PLAIN_TEXT"%s", msg); 59 } else { 60 fprintf(stderr, MSG_ERROR_PREFIX"%s", msg); 61 } 62 } 63 64 static void 65 print_warn(const char* msg, void* ctx) 66 { 67 struct sdis_device* dev = ctx; 68 if(dev->no_escape_sequence) { 69 fprintf(stderr, MSG_WARNING_PREFIX_PLAIN_TEXT"%s", msg); 70 } else { 71 fprintf(stderr, MSG_WARNING_PREFIX"%s", msg); 72 } 73 } 74 75 /******************************************************************************* 76 * Local functions 77 ******************************************************************************/ 78 res_T 79 setup_log_default(struct sdis_device* dev) 80 { 81 res_T res = RES_OK; 82 ASSERT(dev); 83 84 res = logger_init(dev->allocator, &dev->logger__); 85 if(res != RES_OK) { 86 if(dev->verbose) print_err("Could not setup the logger.\n", NULL); 87 goto error; 88 } 89 logger_set_stream(&dev->logger__, LOG_OUTPUT, print_info, dev); 90 logger_set_stream(&dev->logger__, LOG_ERROR, print_err, dev); 91 logger_set_stream(&dev->logger__, LOG_WARNING, print_warn, dev); 92 dev->logger = &dev->logger__; 93 94 exit: 95 return res; 96 error: 97 goto exit; 98 } 99 100 void 101 log_info(const struct sdis_device* dev, const char* msg, ...) 102 { 103 va_list vargs_list; 104 ASSERT(dev && msg); 105 106 #ifdef SDIS_ENABLE_MPI 107 /* Log standard messages only on master process */ 108 if(dev->mpi_rank == 0) 109 #endif 110 { 111 va_start(vargs_list, msg); 112 log_msg(dev, LOG_OUTPUT, msg, vargs_list); 113 va_end(vargs_list); 114 } 115 } 116 117 void 118 log_err(const struct sdis_device* dev, const char* msg, ...) 119 { 120 va_list vargs_list; 121 ASSERT(dev && msg); 122 123 #ifdef SDIS_ENABLE_MPI 124 /* Log error messages only on master process */ 125 if(dev->mpi_rank == 0) 126 #endif 127 { 128 va_start(vargs_list, msg); 129 log_msg(dev, LOG_ERROR, msg, vargs_list); 130 va_end(vargs_list); 131 } 132 } 133 134 void 135 log_warn(const struct sdis_device* dev, const char* msg, ...) 136 { 137 va_list vargs_list; 138 ASSERT(dev && msg); 139 140 #ifdef SDIS_ENABLE_MPI 141 /* Log warnings only on master process */ 142 if(dev->mpi_rank == 0) 143 #endif 144 { 145 va_start(vargs_list, msg); 146 log_msg(dev, LOG_WARNING, msg, vargs_list); 147 va_end(vargs_list); 148 } 149 } 150