Bladeren bron

enable variadic arguments for log messages

Julius Pfrommer 10 jaren geleden
bovenliggende
commit
cf8db00bf5
5 gewijzigde bestanden met toevoegingen van 45 en 32 verwijderingen
  1. 15 2
      examples/logger_stdout.c
  2. 2 3
      examples/networklayer_tcp.c
  3. 2 5
      examples/networklayer_udp.c
  4. 24 18
      include/ua_log.h
  5. 2 4
      src/server/ua_server_binary.c

+ 15 - 2
examples/logger_stdout.c

@@ -4,6 +4,7 @@
  */
 
 #include <stdio.h>
+#include <stdarg.h>
 #include "logger_stdout.h"
 
 static void print_time(void) {
@@ -15,18 +16,30 @@ static void print_time(void) {
 }
 
 #define LOG_FUNCTION(LEVEL) \
-	static void log_##LEVEL(UA_LoggerCategory category, const char *msg) { \
+	static void log_##LEVEL(UA_LoggerCategory category, const char *msg, ...) { \
         printf("[");                                                    \
 		print_time();                                                   \
-        printf("] " #LEVEL "/%s\t%s\n", UA_LoggerCategoryNames[category], msg); \
+        va_list ap;                                                     \
+        va_start(ap, msg);                                              \
+        printf("] " #LEVEL "/%s\t", UA_LoggerCategoryNames[category]);  \
+        vprintf(msg, ap);                                               \
+        printf("\n");                                                   \
+        va_end(ap);                                                     \
 	}
 
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+#endif
 LOG_FUNCTION(trace)
 LOG_FUNCTION(debug)
 LOG_FUNCTION(info)
 LOG_FUNCTION(warning)
 LOG_FUNCTION(error)
 LOG_FUNCTION(fatal)
+#if defined(__GNUC__) || defined(__clang__)
+#pragma GCC diagnostic pop
+#endif
 
 UA_Logger Logger_Stdout_new(void) {
 	return (UA_Logger){

+ 2 - 3
examples/networklayer_tcp.c

@@ -318,9 +318,8 @@ static UA_StatusCode ServerNetworkLayerTCP_start(ServerNetworkLayerTCP *layer, U
 
 	setNonBlocking(layer->serversockfd);
 	listen(layer->serversockfd, MAXBACKLOG);
-    char msg[256];
-    sprintf(msg, "Listening on %.*s\n", layer->discoveryUrl.length, layer->discoveryUrl.data);
-    UA_LOG_INFO((*logger), UA_LOGGERCATEGORY_SERVER, msg);
+    UA_LOG_INFO((*logger), UA_LOGGERCATEGORY_SERVER, "Listening on %.*s",
+                layer->discoveryUrl.length, layer->discoveryUrl.data);
     return UA_STATUSCODE_GOOD;
 }
 

+ 2 - 5
examples/networklayer_udp.c

@@ -192,11 +192,8 @@ static UA_StatusCode ServerNetworkLayerUDP_start(ServerNetworkLayerUDP *layer, U
 	}
 
 	setNonBlocking(layer->serversockfd);
-    char msg[256];
-    sprintf(msg, "Listening for UDP connections on %s:%d",
-            inet_ntoa(serv_addr.sin_addr),
-            ntohs(serv_addr.sin_port));
-    UA_LOG_INFO((*logger), UA_LOGGERCATEGORY_SERVER, msg);
+    UA_LOG_INFO((*logger), UA_LOGGERCATEGORY_SERVER, "Listening for UDP connections on %s:%d",
+                inet_ntoa(serv_addr.sin_addr), ntohs(serv_addr.sin_port));
     return UA_STATUSCODE_GOOD;
 }
 

+ 24 - 18
include/ua_log.h

@@ -41,48 +41,54 @@ typedef enum UA_LoggerCategory {
 extern UA_EXPORT const char *UA_LoggerCategoryNames[3];
 
 typedef struct UA_Logger {
-    void (*log_trace)(UA_LoggerCategory category, const char *msg);
-    void (*log_debug)(UA_LoggerCategory category, const char *msg);
-    void (*log_info)(UA_LoggerCategory category, const char *msg);
-    void (*log_warning)(UA_LoggerCategory category, const char *msg);
-    void (*log_error)(UA_LoggerCategory category, const char *msg);
-    void (*log_fatal)(UA_LoggerCategory category, const char *msg);
+    void (*log_trace)(UA_LoggerCategory category, const char *msg, ...);
+    void (*log_debug)(UA_LoggerCategory category, const char *msg, ...);
+    void (*log_info)(UA_LoggerCategory category, const char *msg, ...);
+    void (*log_warning)(UA_LoggerCategory category, const char *msg, ...);
+    void (*log_error)(UA_LoggerCategory category, const char *msg, ...);
+    void (*log_fatal)(UA_LoggerCategory category, const char *msg, ...);
 } UA_Logger;
 
 #if UA_LOGLEVEL <= 100
-#define UA_LOG_TRACE(LOGGER, CATEGORY, MSG) do { if(LOGGER.log_trace) LOGGER.log_trace(CATEGORY, MSG); } while(0)
+#define UA_LOG_TRACE(LOGGER, CATEGORY, MSG...) do { \
+        if(LOGGER.log_trace) LOGGER.log_trace(CATEGORY, MSG); } while(0)
 #else
-#define UA_LOG_TRACE(LOGGER, CATEGORY, MSG) do {} while(0)
+#define UA_LOG_TRACE(LOGGER, CATEGORY, MSG...) do {} while(0)
 #endif
 
 #if UA_LOGLEVEL <= 200
-#define UA_LOG_DEBUG(LOGGER, CATEGORY, MSG) do { if(LOGGER.log_debug) LOGGER.log_debug(CATEGORY, MSG); } while(0)
+#define UA_LOG_DEBUG(LOGGER, CATEGORY, MSG...) do { \
+        if(LOGGER.log_debug) LOGGER.log_debug(CATEGORY, MSG); } while(0)
 #else
-#define UA_LOG_DEBUG(LOGGER, CATEGORY, MSG) do {} while(0)
+#define UA_LOG_DEBUG(LOGGER, CATEGORY, MSG...) do {} while(0)
 #endif
 
 #if UA_LOGLEVEL <= 300
-#define UA_LOG_INFO(LOGGER, CATEGORY, MSG) do { if(LOGGER.log_info) LOGGER.log_info(CATEGORY, MSG); } while(0)
+#define UA_LOG_INFO(LOGGER, CATEGORY, MSG...) do { \
+        if(LOGGER.log_info) LOGGER.log_info(CATEGORY, MSG); } while(0)
 #else
-#define UA_LOG_INFO(LOGGER, CATEGORY, MSG) do {} while(0)
+#define UA_LOG_INFO(LOGGER, CATEGORY, MSG...) do {} while(0)
 #endif
 
 #if UA_LOGLEVEL <= 400
-#define UA_LOG_WARNING(LOGGER, CATEGORY, MSG) do { if(LOGGER.log_warning) LOGGER.log_warning(CATEGORY, MSG); } while(0)
+#define UA_LOG_WARNING(LOGGER, CATEGORY, MSG...) do { \
+        if(LOGGER.log_warning) LOGGER.log_warning(CATEGORY, MSG); } while(0)
 #else
-#define UA_LOG_WARNING(LOGGER, CATEGORY, MSG) do {} while(0)
+#define UA_LOG_WARNING(LOGGER, CATEGORY, MSG...) do {} while(0)
 #endif
 
 #if UA_LOGLEVEL <= 500
-#define UA_LOG_ERROR(LOGGER, CATEGORY, MSG) do { if(LOGGER.log_error) LOGGER.log_error(CATEGORY, MSG); } while(0)
+#define UA_LOG_ERROR(LOGGER, CATEGORY, MSG...) do { \
+        if(LOGGER.log_error) LOGGER.log_error(CATEGORY, MSG); } while(0)
 #else
-#define UA_LOG_ERROR(LOGGER, CATEGORY, MSG) do {} while(0)
+#define UA_LOG_ERROR(LOGGER, CATEGORY, MSG...) do {} while(0)
 #endif
 
 #if UA_LOGLEVEL <= 600
-#define UA_LOG_FATAL(LOGGER, CATEGORY, MSG) do { if(LOGGER.log_fatal) LOGGER.log_fatal(CATEGORY, MSG); } while(0)
+#define UA_LOG_FATAL(LOGGER, CATEGORY, MSG...) do { \
+        if(LOGGER.log_fatal) LOGGER.log_fatal(CATEGORY, MSG); } while(0)
 #else
-#define UA_LOG_FATAL(LOGGER, CATEGORY, MSG) do {} while(0)
+#define UA_LOG_FATAL(LOGGER, CATEGORY, MSG...) do {} while(0)
 #endif
 
 /** @} */

+ 2 - 4
src/server/ua_server_binary.c

@@ -332,10 +332,8 @@ static void processMSG(UA_Connection *connection, UA_Server *server, const UA_By
         break;
 
     default: {
-        char logmsg[60];
-        sprintf(logmsg, "Unknown request: NodeId(ns=%d, i=%d)",
-                requestType.namespaceIndex, requestType.identifier.numeric);
-        UA_LOG_INFO(server->logger, UA_LOGGERCATEGORY_COMMUNICATION, logmsg);
+        UA_LOG_INFO(server->logger, UA_LOGGERCATEGORY_COMMUNICATION, "Unknown request: NodeId(ns=%d, i=%d)",
+                    requestType.namespaceIndex, requestType.identifier.numeric);
 
         UA_RequestHeader  p;
         UA_ResponseHeader r;