zoukankan      html  css  js  c++  java
  • Loki 日志系统

    loki 日志系统

    elk,功能很多,资源也要求高,对于我们中小团队来说比较重,但是使用查看开发环境日志不太简易。loki 比较简单使用。具体更多介绍可以参考官方网站:https://github.com/grafana/loki

    loki 日志系统组成

    • loki是主服务器,负责存储日志和处理查询。
    • promtail是代理,负责收集日志并将其发送给 loki 。
    • Grafana用于 UI 展示。

    环境说明和前提准备

    我这边的业务都是docker swarm 集群运行的。本次日志系统主要是提供一个可浏览的页面给开发测试及时查看日志。
    对日志的配置有以下几点要求:

    • 统一在代码中配置日志输出的路径、归档格式
      在容器中展示的格式为:/项目名称/logs/项目名称/ 下有 按照日期的归档文件、debug.log、error.log

    代码中关于logback-spring.xml的配置,可以参考:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
        小技巧: 在根pom里面设置统一存放路径,统一管理方便维护
        <properties>
            <log-path>/Users/vonedao</log-path>
        </properties>
        1. 其他模块加日志输出,直接copy本文件放在resources 目录即可
        2. 注意修改 <property name="${log-path}/log.path" value=""/> 的value模块
    -->
    <configuration debug="false" scan="false">
    	<property name="log.path" value="logs/${project.artifactId}"/>
    	<property name="log.service.name" value="${project.artifactId}"/>
    	<!-- 彩色日志格式 -->
    	<property name="CONSOLE_LOG_PATTERN"
    			  value="${CONSOLE_LOG_PATTERN:-%clr([%d{yyyy-MM-dd HH:mm:ss.SSS}]){faint} %clr([${log.service.name}]) %clr([${LOG_LEVEL_PATTERN:-%5p}]) %clr([${PID:- }]	){magenta} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    	<!-- 彩色日志依赖的渲染类 -->
    	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    	<conversionRule conversionWord="wex"
    					converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    	<conversionRule conversionWord="wEx"
    					converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    	<!-- Console log output -->
    	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    		<encoder>
    			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
    		</encoder>
    	</appender>
    
    	<!-- Log file debug output -->
    	<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<file>${log.path}/debug.log</file>
    		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    			<fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
    			<maxFileSize>50MB</maxFileSize>
    			<maxHistory>30</maxHistory>
    		</rollingPolicy>
    		<encoder>
    			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
    		</encoder>
    	</appender>
    
    	<!-- Log file error output -->
    	<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
    		<file>${log.path}/error.log</file>
    		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    			<fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
    			<maxFileSize>50MB</maxFileSize>
    			<maxHistory>30</maxHistory>
    		</rollingPolicy>
    		<encoder>
    			<pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
    		</encoder>
    		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    			<level>ERROR</level>
    		</filter>
    	</appender>
    
    	<logger name="org.activiti.engine.impl.db" level="DEBUG">
    		<appender-ref ref="debug"/>
    	</logger>
    
    	<!--nacos 心跳 INFO 屏蔽-->
    	<logger name="com.alibaba.nacos" level="OFF">
    		<appender-ref ref="error"/>
    	</logger>
    	<!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
    	<root level="INFO">
    		<appender-ref ref="console"/>
    		<appender-ref ref="debug"/>
    	</root>
    </configuration>
    
    

    代码打包成镜像的时候,注意添加项目的WORKDIR,参考:

    FROM java:8-jre
    
    MAINTAINER zoujiaojiao@gmail.com
    
    ENV TZ=Asia/Shanghai
    
    RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    RUN mkdir -p /项目名称
    
    WORKDIR /项目名称
    
    EXPOSE 10018
    
    ADD ./target/项目名称.jar ./
    
    CMD sleep 10;java -Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom -jar 项目名称.jar
    
    
    • 使用nfs存储日志
    Nfs服务端:10.10.3.71 
    目录:/home/vonedaologs
    客户端挂载:
    Ubuntu系统安装客户端:
    #apt-get install nfs-common
    centos系统安装客户端:
    #yum install nfs-utils -y
    #mkdir /vonedaologs
    #mount -t nfs 10.10.3.71:/home/vonedaologs /vonedaologs
    #vi /etc/fstab 
    10.10.3.71:/home/vonedaologs  /vonedaologs nfs     defaults        0       0
    
    
    • 业务容器Yaml编排增加日志挂载路径
    version: '3.0'
    services:
      vonedao-tenant-business-job-biz:
        image: docker.vonedao.com/vonedao-cs/vonedao-tenant-business-job-biz:1.0.0-SNAPSHOT
        logging:
          driver: json-file
          options:
            max-size: "1M"
            max-file: "5"
        volumes:
          - /vonedaologs/dev:/vonedao-tenant-business-job-biz/logs
    #测试环境使用
    #      - /vonedaologs/sit:/vonedao-tenant-business-job-biz/logs
    ……
    ……
    

    启动业务容器后,查看日志情况:

    所有业务日志都收集到共享nfs目录了。

    loki日志系统搭建

    Grafana

    version: "3"
    
    networks:
      loki:
        external: true
    
    services:
      grafana:
        image: grafana/grafana:latest
        ports:
          - "3000:3000"
        networks:
          - loki
    

    启动命令: docker stack deploy -c grafana.yaml grafana
    浏览器访问,账户admin,密码admin:

    Loki

    loki我分为开发、测试、生产
    开发:loki_dev.yaml

    version: "3"
    
    networks:
      loki:
        external: true
    
    services:
      loki_dev:
        image: grafana/loki:latest
        ports:
          - "3100:3100"
        command: -config.file=/etc/loki/local-config.yaml
        networks:
          - loki
    

    启动命令:docker stack deploy -c loki_dev.yaml loki_dev

    在grafana上添加开发环境的loki:



    Promtail

    Promtail 开发环境的配置dev_promtail_config.yml ,使用开发环境的loki地址,填写开发环境的日志路径:

    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    
    positions:
      filename: /tmp/positions.yaml
    
    clients:
      - url: http://10.10.3.88:3100/loki/api/v1/push
    
    scrape_configs:
    - job_name: dev_vonedao-tenant-finance
      static_configs:
      - targets:
          - localhost
        labels:
          job: vonedao-tenant-finance
          __path__: /vonedaologs/dev/vonedao-tenant-finance-biz/*
    - job_name: dev_vonedao-auth
      static_configs:
      - targets:
          - localhost
        labels:
          job: vonedao-auth
          __path__: /vonedaologs/dev/vonedao-auth/*
    ……
    ……
    

    Promtail启动容器的yaml编排文件:
    Promtail_dev.yaml

    version: "3"
    
    networks:
      loki:
        external: true
    services:
      promtail:
        image: grafana/promtail:latest
        volumes:
          - /vonedaologs:/vonedaologs
      #    - /var/log:/var/log 暂时不收系统日志
          - /vonedaologs/promtail/dev_promtail_config.yml:/etc/promtail/config.yml
        command: -config.file=/etc/promtail/config.yml
        deploy:
          mode: replicated
          replicas: 1
          restart_policy:
            condition: on-failure
        networks:
          - loki
    

    启动: docker stack deploy -c promtail_dev.yaml promtail_dev

    日志系统使用

    可以配置多个loki:

    选择配置好的开发环境loki,通过labels找自己需要的工程日志:

    可以限制行数,可以进行5秒刷新设置:

    查看日志:

    可以写搜索表达式来过滤想要的日志。

    包含"INFO"
    {job="vonedao-auth"} |= "INFO"
    

    排除掉info日志:

    {job="vonedao-auth"} != "INFO"
    


    匹配正则表达式:

    |~
    

    不匹配正则表达式:

    !~
    
  • 相关阅读:
    第七周——Linux内核如何装载和启动一个可执行程序
    第十八章读书笔记
    第三章读书笔记
    第六周——分析Linux内核创建一个新进程的过程
    第五章读书笔记
    Linux内核分析——分析system_call中断处理过程
    第一二章读书笔记
    20145217《网络对抗》 Web安全基础实践
    20145217《网络对抗》web基础
    20145217《网络对抗》 MSF基础应用
  • 原文地址:https://www.cnblogs.com/zoujiaojiao/p/13841152.html
Copyright © 2011-2022 走看看