Logback SyslogAppender stacktrace 日志记录前缀
Posted
技术标签:
【中文标题】Logback SyslogAppender stacktrace 日志记录前缀【英文标题】:Logback SyslogAppender stacktrace logging prefix 【发布时间】:2012-04-02 10:37:57 【问题描述】:我们最近从 Log4J 切换到 Logback。除了 SyslogAppender 中的堆栈跟踪之外,日志记录似乎运行良好。它们的前缀就像剩余的日志消息一样。
有什么方法可以禁用此前缀并确保它们将像在 Log4J SyslogAppender 中一样打印?提前致谢。
当前行为:
Apr 02 12:31:08 host.name 2012-04-02T12:31:08.418+0200 ajp-bio-8009-exec-7 com.gooddata.exception.servlet.HttpExceptionTranslator ERROR: Processing client_request=/gdcwebapp/gdc/projects/FoodMartDemo/groups/everyone status=FAILED errorCode=gdc.usergroups.default_group_modification errorDescription="Attempt to modify default group (everyone)" exceptionId=abc37cf0-9c56-4e68-a4a7-2111ca823fd4 component=webapp request_id=cAWvICOaKVFF1VvI userId=1 projectId=FoodMartDemo nodeId=nodeOne nodeId=nodeOne, requestId=cAWvICOaKVFF1VvI, userId=1, projectId=FoodMartDemo
Apr 02 12:31:08 host.name #011at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Apr 02 12:31:08 host.name #011at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
Apr 02 12:31:08 host.name #011at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Apr 02 12:31:08 host.name #011at java.lang.reflect.Method.invoke(Method.java:601)
Apr 02 12:31:08 host.name #011at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212)
Apr 02 12:31:08 host.name #011at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
Apr 02 12:31:08 host.name #011at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
Apr 02 12:31:08 host.name #011at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
Apr 02 12:31:08 host.name #011at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
Apr 02 12:31:08 host.name #011at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
Apr 02 12:31:08 host.name #011at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
期望的行为:
Apr 02 12:31:08 host.name 2012-04-02T12:31:08.418+0200 ajp-bio-8009-exec-7 com.gooddata.exception.servlet.HttpExceptionTranslator ERROR: Processing client_request=/gdcwebapp/gdc/projects/FoodMartDemo/groups/everyone status=FAILED errorCode=gdc.usergroups.default_group_modification errorDescription="Attempt to modify default group (everyone)" exceptionId=abc37cf0-9c56-4e68-a4a7-2111ca823fd4 component=webapp request_id=cAWvICOaKVFF1VvI userId=1 projectId=FoodMartDemo nodeId=nodeOne nodeId=nodeOne, requestId=cAWvICOaKVFF1VvI, userId=1, projectId=FoodMartDemo
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
SyslogAppender 的当前 logback.xml:
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<facility>local2</facility>
<syslogHost>localhost</syslogHost>
<suffixPattern>%dyyyy-MM-dd'T'HH:mm:ss.SSSZ %t %c %p: %m component=webapp request_id=%XrequestId userId=%XuserId projectId=%XprojectId nodeId=%XnodeId %X%n</suffixPattern>
</appender>
【问题讨论】:
【参考方案1】:您可以通过将 throwableExcluded 参数设置为 true 并在后缀模式中指定异常来解决此问题。
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>localhost</syslogHost>
<facility>LOCAL7</facility>
<throwableExcluded>true</throwableExcluded>
<suffixPattern>%dISO8601 %p %t %c0.%M - %m%n%xException</suffixPattern>
</appender>
根据您使用的系统日志服务器,您可能需要关闭控制字符转义才能正确呈现文本。例如$EscapeControlCharactersOnReceive off
用于 rsyslog v5
【讨论】:
【参考方案2】:在 logback 邮件列表 (http://old.nabble.com/SyslogAppender-stacktrace-logging-prefix-td33555063.html) 中提出了可能的解决方案,可能的解决方案之一在这里:http://jira.qos.ch/browse/LBCLASSIC-327
【讨论】:
【参考方案3】:Logback 的 Syslog Appender 没有处理这个权利。 你必须自己写。可以在原版的基础上。基本上问题就在这里了:
StringBuilder sb = new StringBuilder();
sb.append(stackTracePrefix).append(step);
sw.write(sb.toString().getBytes());
sw.flush();
当您刷新时,它会向系统日志发送新消息。如果你想避免它,你只需要在整个堆栈之后刷新。
【讨论】:
以上是关于Logback SyslogAppender stacktrace 日志记录前缀的主要内容,如果未能解决你的问题,请参考以下文章
符合 RFC 5424 的 Logback TCP 系统日志
log4j SyslogAppender - TCP 支持?
SyslogAppender 在 Windows 中不起作用