您现在的位置是:首页 > 正文

docker日志

2024-04-01 01:04:41阅读 1

   高效的监控和日志管理对保持生产系统持续稳定的运行以及排查问题至关重要。

   在微服务架构中,由于容器的数量众多以及快速变化的特性使得记录日志和监控变得越来越重要。考虑到容器短暂和不固定的生命命周期,当我们需要debug问题时有些容器可能不存在了。因此,一套集中式的日志管理系统是生产环境中不可缺的组成部分

一、docker logs

    默认配置下的docker日志功能。对于一个运行的容器,docker会将日志发送到容器的 标准输出设备STDOUT和标准错误设备(STDERR),stdout和stderr实际上就是容器的控制台终端

   我们在启动日志的时候没有用-d 参数,httpd容器以前台方式启动,日志会直接打印在当前的终端窗口。如果加上-d 参数以后台方式运行容器,我们就看不到输出的日志。

   这个情况如果要查看容器的日志:

     1.attach到该容器

docker attach webb

 attche到了nginx容器,没有任何输出,那是因为他只能看到attche进入后所产生的日志,可以在另一台查看网页数据。这事 attache的终端就会打印出新的日志。

  attache的方法在实际上使用不方便,因为:

        1.只能看到attache之后的日志,以前的日志不可见。

        2.退出attach状态比较麻烦(ctry+p然后ctry+q组合键),一不小心很容器将容器杀掉(crtl+c)查看容器日志推荐的方法是用docker logs命令

 2.docker logs 命令查看日志。

docker logs  -f test

  docker logs能够打印出自容器启动以来完整的日志,并且 -f 参数可以继续打印出新生产的日志,效果上与linux命令 tail -f 一样

二、docker支持多种日志方案

    将容器日志发送到stdout和stderr是docker的默认日志行为。实际上,docker提供了多种日志机制帮助用户从运行的容器中提取日志信息,这些机制被称作logging driver 

    1. docker默认logging driver是json-file

docker info  |  grep 'Logging Driver'

    2.如果容器在启动时没有特别指明,就会使用这个默认的logging driver json-file会将容器的日志保存在json文件中,docker负责格式化其内容并输出到stdout和stderr。我们可以在host的容器目录中找到这个文件,容器路径为:

docker container  inspect  webb | grep 'LogPath'

3.除了json-file docker还支持多种logging driver,完整列表可访问官方文档

4.容器启动时可以通过 --log-driver指定使用logging driver 。如果要设置docker默认的logging driver,需要修改docker daemon的启动脚本,指定--log-driver参数

docker run --log-driver  none  -p 80:80 -dit --name test   nginx  (none不支持日志读取)

或者

vim /usr/lib/systemd/system/docker.service (修改配置文件)

ExecStart=/usr/bin/dockerd -H fd:// --log-driver=none  

四、初探elk

   在开源的日志管理方案中,最出名的莫过于elk了

   一)、elk是三个软件的合成elasticsearch、logstash、 kibana。

  1.elasticsearch

       一个近乎实时查询的全文索引引擎,elasticsearch的设计目标就是能够处理和搜索巨量的日志数据

  2.logstash

     一个近乎实时查询的全文索引 ,elasticsearch的设计目标就是要能够处理和搜索巨量的日志数据。

  3. kibana

     一个基于javascript 的web图形界面程序,专门用于可视化elasticsearch的数据,kibana能够查询elasticsearch并通过丰富的图表展示结果,用户可以创建dashboard来监控系统的日志。

   二)、日志处理流程:

        

    三)、安装elk套件

        环境:

                1.docker至少的分配3GB内存;

                2.elasticsearch至少需要单独2G的内存;

                3.防火墙开放相应端口

                4.vm.max_map_count至少需要262144 附永久修改vm.max_count方法如下:

vim  /etc/sysctl.conf

vm.max_map_count = 262144

 sysctl  -p (查看)

  1.安装docker elk

          执行命令 :

docker pull sebp/elk

   2.以下命令启动堆栈,运行具有2GB堆大小的elasticsarch和具有1GB堆大小的logstash:

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -itd -e ES_HEAP_SIZE="2G" -e LS_HEAP_SIZE="1G" --name elk sebp/elk

  此命令发布以下端口,这些端口是正在操作elk堆栈所需的:

       5601 (kibana  web界面)

       9200 (elasticsearch JSON接口)

      5044(logstash beats界面,从beats接收日志,如filebeat)

    3.打卡浏览器输入:192.174.1.5:5601

    

 五、ELK完整部署和使用 

    1.安装filebeat

curl  -L  -O  https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm

rpm -vih filebeat-7.7.0-x86_64.rpm

    2.配置filebeat

             filebeat的配置文件为/etc/filebeat/filebeat.yml,我们需要告诉filebeat两件事

                  监控哪些日志文件?

                  将日志发送到哪里

   ①  修改日志收集目录

vim /etc/filebeat/filebeat.yml


- /var/lib/docker/comtainers/*/*.log
- /var/log/messages

 ②添加elasticsearch服务器地址

 ③添加kibana服务器地址

 3.启动elasticsearch模块

filebeat modules enable elasticsearch

4.初始化filebeat

filebeat setup

5.启动filebeat

 systemctl start filebeat.service

  启动容器 测试是否能够检测到日志

六、万能数据收集器

     前面的elk中我们是filebeat收集docker 容器,利用的是docker默认的logging driver   json-file

    fluentd是一个开源的数据收集器,它的目前有超过500种的plugin 可以连接各种数据源和数据输出组件。

    处理流程如下:

        

1.安装fluentd

docker pull fluent/fluentd

 docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd

2.重新编辑配置文件/etc/filebeat/filebeat.yml 将/data添加到监控路径中,删除其他的输入日志即可

3.重启filebeat

systemctl restart filebeat

4.监控容器日志,启动测试容器

 docker run -dit  --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="container-A"  busybox sh -c 'while true; do echo "this is a log from A"; sleep 10; done;'

docker run -dit  --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="container-B"  busybox sh -c 'while true; do echo "this is a log from B"; sleep 10; done;'


--log-driver=flunentd 告诉docker使用fluentd的logging driver
--log-opt fluentd-address=localhost:24224 将容器日志发送到fluentd的数据端口。
--log-opt tag="container-B" 在日志中添加一个可选的tag,用于用于区分不同容器

 5.容器启动后 kubana很快就能查到容器日志

网站文章

  • Ubuntu搭建GPU版本的百度Apollo3.5或5.5自动驾驶平台

    Ubuntu搭建GPU版本的百度Apollo3.5或5.5自动驾驶平台

    Ubuntu16.04搭建百度Apollo3.5步骤详解一、安装ubuntu16.04二、安装git-lfs三、添加SSH密钥四、下载Apollo镜像五、设置Docker环境六、安装ros-indig...

    2024-04-01 01:04:15
  • Kali工具信息收集

    Kali工具信息收集

    Kali工具信息收集 一、DNS信息收集 1、fierce介绍,在一个安全的环境中,暴力破解DNS的方式是一种获取不连续IP地址空间主机的有效手段。fierce工具可以满足这样的需求,而且已经预装在K...

    2024-04-01 01:04:06
  • nio读取文件,输出文件

    io流的一种:package com.cxy.ssp.Automic;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.util.conc...

    2024-04-01 01:03:54
  • 设计模式之建造者模式

    设计模式之建造者模式

    23种设计模式之建造者模式

    2024-04-01 01:03:29
  • 类中静态变量未定义导致undefined reference to static class member问题的解决方法

    undefined reference to ***这个链接错误的花样总是层出不穷(more),这一次是找不到类中的成员。 例子1:undefined reference to VS. 类静态成员变量 在文件A.h中声明了类A与类B: class A { friend class B; static int pa; // 注:这里把成员变量声

    2024-04-01 01:03:22
  • 2022.5.13 C++基础入门——引用和inline函数

    2022.5.13 C++基础入门——引用和inline函数

    这里写目录标题1.引用1.1引用定义引用的特点2.inline函数 1.引用 1.1引用定义 用我们通俗的话说,引用就是别名,即就是a=10,c引用a,那么c也就是;引用的符号用&来表示,例如...

    2024-04-01 01:03:15
  • Java-数据结构-二叉树<三>

    Java-数据结构-二叉树<三>

    leetcode 剑指 Offer 54. 二叉搜索树的第k大节点 leetcode236二叉树的最近公共祖先 leetcode653 两数之和 IV - 输入二叉搜索树 leetcode102 二叉...

    2024-04-01 01:02:48
  • 已解决SqlServer报错Arithmetic overflow error converting expression to data type int

    已解决SqlServer报错Arithmetic overflow error converting expression to data type int

    本文记录(pymssql.OperationalError) (8115, b’Arithmetic overflow error converting expression to data type...

    2024-04-01 01:02:42
  • 32位和64位的win7系统的选择

    转自:http://www.win7zhijia.cn/jiaocheng/win7_150.html 随着win7系统逐渐成为目前pc机的主流系统,很多用户都已经开始准备将自己的个人计算机或者公司计...

    2024-04-01 01:02:35
  • mysql从高到低拍讯_MySQL少有人知的排序方式

    mysql从高到低拍讯_MySQL少有人知的排序方式

    ORDER BY 字段名 升序/降序,相信进来的朋友都认识这个排序语句,但遇到一些特殊的排序,单单使用字段名就无法满足需求了,下面给大家介绍几个我遇到过的排序方法:一、准备工作为了更好演示与理解,先准...

    2024-04-01 01:02:10