java怎么使用日志(精通springcloud:分布式日志记录和跟踪)java基础 / Java Web应用中的日志记录...

wufei123 发布于 2024-07-02 阅读(6)

分布式日志记录和跟踪在将一体化应用程序分解为微服务时,开发人员通常会花费大量的时间考虑业务边界或应用程序逻辑的分区,却忘记了日志根据笔者自己作为开发人员和软件架构师的经验,一方面,可以说很多开发人员通常都不太关注日志记录:而另一方面,负责应用程序维护的操作团队却主要依赖于日志。

无论开发人员所关注的领域如何,也无论他们基于的是一体化应用程序还是微服务架构,所有应用程序都必须执行日志记录,这是无可争辩的但是,微服务强制为应用程序日志的设计和排列添加了一个全新的维度,因为会有许多小型、独立、水平扩展的互相通信的服务在多台机器上运行:同时,通常会有大量的请求由多个服务处理。

开发人员必须将这些请求关联在一起, 并将所有日志存储在一个中心位置,以便更容易查看它们Spring Cloud引入了一个专用库,实现了分布式跟踪解决方案Spring Cloud Sleuth.

这里还有一件事需要讨论日志记录(Logging) 与跟踪(Tracing)不一样,开发人员有必要了解一下它们之间的差异跟踪是指跟踪程序的数据流技术支持团队通常使用它来诊断问题发生的位置对于开发人员来说,只有在出现错误时才必须跟踪系统流以发现性能“瓶颈”或时间。

日志记录用于错误报告和检测与跟踪相反,它应该始终启用当设计一个大型系统并希望跨机器进行良好而灵活的错误报告时,一定要考虑以集中方式收集日志数据推荐和最流行的解决方案是ELK ( Elasticsearch + Logstash +Kibana)堆栈。

Spring Cloud中没有用于此堆栈的专用库,但可以使用Java日志框架(如Logback或Log4j)实现集成Zipkin 将在本章中讨论另一种工具它是一种典型的跟踪工具,可帮助收集可用于解决微服务架构中的延迟问题的时序数据。

本章将要讨论的主题包括:口基于微服务的系统中日志记录的最佳实践口使用 Spring Cloud Sleuth将跟踪信息附加到消息并关联到事件口集成Spring Boot应用程序和Logstash.口使用 Kibana显示和过滤日志条目。

口使用 Zipkin作为分布式跟踪工具,并通过Spring Cloud Sleuth将其与应用程序集成 微服务的最佳日志记录实践处理日志记录最重要的最佳实践之一是跟踪所有 传入请求和传出响应也许这对于本章将要讨论的主题包括:。

口基于微服务的系统中日志记录的最佳实践口使用 Spring Cloud Sleuth将跟踪信息附加到消息并关联到事件口集成Spring Boot应用程序和Logstash.口使用 Kibana显示和过滤日志条目。

口使用 Zipkin作为分布式跟踪工具,并通过Spring Cloud Sleuth将其与应用程序集成 微服务的最佳日志记录实践处理日志记录最重要的最佳实践之一是跟踪所有传入请求和传出响应也许这对于部分开发人员来说是显而易见的,但我们也曾经看到过一些不符合该要求的应用程序。

如果满足此需求,则基于微服务的架构将会产生一个后果,即与没有消息传递的单一应用程序相比,该系统中的日志总数会有所增加这反过来也会要求开发人员比以前更加关注日志我们应该尽可能地生成尽可能少的信息,即使这些信息可以告诉我们很多情况。

如何实现这一目标?首先,在所有微服务中使用相同的日志消息格式就不失为一个良策例如,可以考虑如何在应用程序日志中打印变量鉴于通常在微服务之间交换的消息会使用JSON进行格式化,所以建议开发人员使用JSON表示法。

此格式具有非常简单的标准,使日志易于阅读和解析以下就是一个日志的片段17:11:53. 712 INFO Order received:("id":1, "customerId":5, "productId":10 }

上面的格式显然比以下格式更容易分析17:11:53.712 INFO Order received with id 1, customerId 5 and productId 10.但是一般来说,最重要的是标准化。

无论选择哪一种格式, 在什么地方使用它才至关重要开发人员还应该小心确保日志有意义,尽量避免不包含任何信息的句子例如,从以下格式中完全看不出来正在处理哪个订单17:11:53.712 INFO Processing order

但是,如果确实需要这种日志条目格式,则可以尝试将其分配给不同的日志级别使用相同级别的INFO记录所有内容确实是一种不好的做法某些类型的信息比其他信息更重要,因而这里的一个难点是确定应记录日志条目的级别以下是一些建议。

口跟踪(TRACE) : 这是非常详细的信息,仅用于开发模式可以在部署到生产环境之后将其保留一小段时间,并将其视为临时文件口调试(DEBUG) : 在此级别将记录程序中发生的任何事情这主要用于开发人员的调试或故障排除。

DEBUG 和TRACE之间的区别可能是最困难的口信息(INFO) : 在此级别应记录操作期间最重要的信息这些消息必须易于理解,不仅适用于开发人员,也适用于管理员或高级用户,以便让他们快速了解应用程序正在执行的操作。

口警告(WARN): 在此级别将记录可能会出错的所有事件这样的过程可能会继续,但开发人员应该格外小心口错误(ERROR):通常会在此级别打印异常这里重要的是不要在所有地方抛出异常,例如,如果只有一个业务逻辑执行没有成功,则不应该影响整个程序。

口致命(FATAL): 此Java日志记录级别指定可能导致应用程序终止的非常严重的错误事件虽然可能还有其他一些很好的日志记录实践,但我们已经提到的都是在基于微服务的系统中使用的最重要的日志实践关于日志记录,还有一个方面值得一提,那就是规范化。

如果开发人员希望轻松理解和解释自己的日志,则应该清楚地了解它们的收集方式和时间、它们包含的内容以及它们释出的原因应该在所有微服务中规范化一些特别重要的特征,如Time (发生的时间)、Hostname (发生的主机名)和AppName (发生的程序名)。

正如9.2 节所示,当在系统中实现集中收集日志的方法时,这种规范化非常有用使用Spring Boot记录日志Spring Boot将使用Apache Commons Logging进行内部日志记录,但是,如果要包含启动器的依赖项,则默认情况下将在应用程序中使用Logback.它不会抑制以任何方式使用其他日志框架的可能性。

还为Java Util Logging. Log4J2和SLF4J提供了默认配置可以在application.yml文件中使用logging.* 属性配置日志记录设置默认日志输出包含以毫秒为单位的日期和时间、日志级别、进程ID、线程名称、已发出条目的类的全名以及消息。

可以通过分别对控制台和文件追加程序使用lgigattem.console 和logging.pttrm.fle属性来覆盖它

默认情况下,Spring Boot仅记录到控制台除了控制台输出之外,要允许写入日志文件,则应该设置logging file或logging.path属性如果指定loggfile属性,则日志将在相对于当前目录的确切位置写入文件。

如果设置loggingpath, 则会在指定目录中创建spring.log 文件达到10MB后,日志文件将被轮换(Rotate) application.yml设置文件中可以自定义的最后一件事是日志级别。

默认情况下,SpringBoot会使用ERROR、WARN和INFO级别写入消息我们可以使用logging.level.*属性为每个包或类覆盖此设置

也可以使用logging Jevel.root配置根日志记录器(Root Logger)以下是application.yml文件中的示例配置,它更改了默认模式格式以及一些日志级别,并设置了日志文件的位置。

logging:file: logs/order.1oglevel : com.netflix: DEBUG orgspringframework .web. filter . CommonsRequestLoggingFilter: DEBUG。

pattern:console: "%d{HH :mm:ss.55S % -5level %msg%n"file: "%d{HH:mm:88.SSS1 %-51evel %msg%n"正如上例所示,这样的配置非常简单,但在某些情况下,这还不够。

如果要定义其他追加器(Appender) 或过滤器,则应明确包括其中一个可用日志记录系统的配置这样的日志系统如Logback (logback spring.xml)、Log4j2 ( log4j2-spring.xml)或Java UtilLogging (logging properties)。

如前文所述,默认情况下,Spring Boot 将使用Logback作为应用程序日志如果在类路径的根目录中提供logback-spring.xml 文件,它将覆盖application.yml 中定义的所有设置。

例如,开发人员可以创建每天轮换日志的文件追加器,并保留最多10 天的历史记录此功能在应用程序中非常实用9.3 节将会介绍到,在将微服务与Logstash集成时,便需要一个自定义的追加器以下是Logback 配置文件的示例片段,该片段为logs/order.log文件设置了每日滚动策略。

1ogs/order.1og

order.8d{yYyy-MM-dd)。

1og 10 1GB

id(HH:mm:5s.SSS} 8-5leve1 msg8n

值得一提的是,Spring 建议为Logback 使用logback-spring.xml 而不是默认的logback.xml. Spring Boot包含一些Logback扩展,可能对高级配置有所帮助。

它们不能在标准logback.xml中使用,而只能在logback-springxml中使用我们列出了一些扩展,允许开发人员从Spring环境定义特定于配置文件的配置或接口属性

source=springapplication. name" />。

...

class-"ch.qos. logback.core. rollingRollingFileAppender">S{L0G_ FILE}

qos. logback. core. rollingT imeBasedRollingPolicy">$ (LOG FILE). 8dyyy-M-dd}.gz

7 $ (CONSOLE LOG PATTERN} utf8

...本文给大家讲解的内容是分布式日志记录和跟踪下篇文章给大家讲解的是使用ELK Stack集中日志;觉得文章不错的朋友可以转发此文关注小编;

感谢大家的支持!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻27902