如何将所有控制台日志(含异常)发送至Graylog?
解决未捕获异常无法发送至Graylog的问题
问题原因
直接抛出的未捕获异常通常会被Spring框架或Servlet容器(如Tomcat)的日志组件捕获并打印,这些日志的Logger名称并非你配置的com.nar.hexademo,而是类似org.springframework.web、org.apache.catalina这类框架级别的Logger。你的当前配置仅对com.nar.hexademo包下的日志启用了GELF Appender,框架打印的异常日志只会走Root Logger的STDOUT,因此无法发送到Graylog。
解决方案
方案1:让Root Logger关联GELF Appender(推荐)
在dev环境的SpringProfile中,修改Root Logger的配置,添加GELF Appender的引用。这样所有日志(包括框架打印的异常)都会同时输出到控制台和Graylog,而你自定义的com.nar.hexademo Logger由于设置了additivity="false",不会产生重复日志。
修改后的配置片段:
<SpringProfile name="dev"> <!-- 原有springProperty、GELF Appender配置保持不变 --> <!-- 修改Root Logger,添加GELF Appender --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="GELF" /> </root> <!-- 原有com.nar.hexademo Logger配置保持不变 --> </SpringProfile>
方案2:单独配置框架级Logger
如果你不想让所有Root日志都发送到Graylog,可以单独为框架中处理未捕获异常的Logger添加GELF Appender。例如,针对Spring MVC的异常处理器和Tomcat容器的Logger:
<SpringProfile name="dev"> <!-- 原有springProperty、GELF Appender、自定义Logger配置保持不变 --> <!-- 配置Spring MVC异常处理器的Logger --> <logger name="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver" additivity="false"> <level value="ERROR"/> <appender-ref ref="STDOUT"/> <appender-ref ref="GELF"/> </logger> <!-- 配置Tomcat容器的Logger --> <logger name="org.apache.catalina.core.ContainerBase.[Tomcat].[localhost]" additivity="false"> <level value="ERROR"/> <appender-ref ref="STDOUT"/> <appender-ref ref="GELF"/> </logger> </SpringProfile>
补充:确保异常栈信息被正确编码
检查GELF Encoder的fullPatternLayout配置,确保异常栈信息被包含。将原有%m%n修改为%m%n%ex,这样异常的完整栈轨迹会被写入GELF消息:
<fullPatternLayout class="ch.qos.logback.classic.PatternLayout"> <pattern>%m%n%ex</pattern> </fullPatternLayout>
验证
修改配置后,重启应用并抛出未捕获异常,查看Graylog是否接收到对应的日志条目,同时确认控制台输出正常。
内容的提问来源于stack exchange,提问作者Sha
相关产品推荐
相关产品推荐

