{"id":947,"date":"2019-04-10T15:28:00","date_gmt":"2019-04-10T14:28:00","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=947"},"modified":"2020-04-10T15:57:55","modified_gmt":"2020-04-10T14:57:55","slug":"log4net-get-root-logger-and-add-custom-appender","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/log4net-get-root-logger-and-add-custom-appender\/","title":{"rendered":"Log4net get root logger and add custom appender"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using Common.Helpers;\nusing log4net.Appender;\nusing log4net.Core;\nusing log4net.Repository.Hierarchy;\nusing Microsoft.Owin;\nusing Owin;\nusing Owin.WebSocket;\nusing Owin.WebSocket.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.WebSockets;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\n\n\/\/[assembly: OwinStartup(typeof(WebSocketsStartup))]\nnamespace WebSockets.Startup\n{\n\n    public class WebSocketsStartup\n    {\n        public static IList OpenConnections = new List();\n\n        public class MyWebSocket : WebSocketConnection\n        {\n            public override async Task OnMessageReceived(ArraySegment message, WebSocketMessageType type)\n            {\n                \/\/Handle the message from the client\n\n                \/\/Example of JSON serialization with the client\n                \/\/var json = Encoding.UTF8.GetString(message.Array, message.Offset, message.Count);\n                \/\/Use something like Json.Net to read the json\n            }\n\n            public override void OnOpen()\n            {\n                OpenConnections.Add(this);\n            }\n\n            public override void OnClose(WebSocketCloseStatus? closeStatus, string closeStatusDescription)\n            {\n                OpenConnections.Remove(this);\n            }\n            \/\/public override bool Authenticate(IOwinRequest request){return true;}\n        }\n\n        public class MyLogAppender : AppenderSkeleton\n        {\n            protected override void Append(LoggingEvent loggingEvent)\n            {\n                var message = $\"{loggingEvent.Level} {loggingEvent.RenderedMessage}\";\n                var data = Encoding.UTF8.GetBytes(message);\n                foreach (var connection in OpenConnections)\n                {\n                    connection.SendText(data, true);\n                }\n            }\n        }\n\n        public static Task GetLogViewer()\n        {\n            var assembly = Assembly.GetExecutingAssembly();\n            \/\/assembly.GetManifestResourceNames();\n            var resourceName = \"WebSockets.Pages.LogViewer.html\";\n\n            using (Stream stream = assembly.GetManifestResourceStream(resourceName))\n            using (StreamReader reader = new StreamReader(stream))\n            {\n                return reader.ReadToEndAsync();\n            }\n        }\n\n        public static void Configuration(IAppBuilder app)\n        {\n            var defaultLogger = LoggingHelper.Logger;\n            defaultLogger.Info(\"Adding custom logappender\");\n\n            Hierarchy h = (Hierarchy)log4net.LogManager.GetRepository();\n            Logger rootLogger = h.Root;\n            ((log4net.Repository.Hierarchy.Logger)rootLogger).AddAppender(new MyLogAppender());\n\n            app.Map(\"\/debuglog\", appBuilder =>\n            {\n                appBuilder.Run(async context =>\n                {\n                    SetCorsHeaders(context);\n\n                    var content = await GetLogViewer();\n                    await context.Response.WriteAsync(content);\n                });\n            });\n\n\n            app.MapWebSocketRoute(\"\/ws\");\n        }\n\n        private static void SetCorsHeaders(IOwinContext context)\n        {\n            try\n            {\n                context.Response.Headers[\"Access-Control-Allow-Origin\"] = \"*\";\n                context.Response.Headers[\"Access-Control-Allow-Headers\"] = context.Request.Headers.Get(\"Access-Control-Request-Headers\");\n                context.Response.Headers[\"Access-Control-Allow-Methods\"] = \"GET, POST, PUT, DELETE, OPTIONS\";\n                context.Response.Headers[\"Access-Control-Expose-Headers\"] = \"Content-Disposition, X-Total-Count, X-Employer-Code\";\n            }\n            catch (Exception)\n            {\n                \/\/ ignore\n            }\n        }\n\n        private static void ConfigureCors(IAppBuilder app)\n        {\n            app.MapWhen(ctx => ctx.Request.Method.Equals(\"OPTIONS\", System.StringComparison.OrdinalIgnoreCase), appBuilder =>\n            {\n                appBuilder.Run(context =>\n                {\n                    SetCorsHeaders(context);\n                    return context.Response.WriteAsync(\"\");\n                });\n            });\n\n            app.Use(async (context, next) =>\n            {\n                SetCorsHeaders(context);\n                await next();\n                SetCorsHeaders(context);\n            });\n        }\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-947","post","type-post","status-publish","format-standard","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=947"}],"version-history":[{"count":2,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/947\/revisions"}],"predecessor-version":[{"id":3699,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/947\/revisions\/3699"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}