|
|
51CTO旗下网站
|
|
移步端
  • 惊讶!我定的日记规范被CTO在全公司加大了

    日志,维基全面的概念是记录服务器等电脑设备或软件的运行。

    笔者:叶猴天地 来源:叶猴天地| 2020-02-12 08:09

    打印日志是一门艺术,但老被开发同学所忽视。日志就像车辆保险,没人愿意为保险付钱,但是一旦出了问题又都想有保险可用。

    图表来自 Pexels

    咱们打印日志的时节都很随意,可是用之时节会吐槽各种 SB 包括自己!写好每一枝日志吧,与当今共勉!

    日志是什么?

    日志,维基全面的概念是记录服务器等电脑设备或软件的运行。

    日志文件提供准确的体系记录,根据日志最终一定到错误详情和根源。日志的性状是,他描述一些离散的(不继续的)事件。

    例如:使用通过一个滚动的公文输出 INFO 或 ERROR 消息,并通过日志收集系统,存储到部分存储引擎(Elasticsearch)官方方便查询。

    日志有什么用?

    在上文中我们解释了日志的企图是提供精准的体系记录方便根因分析。这就是说具体在哪些具体方面它可以发挥作用?

    ①打印调试:即可以用日志来记录变量或者某一段逻辑。记录程序运行的流程,即程序运行了哪些代码,富有排查逻辑问题。

    ②题材一定:先后出独特或者出故障时快速的一定问题,富有后期解决问题。因为线上生产条件无法 DEBUG,在测试环境去模拟一套生产条件,难费力。

    故此依靠日志记录的消息定位问题,这点特别关键。还可以记录流量,末了可以通过 ELK(包括 EFK 拓展含量统计)。

    ③他家行为日志:记录用户之借鉴行为,用于大数据分析,比如监控、风控、引进等等。

    这种日志,普通是送任何组织分析使用,而且可能是多个团体,故此一般会有稳定的公式要求,开发者应该按照这个模式来记录,便于其他组织的采取。

    当然,要记录哪些行为、借鉴,普通也是约定好的,故此,开发者主要是推行的角色。

    ④根因分析(甩锅必备):即在重大地方记录日志。富有在和各国终端定位问题时,人家说是你的顺序问题,你可以理直气壮的拿出你的日记说,瞧,我这里运行了,状态也是对的。这样,对方就会乖乖去定位他的编码,而不是互相推脱。

    什么时候记录日志?

    上文说了日志的重大,这就是说什么时候需要记录日志?

    ①系统初始化:系统或者服务的起步参数。基本模块或者组件初始化过程中往往依赖一些关键配置,根据参数不同会提供不一样的劳务。必须在此间记录 INFO 日志,打印出参数以及启动完成态服务表述。

    ②编程语言提示异常:现行各项主流的编程语言都包括异常机制,工作相关的流行框架有总体的突出模块。

    这类捕获的突出是系统报告开发人员要求加以关注的,是品质非常高的报错。有道是适当记录日志,根据现实结合工作的状况采取 WARN 或者 ERROR 级别。

    ③工作流程预期不符:除开平台以及编程语言异常之外,品种代码中结果与期待不符时也是日记场景之一,大概来说所有流程分支都得以参加考虑。

    取决于开发人员判断能否容忍情形发生。科普的方便场景包括外部参数不科学,数据处理问题导致返回码不在客观范围内等等。

    ④系统核心角色,组件关键动作:系统中基本角色触发的工作动作是要求多加关注的,是衡量系统正常运转的要害指标,提议记录 INFO 级别日志。

    比如电商系统用户从登录到副单的总体流程;微服务各服务重点交互;基本数据表增删改;基本组件运行等等,如果日志频度高或者打印量特别大,可以提炼关键点 INFO 记录,其他酌情考虑 DEBUG 级别。

    ⑤先后三方服务远程调用:微服务架构体系中有一度重要的线就是第三方永远不可信,对于第三方服务远程调用建议打印请求和响应的底数,富有在和各国终端定位问题,不会因为第三方服务日志的缺乏变得手足无措。

    日志打印

    Slf4j&Logback

    Slf4j 英文全称为 “ Simple Logging Facade for Java ”,为 Java 提供的简短日志门面。

    Facade 门面,更底层一点说就是接口。他允许用户以团结之爱好,在水利中通过 Slf4j 连片不同之日记系统。

    Logback 是 Slf4j 的原生实现框架,同样也是出自 Log4j 一度人口的手,但拥有比 Log4j 更多的长处、特色和更做强的性质,Logback 相对于 Log4j 获得更快的推行速度。

    基于我们先前在 Log4j 上的上班,Logback 重写了中间的贯彻,在少数特定的面貌上面,甚至可以比之前的速度快上 10 倍。在保证 Logback 的组件更加便捷的同时,同时所需的内存更加少。

    日志文件

    日志文件放置于固定的目录中,按照一定的模版进行命名,引进的日记文件名称:

          
    1. 眼前正在写入的日记文件名:<使用名>[-<效益名>].log 
    2. 如:example-server-book-service-access.log 
    3.  
    4. 已经滚入历史的日记文件名:<使用名>[-<效益名>].yyyy-MM-dd-hh.[滚动号].log 
    5. 如:example-server-book-service-access.2019-12-01-10.1.log 

    日志变量定义

    引进使用 lombok(代码生成器) 诠释 @lombok.extern.slf4j.Slf4j 来生成日志变量实例:

          
    1. <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> 
    2. <dependency> 
    3.     <groupId>org.projectlombok</groupId> 
    4.     <artifactId>lombok</artifactId> 
    5.     <version>1.18.10</version> 
    6.     <scope>provided</scope> 
    7. </dependency> 

    代码示例:

          
    1. import lombok.extern.slf4j.Slf4j; 
    2.  
    3. @Slf4j 
    4. public class LogTest { 
    5.     public static void main(String[] args) { 
    6.         log.info("this is log test"); 
    7.     } 

    日志配置

    日志记录采用分级记录,级别与日志文件名相对应,不同级别的日记信息记录到不同之日记文件中。

    如有突出格式日志,如 access log,单独使用一个文件,请注意避免重蹈覆辙打印(可采取 additivity="false" 避免 )。

    数占位格式

    采用参数化形式 {} 占位,[] 拓展参数隔离,这样的功利是可读性更高,而且只有实际准备打印的时节才会处理参数。

          
    1. // 是的示例,必须采取参数化信息的措施 
    2. log.debug("order is paying with userId:[{}] and orderId : [{}]",userId, orderId); 
    3. // 错误示例,不要开展字符串拼接,那样会产生很多 String 目标,占用空间,影响性能。及日志级别高于此级别也会进展字符串拼接逻辑。 
    4. log.debug("order is paying with userId: " + userId + " and orderId: " + orderId); 

    日志的中心模式

    ①日志时间

    表现日志产生之日子和时间,其一数目非常关键,普通精确到毫秒。

    yyyy-MM-dd HH:mm:ss.SSS

    ②日志级别

    日志的进出口都是分级别的,不同之安装不同之现场打印不同之日记。重点采取如下的四个级别:

    DEBUG:DEUBG 级别的首要出口调试性质的情节,该派别日志主要用于在开发、高考阶段输出。

    该派别的日记应尽可能地详尽,付出人员可以将各个详细信息记录到 DEBUG 阴,起到调试之企图,包括参数信息,调整细节信息,回到值信息等等,便于在开发、高考阶段出现问题或者异常时,对他进行分析。

    INFO:INFO 级别的首要记录系统关键信息,意志保留系统正常工作期间关键运行指标,付出人员可以将初始化系统配置、工作状态变化信息,或者用户业务流程中的核心处理记录到 INFO 日志中,富有日常运维工作以及错误回溯时上下文场景复现。

    提议在档次完成后,在测试环境将日志级别调成 INFO,下一场通过 INFO 级别的消息看看是否能了解这个应用的利用情况,如果出现问题后是否这些日志能提供有用之清查问题的消息。

    WARN:WARN 级别的首要出口警告性质的情节,该署内容是可以预知且是有计划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的尺度时。在 WARN 级别的时应输出较为详尽的消息,以便于事以后对日志进行分析。

    ERROR:ERROR 级别主要针对于一些不可预知的消息,诸如:错误、独特等,比如,在 catch 块中抓获的网络通信、必发娱乐登录连接等特殊,若异常对系统之总体流程影响不大,可以运用 WARN 级别日志输出。

    在进出口 ERROR 级别的日记时,尽量多步输出方法入参数、办法执行过程中产生之目标等数据,在带有错误、独特对象的多寡时,要求将该对象一并输出。

    ③DEBUG/INFO 的取舍

    DEBUG 级别比 INFO 低,包含调试时更详细的询问系统运行状态的东西,比如变量的值等等,都得以输出到 DEBUG 日志里。

    INFO 是在线日志默认的进出口级别,举报系统之眼前状态给最终用户看的。进出口的消息,有道是对终极用户具有现实意义之。

    副效益角度上说,INFO 进出口的消息可以看作是软件产品的组成部分,故此需要兢兢业业对待,不得随便输出。

    如果这条日志会把频繁打印或者大部分时间对于纠错起不到作用,就应该考虑下调为 DEBUG 级别:

  • 出于 DEBUG 日志打印量远大于 INFO,由于前文日志性能的设想,如果代码为主干代码,推行频率非常高,必须推敲日志设计是否合理,只是需要下调为 DEBUG 级别日志。
  • 瞩目日志的读报,不妨在写完代码 review 这条日志是否通顺,是否提供真正有含义之消息。
  • 日志输出是多点程公用的,如果有另外一个点程正在进出口日志,地方的记录就会把打断,末了显示输出和预想的就会不一致。
  • ④WARN/ERROR 的取舍

    顶方法或者功能处理过程中产生不符合预期结果或者有框架报错时可以考虑采取。

    常见问题处理办法包括:

  • 增长判断处理逻辑,尝试本地解决:增长逻辑判断吞掉报警永远是最优选择抛出异常,付出上层逻辑解决
  • 抛出异常,付出上层逻辑解决
  • 记录日志,报警提醒
  • 采用返回码包装错误做返回
  • 一般来说,WARN 级别不会短信报警,ERROR 级别则会短信报警甚至电话报警,ERROR 级别的日记意味着系统中发生了特别严重的题材,必须有人口马上处理,比如必发娱乐登录不可用,系统之严重性业务流程走不下来等等。

    错误的采取反而带来严重的结果,不区分问题的要害程度,只要有问题就 ERROR 记录下来。

    其实这样是异样不负责任的,因为对于成熟的体系,都市有一套完整的报错机制,那这个错误信息什么时候需要发出去,有的是都是根据单位时间内 ERROR 日志的多寡来确定的。

    ⑤强调 ERROR 报警

    ERROR 级别的日记打印通常伴随报警通知。ERROR 的报出应该伴随着业务功能受损,即上面提到的体系中发生了特别严重的题材,必须有人口马上处理。

    ERROR 日志目标:送处理者直接准确的消息,ERROR 消息形成自己闭环。

    题材一定:

  • 发生了什么问题,哪些功能受到影响
  • 获取帮助信息:直接救助信息或帮助信息的存储位置
  • 穿过报警知道解决方案或者找何人解决
  • ⑥点程名称

    进出口该日志的点程名称,普通在一番用到中一个同步请求由同一线程完成,进出口线程名称可以在各国请求产生之日记中展开分类,便于分清当前呼吁上下文的日记。

    ⑦opentracing 标识

    在分布式应用中,他家之一个请求会调用若干个服务到位,该署劳务可能还是嵌套调用的,故此做到一个请求的日记并不在一番用到的日记文件,而是分散在不同服务器上不同应用节点的日记文件中。

    该标识是为了串联一个请求在任何系统中的调用日志:

  • 唯一字符串(trace id)
  • 租用层级(span id)
  • 穿过搜索 trace id 就足以查到这个 trace id 标识的呼吁在任何系统中流转(拍卖)经过中产生之一切日志。

    ⑧biz 标识

    在工作开发中,咱们的日记都是和工作形容联系的,有时候是要求根据用户或者业务做聚类的,因此一次请求如果可以通过某项标识做聚类的时节,可以将聚类标识打印到日志中:

  • 他家标识(user id)
  • 工作标识(biz id)
  • ⑨日志记录器名称

    日志记录器名称一般使用类名,日志文件中得以输出简单的类名即可,瞧实际状况是否需要采取包名和进号等信息。重点用于看到日志后到谁类中去找这个日志输出,便于定位问题四方。

    ⑩日志内容

    禁用 System.out.println 和 System.err.println。

    变参替换日志拼接,进出口日志的目标,应在其类中贯彻迅速的 toString 办法,以便于在日志输出时仅输出这个目标类名和 hashCode。

    预防空指针:无需在日记中滥用对象的主意获取值,除非确保该对象肯定不为 null,否则很有可能会因为日志的题材而导致应用产生空指针异常。

    ⑪独特堆栈

    独特堆栈一般会出现在 ERROR 或者 WARN 级别的日记中,独特堆栈含有方法调用链的体系,以及异常产生之滥觞。独特堆栈的日记属于上一行日志的,在日记收集时要求将他划至上一行中。

    最佳实践

    ①日志格式

    2019-12-01 00:00:00.000|pid|log-level|[svc-name,trace-id,span-id,user-id,biz-id]|thread-name|package-name.class-name : log message

    日志格式如下:

  • 时光
  • pid,pid
  • log-level,日志级别
  • svc-name,使用名称
  • trace-id,租用链标识
  • span-id,租用层级标识
  • user-id,他家标识
  • biz-id,工作标识
  • thread-name,点程名称
  • package-name.class-name,日志记录器名称
  • log message,日志消息体
  • ②日志模块扩展

    日志模块是基于以下技术点做扩展的:

  • Slf4j MDC 贯彻原理。
  • Opentracing Scope 原理。
  • 在每个 tracing 链路中,名将 Opentracing Scope 中的上下文信息放置 MDC 官方,根据 Spring Boot Logging 推而广之接口扩展的取值逻辑 logging.pattern.level 的取值逻辑。

    相关源码参考:

          
    1. Spring Cloud Sleuth: 
    2. https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java 
    3.  
    4. https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jCurrentTraceContext.java 

    修改 logback 配置文件中每篇 appender 的 pattern 为以下默认值即可实现标准化。

          
    1. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n 

    logback.xml 节选:

          
    1. <configuration><property name="LOG_PATH" 
    2.           value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}"/> 
    3.  
    4.  
    5. <springProperty scope="context" name="APP_NAME" 
    6.                 source="spring.application.name" defaultValue="spring-boot-fusion"/> 
    7. <!-- 全局统一 pattern --> 
    8. <property name="LOG_PATTERN" 
    9.           value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}|${PID:- }|%level|${LOG_LEVEL_PATTERN:-%5p}|%t|%-40.40logger{39}: %msg%n"/> 
    10. <!-- 进出口模式 file,滚动记录文件,先将日志文件指定到文件,顶符合某个条件时,名将日志记录到其它文件 --> 
    11. <appender name="fileInfo" class="ch.qos.logback.core.rolling.RollingFileAppender"
    12.     <!--把写入的店名,可以是相对目录,也得以是绝对目录,如果上级目录不存在会自动创建,没有默认值。--> 
    13.     <file>${LOG_PATH}/${APP_NAME}-info.log</file> 
    14.     <!--滚动策略  基于时间之分包策略 --> 
    15.     <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"
    16.         <!-- yyyy-MM-dd 时光策略则为一角一个文件 --> 
    17.         <FileNamePattern>${LOG_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd-HH}.%i.log</FileNamePattern> 
    18.         <!--日志文件保留小时数--> 
    19.         <MaxHistory>48</MaxHistory> 
    20.         <maxFileSize>1GB</maxFileSize> 
    21.         <totalSizeCap>20GB</totalSizeCap> 
    22.     </rollingPolicy> 
    23.     <!--  layout 承担把事件转换成字符串,格式化的日记信息的进出口 --> 
    24.     <layout class="ch.qos.logback.classic.PatternLayout"
    25.         <pattern>${LOG_PATTERN}</pattern> 
    26.     </layout> 
    27.     <!--级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,玉器会根据onMath 和 onMismatch接受或拒绝日志--> 
    28.     <filter class="ch.qos.logback.classic.filter.LevelFilter"
    29.         <!--安装过滤级别--> 
    30.         <level>INFO</level
    31.         <!--用于配置符合过滤条件的借鉴--> 
    32.         <onMatch>ACCEPT</onMatch> 
    33.         <!--用于配置不符合过滤条件的借鉴--> 
    34.         <onMismatch>DENY</onMismatch> 
    35.     </filter> 
    36. </appender> 
    37. </configuration> 

    代码使用示例:

          
    1. @Override 
    2. public Result<PagingObject<SimpleResponse>> page(@RequestParam(value = "page-num", defaultValue = "1"int pageNum, 
    3.                                                  @RequestParam(value = "page-size", defaultValue = "10"int pageSize) { 
    4.     LogStandardUtils.putUserId("userId123"); 
    5.     LogStandardUtils.putBizId("bizId321"); 
    6.     producerService.sendMsg("xxx"); 
    7.     simpleClient.page(pageNum, pageSize); 
    8.     return new Result<>(simpleService.page(pageNum, pageSize)); 

    日志记录:

          
    1. 2019-12-04 16:29:08.223|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.n.u.concurrent.ShutdownEnabledTimer   : Shutdown hook installed for: NFLoadBalancer-PingTimer-example-server-order-service 
    2. 2019-12-04 16:29:08.224|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.netflix.loadbalancer.BaseLoadBalancer : Client: example-server-order-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null 
    3. 2019-12-04 16:29:08.234|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.n.l.DynamicServerListLoadBalancer     : Using serverListUpdater PollingServerListUpdater 
    4. 2019-12-04 16:29:08.247|43546|INFO|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.n.l.DynamicServerListLoadBalancer     : DynamicServerListLoadBalancer for client example-server-order-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:ConsulServerList{serviceId='example-server-order-service', tag=null
    5. 2019-12-04 16:29:08.329|43546|WARN|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.p.f.l.ctl.common.rule.StrategyRule    : No up servers available from load balancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:ConsulServerList{serviceId='example-server-order-service', tag=null
    6. 2019-12-04 16:29:08.334|43546|WARN|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.p.f.l.ctl.common.rule.StrategyRule    : No up servers available from load balancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=example-server-order-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:ConsulServerList{serviceId='example-server-order-service', tag=null
    7. 2019-12-04 16:29:08.342|43546|ERROR|[example-server-book-service,ac613cff04bac8b1,4a9adc10fdf0eb5,userId123,bizId321]|XNIO-1 task-4|c.p.f.w.c.advice.ExceptionHandlerAdvice : 眼前先后进入到独特捕获器,出错的 url 为:[ http://127.0.0.1:10011/simples ],出错的底数为:[ {"querystring":"{}","payload":""} ] 
    8. java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: example-server-order-service 

    日志服务

    SLS 阿里云日志服务

    阿里云日志服务(简称 SLS)是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数量场景锤炼而成。

    您无需开发就能很快完成日志数据采集、消费、投递以及查询分析等效果,提升运维、营业效率,确立 DT 日月海量日志处理能力。

    project:品种、管理日志基础单元,劳务日志建议一个环境建为一个 Project,这样日志记录是完整一个闭环,日志记录随整个环境内的劳务合同产生。

    logstore:日志库,日志库建议按照日志类型分为不同之,如特定格式的 access 日志,以及 info / warn / error 日志,一定格式可以配置更为方面的目录以及告警设置。

    瞩目:请勿按照应用服务区分为不同之 logstore,在微服务架构中,一次请求交叉了多个应用服务,日志是散落在各国应用服务中的,按照服务区分 logstore,要求付出同学十分了解应用运行状况和滥用拓扑图,这点往往是不具备的。

    ①实时采集与消费

    效益:

  • 穿过 ECS、容器、移步端、开源软件、JS 等接入实时日志数据(例如 Metric、Event、BinLog、TextLog、Click 等)。
  • 提供实时消费接口,与实时计算及劳动对接。
  • 用途:数量清洗(ETL)、流计算(Stream Compute)、监督与报警、 机器学习与迭代计算。

    ②查询分析

    实时索引、查询分析数据:

  • 查询:关键词、混淆、上下文、规模。
  • 统计:SQL聚拢等丰富查询手段。
  • 可视化:Dashboard+报表功能。
  • 连片:Grafana、JDBC/SQL92。
  • 用途:DevOps / 点上运维,日志实时数据分析,安全诊断与分析,营业与客服系统。

    ③消费投递

    稳定可靠的日记投递。名将日志中枢数据投递至存储类服务开展存储。支持压缩、自定义 Partition、以及行列等各种存储方式。

    用途:数量仓库+数据分析、审计、引进系统与用户画像。

    ④告警

    日志服务的报警功能基于仪表盘中的查询图表实现。在日记服务控制台查询页面或仪表盘页面设置告警规则,并指定告警规则的安排、检查条件和通知方式。

    安装告警后,日志服务期限对仪表盘的询问结果进行反省,检查结果满足预设条件时发送告警通知,实现实时的劳务状态监控。

    ⑤最佳实践

    阿里云之日记服务职能相当强大,想用好日志服务可以参考:

    https://help.aliyun.com/document_detail/29090.html?spm=a2c4g.11186623.6.1079.4edd3aabvs50OW

    ELK 合同日志解决方案

    ELK 是 Elasticsearch、Logstash、Kibana 三大开源框架首字母大写简称。市场上也把成为 Elastic Stack。

    其中 Elasticsearch 是一番基于 Lucene、分布式、穿过 Restful 办法展开交互的近实时搜索平台框架。

    像类似百度、谷歌这种大数量全文搜索引擎的面貌都得以运用 Elasticsearch 表现底层支持框架,可见 Elasticsearch 提供的寻找能力确实强大,市场上许多时候我们简称 Elasticsearch 为 ES。

    Logstash 是 ELK 的地方数据流引擎,用于从不同目标(文件/数量存储/MQ)募集的不同格式数据,历经过滤后支持出口到不同目的地(文件/MQ/Redis/Elasticsearch/Kafka 等)。

    Kibana 可以将 Elasticsearch 的多寡通过友好的页面展示出来,提供实时分析的效应。

    实行表明

    一般说来格式日志:

          
    1. 2019-11-26 15:01:03.332|1543|INFO|[example-server-book-service,28f019d57b8336ab,630697c7f34ca4fa,105,45982043|XNIO-1 task-42]|c.p.f.w.pay.PayServiceImpl     : order is paying with userId: 105 and orderId: 45982043 

    一般说来日志前缀是原则性的,可以固定分词索引,富有更快的询问分析。

    一定格式日志,以 access 日志为例:

          
    1. 2019-11-26 15:01:03.332|1543|INFO|[example-server-book-service,28f019d57b8336ab,630697c7f34ca4fa,105,45982043|XNIO-1 task-42]|c.p.f.w.logging.AccessLoggingFilter     : 
    2. > url: http://liweichao.com:10011/actuator/health 
    3. > http-method: GET 
    4. > request-header: [Accept:"text/plain, text/*, */*"Connection:"close"User-Agent:"Consul Health Check", Host:"liweichao.com:10011", Accept-Encoding:"gzip"
    5. > request-time: 2019-11-26 15:01:03.309 
    6. > querystring: - 
    7. > payload: - 
    8. > extra-param: - 
    9.  
    10.  
    11. < response-time: 2019-11-26 15:01:03.332 
    12. < take-time: 23 
    13. < http-status: 200 
    14. < response-header: [content-type:"application/vnd.spring-boot.actuator.v2+json;charset=UTF-8", content-size:"15"

    一定格式日志可按格式创建索引更富有聚焦查询分析和告警,如根据 take-time,http-status,biz-code 等值。

    参考文献:

  • Java日志记录最佳实践 :https://www.jianshu.com/p/546e9aace657)
  • 别在 Java 代码里乱打日志了,这才是打印日志的科学姿势!:https://mp.weixin.qq.com/s/hJvkRlt9xQbWhYy1G7ZDsw
  • 阿里云日志服务:https://help.aliyun.com/product/28958.html?spm=a2c4g.11186623.3.1.7cfd735dv8i1pB
  • Spring Boot Logging:https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/spring-boot-features.html#boot-features-logging
  • Spring Cloud Sleuth:https://github.com/spring-cloud/spring-cloud-sleuth
  • Opentracing:https://github.com/opentracing
  • 【编纂推荐】

    1. MySQL必发娱乐登录小项目日志表定期删除实现方案
    2. Java日志之Slf4j,Log4J,Logback原理总结
    3. 腾讯万亿级日志量下,ES如何形成秒级响应?
    4. 迪斯尼Edge传感器或更换外观设计,更符合Windows 10计划规范
    5. 如何手动将消息添加到Linux系统日志文件
    【义务编辑: 武晓燕 TEL:(010)68476606】

    点赞 0
  • 日志  专业  加大
  • 分享:
    大家都在看
    猜你喜欢
  • 订阅专栏+更多

    Kubernetes:21远处完美通关

    Kubernetes:21远处完美通关

    从小白到修神
    共29章 | king584911644

    153人口订阅学习

    Python使用场景实战手册

    Python使用场景实战手册

    Python使用场景实战手册
    共3章 | KaliArch

    122人口订阅学习

    一步到位玩儿透Ansible

    一步到位玩儿透Ansible

    Ansible
    共17章 | 骏马金龙1

    209人口订阅学习

    订阅51CTO邮刊

    点击这里查看样刊

    订阅51CTO邮刊

    51CTO劳务号

    51CTO官微



        
    1.