diff --git a/src/main/java/me/moocar/logbackgelf/GelfUDPAppender.java b/src/main/java/me/moocar/logbackgelf/GelfUDPAppender.java index ac486e3..80c2f87 100644 --- a/src/main/java/me/moocar/logbackgelf/GelfUDPAppender.java +++ b/src/main/java/me/moocar/logbackgelf/GelfUDPAppender.java @@ -92,8 +92,12 @@ public void start() { } @Override - protected void writeOut(E event) throws IOException { - super.writeOut(event); + protected void writeOut(E event) { + try { + super.writeOut(event); + } catch (IOException e) { + addError("IO Exception in UDP output stream", e); + } } /** diff --git a/src/test/clojure/me/moocar/logbackgelf/appender_test.clj b/src/test/clojure/me/moocar/logbackgelf/appender_test.clj new file mode 100644 index 0000000..aa76b1a --- /dev/null +++ b/src/test/clojure/me/moocar/logbackgelf/appender_test.clj @@ -0,0 +1,65 @@ +(ns me.moocar.logbackgelf.appender-test + (:require [clojure.core.async :as async :refer [> msg-ch + (async/take 2) + (async/into []) + expected-json "Converts a test.check generated log into the same format it should be received in by the server" @@ -301,13 +264,15 @@ (get json (keyword (str "_" field-name)))))))))) (defn t-all [] - (fixture [system (make-config)] - (t-substitute system) - (t-exception system) - (t-static-additional-field system) - (t-undefined-hostname-string system) - (is (= true (:result (tc/quick-check 100 (t-field-types system))))) - (is (= true (:result (tc/quick-check 100 (t-test system))))))) + (system/fixture + [system (system/make-config)] + + (t-substitute system) + (t-exception system) + (t-static-additional-field system) + (t-undefined-hostname-string system) + (is (= true (:result (tc/quick-check 100 (t-field-types system))))) + (is (= true (:result (tc/quick-check 100 (t-test system))))))) (deftest t (t-all)) @@ -315,7 +280,7 @@ (defn send-request "For dev purposes" [] - (let [config (make-config)] + (let [config (system/make-config)] (configure-logback-xml (xml-input-stream (logback-xml-sexp config))) (let [logger (LoggerFactory/getLogger "this_logger")] (dotimes [_ 10] diff --git a/src/test/clojure/me/moocar/logbackgelf/servers.clj b/src/test/clojure/me/moocar/logbackgelf/servers.clj index 44dc216..930bffd 100644 --- a/src/test/clojure/me/moocar/logbackgelf/servers.clj +++ b/src/test/clojure/me/moocar/logbackgelf/servers.clj @@ -119,10 +119,16 @@ {:keys [length offset data]} packet] (if (chunked? packet) (let [[chunks full-packet] (process-chunk chunks (dechunk packet))] - (when full-packet - (>!! msg-ch (packet->json full-packet))) + (try + (when full-packet + (>!! msg-ch (packet->json full-packet))) + (catch Throwable t + (.printStackTrace t))) (recur chunks)) - (do (>!! msg-ch (packet->json packet)) + (do (try + (>!! msg-ch (packet->json packet)) + (catch Throwable t + (.printStackTrace t))) (recur chunks))))))))) (defn new-datagram-socket-reader diff --git a/src/test/clojure/me/moocar/logbackgelf/system.clj b/src/test/clojure/me/moocar/logbackgelf/system.clj new file mode 100644 index 0000000..1604d8d --- /dev/null +++ b/src/test/clojure/me/moocar/logbackgelf/system.clj @@ -0,0 +1,44 @@ +(ns me.moocar.logbackgelf.system + (:require [clojure.core.async :as async] + [com.stuartsierra.component :as component] + [me.moocar.logbackgelf.servers :as servers]) + (:import (org.slf4j LoggerFactory))) + +(defn make-config + [] + {:full-message-pattern "%rEx%m" + :short-message-pattern "%rEx%m" + :use-logger-name? true + :use-marker? true + :host "Test" + :version "1.1" + :debug? false + :appender {:type :udp + :port 12202} + :static-additional-fields {"_facility" "logback-gelf-test"} + :include-full-mdc? true}) + +(defn new-test-system + [config] + (component/system-map + :server (servers/new-test-server config (async/chan 100)) + :config config)) + +(defmacro with-test-system + "Starts a new system" + [[binding-form system-map] & body] + `(let [system# (component/start ~system-map) + ~binding-form system#] + (try ~@body + (finally + (component/stop system#))))) + +(defmacro fixture [[binding-form config] & body] + `(let [config# ~config] + (with-test-system [system# (new-test-system config#)] + (let [~binding-form system#] + (try + ~@body + (finally + (.stop (LoggerFactory/getILoggerFactory)))))))) +