Add log_fini() function to release all memory allocated by logging framework

This is e.g. quite useful to call at the end of test code, in order to
show that all memory allocated actually is released before exit().
diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index e51487b..3193411 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -214,6 +214,7 @@
 	   int line, int cont, const char *format, ...)
 				__attribute__ ((format (printf, 6, 7)));
 int log_init(const struct log_info *inf, void *talloc_ctx);
+void log_fini(void);
 int log_check_level(int subsys, unsigned int level);
 
 /* context management */
diff --git a/src/logging.c b/src/logging.c
index b96e64a..4d6fd40 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -880,6 +880,21 @@
 	return 0;
 }
 
+/* \brief De-initialize the Osmocom logging core
+ * This function destroys all targets and releases associated memory */
+void log_fini(void)
+{
+	struct log_target *tar, *tar2;
+
+	llist_for_each_entry_safe(tar, tar2, &osmo_log_target_list, entry)
+		log_target_destroy(tar);
+
+	talloc_free(osmo_log_info);
+	osmo_log_info = NULL;
+	talloc_free(tall_log_ctx);
+	tall_log_ctx = NULL;
+}
+
 /*! \brief Check whether a log entry will be generated.
  *  \returns != 0 if a log entry might get generated by at least one target */
 int log_check_level(int subsys, unsigned int level)