容器中的日志收集之Volume

在容器中重启实例的时候日志会丢失,不便于查看日志排查问题。所以这边学习了一下简单的日志收集。

Volume(卷)是用来存储docker持久化的数据,其实就是宿主机上的一个目录,由docker统一进行管理

  • 在docker中使用Volume挂载教程很多,贴一下看见的博客戳这,下面贴上简单的挂载使用:
#使用-mount创建实名卷
$ docker run -d \
  --name devtest \
  --mount source=xxxx,target=/mnt/cephfs/mytest/logs/\
  nginx:latest
 
#使用-v创建实名卷
$ docker run -d \
  --name devtest \
  -v xxxx:/mnt/cephfs/mytest/logs/\
  nginx:latest
  • 在kubernetes中可以通过简单的配置进行挂载,如下为部分配置:
    spec:
      containers:
        - name: mytest
          image: "xxxx"
          imagePullPolicy: Always
          args:
            - -c
            - java -jar /home/mytest/*.jar --spring.profiles.active=test --server.port=8080
          command:
            - /bin/bash
          ports:
            - containerPort: 8080
          volumeMounts:
            - name: mytest
              mountPath: /mnt/cephfs/mytest/logs/
      volumes:
        - name: mytest
          hostPath:
            path: /mnt/cephfs/mytest/logs/

以上:

  • 可以看见我们将目录/mnt/cephfs/mytest/logs/挂载进来了,那么我们接下来只需要将实例日志打印到挂载的目录中即可。

Logback

  • 这是目前使用的Logback配置,日志分info,error,debug级别打印且按日期分割打包,可供参考:
  • 日志集成了sentry,不需要的可以去除。戳我看sentry集成
<configuration>

    <!-- 定义全局参数常量 -->
    <property name="log.level" value="INFO"/>
    <property name="log.maxHistory" value="30"/>
    <!-- 日志的存放位置 -->
    <property name="log.filePath" value="/mnt/cephfs/mytest/logs/app"/>
    <property name="log.pattern" value="%d{yyyy-MM-dd : HH:mm:ss.SSS}[%thread]%-5level%logger{50}-%msg%n"/>

    <!-- DEBUG -->
    <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件会滚动 -->
        <!-- 文件路径 -->
        <file>${log.filePath}/debug.log</file><!-- 当前的日志文件存放路径 -->
        <!-- 日志滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 历史日志文件的存放路径和名称 -->
            <fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- 日志文件最大的保存历史 数量-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 日志文件中日志的格式 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>  <!-- 用过滤器,只接受DEBUG级别的日志信息,其余全部过滤掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- INFO -->
    <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件会滚动 -->
        <!-- 文件路径 -->
        <file>${log.filePath}/info.log</file><!-- 当前的日志文件存放路径 -->
        <!-- 日志滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 历史日志文件的存放路径和名称 -->
            <fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- 日志文件最大的保存历史 数量-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 日志文件中日志的格式 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>  <!-- 用过滤器,只接受INFO级别的日志信息,其余全部过滤掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- ERROR-->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 日志文件会滚动 -->
        <!-- 文件路径 -->
        <file>${log.filePath}/error.log</file><!-- 当前的日志文件存放路径 -->
        <!-- 日志滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- TimeBased默认是一天更新一次 -->
            <!-- 历史日志文件的存放路径和名称 -->
            <fileNamePattern>${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
            <!-- 日志文件最大的保存历史 数量-->
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>  <!-- 日志文件中日志的格式 -->
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>  <!-- 用过滤器,只接受ERROR级别的日志信息,其余全部过滤掉 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- logger标签用于和appender进行绑定,并告诉logback哪些包(name属性)的日志信息需要记录 -->
    <!--logger将会继承root标签,在加上additivity="true"的属性后 root标签中的level将会被logger的level覆盖-->
    <logger name="com.ifly.ibk" level="${log.level}" additivity="true">
        <!-- level表示只记录哪一个级别以上的日志 -->
        <!-- 与appender进行绑定 -->
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="errorAppender"/>
    </logger>

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <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"/>

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%X{appName} %X{action} %d{MM-dd HH:mm:ss.SSS} %clr(%5p) %clr([%9t]){faint} %clr(%-40.40logger{39}[%3line{3}]){cyan} %clr(:){faint} %m%n</pattern>
        </encoder>
    </appender>

    <appender name="Sentry" class="io.sentry.logback.SentryAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

<!--    <springProfile name=""></springProfile>-->
    <root level="INFO">
        <appender-ref ref="Console"/>
        <appender-ref ref="Sentry"/>
    </root>

</configuration>

posted @ 2020-03-12 14:14  faylinn  阅读(590)  评论(0编辑  收藏  举报
、、、