±¾ÎÄÖ÷Òª½éÉÜÁËÈçºÎʹÓÃElasticSearch¡¢Logstash¡¢KibanaºÍLogspout¼¼ÊõÕ»À´²¿Êð×Ô¶¯»¯µÄÈÕ־ϵͳ¡£
You, too, could Logstash.
¿ìËÙÄîÎå±éÕâ¸öÌâÄ¿£¡²»¹ý˵ʵ»°£¬ÎÒÆäʵ²¢²»È·¶¨¸Ã¸øÕâÆªÎÄÕÂÆð¸öʲôÑùµÄÃû×Ö²ÅÄÜÈ·±£ÈËÃÇ¿ÉÒÔÕÒµ½Ëü¡£
ÕâÆªÎÄÕÂÊÇ»ùÓÚ Evan Hazlett¡¯s article on running the ELK stack
in Docker ºÍ ClusterHQ¡¯s article on doing it with Fig/Docker
Compose and FlockerÕâÁ½ÆªÎÄÕµġ£±¾ÎÄͬʱҲÊܵ½ÁË Borg paperµÄÓ°Ï죬ËüÔÚÌÖÂÛʹÓằê×¼Õ»¡»×öÊÂÇéµÄʱºòÌá³öÁËÎÒÃǸÐÐËȤµÄµÄһЩ¹¤¾ß¡£
ÎÊÌâ
ÏàÐŲ»ÓÃÎÒ˵ÄãÒ²Ã÷°×ΪʲôҪ¶ÔÍ×ÉÆ´¦ÀíÈÕÖ¾£¬ÈÕÖ¾¿ÉÒÔ°ïÖúÎÒÃÇÅŲé´íÎ󣬷ÖÎöÎÊÌâ¡£
µ±È»£¬Ò²ÓкܶàÈÕÖ¾µÄ½â¾ö·½°¸£¬ÆäÖаüÀ¨LogstashÕâÑù·Ç³£¿É°®µÄ¼¼Êõ¡£¶øºóÓÖ³öÏÖÁ˸ü¶àʵÓõļ¼Êõ¡£
ÎÒÃǶ¼ÖªµÀÈÕÖ¾µÄÖØÒªÐÔ£¬ËùÒÔ£¬Ëæ×ŶÔDockerÐËȤµÄÔö¼Ó£¬ÈÃÈËÃÇ·è¿ñµÄÒ»¼þÊÂÇé¾ÍÊÇÈçºÎÔÚDockerµÄÊÀ½ç´¦ÀíÈÕÖ¾¡£
ÓÐÁËDocker£¬ÈËÃÇͻȻ±»ÆÈÐèÒªÓÃÁíÒ»ÖÖ·½Ê½À´¿¼ÂÇÈÕÖ¾¡£ÔÚ²¿ÊðÒ»¸ö´«Í³µÄLinuxʱ£¬Ó¦ÓóÌÐò»òÕ߼ܹ¹¼Ç¼ÈÕÖ¾µÄ·½Ê½Í¨³£¼Ç¼µ½ÎļþÀ
Ò»°ã£¨µ«²»Ò»¶¨£©»á¼Ç¼µ½/var/logĿ¼Ï¡£µÄÈ·£¬ÎÒÓÐһЩ¹ØÓÚ¼ì²éPHPÈÕÖ¾¡°²»´í¡±£¨ÒëÕß×¢£ºÔÎÄÊÇ´øÒýºÅµÄfond£¬Ó¦¸ÃÊÇ·´ÓïµÄÒâ˼£©µÄ»Ø
Ò䣬ÔÚÄǸöÏîÄ¿ÖУ¬ÈÕÖ¾ÊÇ·ÅÔÚÏîÄ¿µÄĿ¼Ï£¬µ±³öÏÖ´íÎóµÄʱºòÄÚÖõÄÓ¦ÓóÌÐòÈÕÖ¾²¢²»ÄÜÌṩÈκÎÓÐÓõĶ«Î÷¡£ÎÒÆäʵ²¢²»Ï²»¶°ÑÈÕÖ¾²ð·Ö³ÉÄÇÑù£¨¸ü¶à¿ÉÒÆ¶¯
µÄ²¿·ÖÒâζןüÄѵ÷ÊÔ£©£¬¿ÉÄܸüºÃµÄʵ¼ùÊÇÓÐÒ»¸öͳһ·ÃÎÊÈÕÖ¾µÄ·½Ê½¡£µÄÈ·£¬ÓÐһƪ¹ØÓÚÕâ¸öÏë·¨£¨¡°Í³Ò»ÈÕÖ¾²ã¡±£©µÄÓÐȤµÄ
ÎÄÕ£¬×÷ÕßÊÇÀ´×Ô FluentdµÄKiyoto Tamura£¬ÕâÊǸöÀàËÆLogstashµÄ¹¤¾ß¡£
ÄǶÔÓÚDockerÓÐʲô²»Í¬ÄØ£¿Í»È»¼ä£¬²»Í¬ÓÚÒÔÍù½«ËùÓÐÈÕÖ¾·ÅÔÚÖ÷»úϵͳµÄͳһλÖã¬Èç½ñÈÕÖ¾·ÖÉ¢Ôںܶ಻ͬÈÝÆ÷µÄÏ໥¸ôÀëµÄ»·¾³ÖС£°¡Å¶£¬ÌýÆðÀ´ºÃÏñ¸úÎÒÃÇÏëÒªµÄ¸ÕºÃÏà·´¡£
DockerÒÔÍù´¦ÀíÈÕÖ¾µÄ·½·¨ÊÇͨ¹ýdocker logsÃüÁî - Docker²¶×½Ã¿Ò»¸öÈÝÆ÷½ø³ÌµÄSTDOUTºÍSTDERR£¬±£´æÔÚ´ÅÅÌÉÏ£¬È»ºóÓû§¾ÍÄÜʹÓÃdocker
logs <container>À´½øÐвéѯ¡£Èç¹ûÓÃÓÚ¿ª·¢£¬ÄãÖ»ÊÇÏëÍùÖÕ¶ËÆÁÄ»ÉÏ´òӡһЩÊä³ö²¢¿ìËٵõ½½á¹û£¬ÄÇôÕâÖÖ·½Ê½¹¤×÷µÄ»¹²»´í£»µ«Êǵ±Ä㿼
ÂÇÔÚ¸ü¸´ÔӵĻ·¾³ÏÂʹÓÃDocker£¬»òÕßÏëÒª²é¿´¸ü¶à´«Í³¼Ü¹¹µÄUnixºǫ́³ÌÐòµÄÈÕÖ¾£¬¶øÕâЩ³ÌÐòÔËÐÐÔÚºǫ́²¢ÇÒÈÕÖ¾¼Ç¼ÔÚÈÝÆ÷µÄÄÚ²¿´ÅÅÌÉϵÄʱºò£¬
Âé·³¾ÍÀ´ÁË¡£ÕâÖÖÇé¿öÏ£¬ÎÊÌâÖ÷ÒªÊÇ£º
1.¿É·¢ÏÖÐÔ£¨discoverability£© - Èç¹ûÈÝÆ÷Ö»ÊǶÌÔݵĴæÔÚ£¬ÄÇôÊÔͼÓÃÎÒÏëÒªµÄÈÕÖ¾¸ú×ÙËü£¬²¢ÇÒʹÓÃgrepÀ´½âÎöËü£¬ÕâÖÖ·½Ê½ºÃÏñ²»ÊÇÄÇôÓÐȤ£»
2.ÈÕÖ¾ÂÖת£¨log rotation£© - ÓÐЩ·þÎñ³ÌÐòÌØ±ð½¡Ì¸£¨ÒëÕß×¢£ºÔÎÄÊÇchatty£¬Òâ˼ÊÇÕâЩ³ÌÐò»áÓкܶàÊä³ö£©£¬Òà»òÊÇ»áÔËÐкܳ¤Ê±¼ä¡£ÄÇôÎÒÃǾÍÐèÒªÒ»ÖÖ·½Ê½£¬µ±ÏµÍ³ÔËÐÐÒ»¶Îʱ¼ä
ºó£¬¶ÔÈÕÖ¾½øÐÐÒ»´ÎÇåÀí£¬À´È·±£´ÅÅ̲»»á±»ÄÇЩÎÒÃDz»ÔÙʹÓõÄÈÕÖ¾ËùÌî³ä¡£¾ÝÎÒËùÖª£¬ÏÖÓеÄDocker»¹²»Ö§³ÖÕâÖÖÌØÐÔ¡£
ÔÚÕâÆ¬ÎÄÕÂÖÐÎÒÔÝÇÒ²»Ì¸¹ØÓÚÈÕÖ¾ÂÖתµÄÄÚÈÝ£¬ÒòΪÄÇÊÇÁíÒ»¸ö¹Þ¹ÞÀïµÄ³æ×Ó£¬µ«ÊÇÎÒ»áÔÚÕâÀïÃèÊö¸Ã¼¼ÊõÕ»£¨ÒëÕß×¢£ºÔÎÄÊÇstack£¬²»ÖªµÀÒë³É¼¼ÊõÕ»ÊÇ·ñÕýÈ·£©µÄÂÖÀª£¬Ö÷ÒªÊÇΪÁË»º½â´¦ÀíµÚÒ»¸öÎÊÌâµÄ¹ý³Ì¡£
¶ÔÓÚÄÇЩ°ÑÈÕÖ¾¼Ç¼ÔÚÈÝÆ÷ÄÚ²¿´ÅÅ̵Ľø³Ì£¬Èç¹ûÏëҪΪËüÃǼǼ±êÇ©£¬ÓкܶàÖÖ·½·¨¿ÉÒÔÈÃËü¹¤×÷¡£ÎÒ×îϲ»¶µÄÒ»ÖÖ·½Ê½¡ª¡ªËäÈ»²¢Ã»ÓÐÔÚÕâÀïÕæÕýÁгöÀ´£¬µ«ÔÚÎÒ¿´À´·Ç³£ÓÐÓ᪡ªÊǽ«ÔʼÈÝÆ÷ÈÕÖ¾¼Ç¼µÄĿ¼×÷Ϊһ¸ö¾í£¨
volume£©£¬ ²¢ÇÒÈÃÆäËûÈÝÆ÷ʹÓÃ--volumes-fromÑ¡ÏîÀ´¼Ì³ÐÕâ¸ö¾í¡£È»ºóËûÃǾͿÉÒÔʹÓÃtail
-f /var/log/foo/access.log»òһЩÆäËû·½·¨À´²é¿´ÈÕÖ¾ÁË¡£ÔÚÎÒ¿´À´Õâ´Ù½øÁËÒ»¸öÏ൱ºÃµÄ¹Ø×¢µãµÄ·ÖÀ룬ÒòΪÄã½øÐмàÊÓÈÕÖ¾µÄÈÝÆ÷Óëд
ÈÕÖ¾µÄÈÝÆ÷µÄ²»Í¬µÄ£¬ÁíÍ⣨²¢²»³ä·Ö£©Äã¿ÉÒÔÈÆ¿ªunionÎļþϵͳÀ´½øÐвÙ×÷£¨¾ÍÏñ²Ù×÷Ò»¸öÊý¾Ý¿âÒ»Ñù£©¡£µ«ÕæµÄûÓбØÒªÔÚ¾µÏñÖиú×ÙÈÕÖ¾£¨×´Ì¬£©¡£
ÄǹØÓÚdiscoverabilityÄãÒª×öÐ©Ê²Ã´ÄØ£¿ÎÒÃǽ«»áÔÚDockerÄÚÔËÐÐÒ»¸ö ELK stack£¬²¢ÇÒʹÓÃ
logspout¹¤ ¾ßÀ´×Ô¶¯½«ÈÝÆ÷µÄÈÕ־·Óɵ½Logstash¡£ÎÒÕæÐľõµÃÔÚδÀ´ÕâÖÖ·½·¨»áÓ¦ÓÃÔÚºÜ¶à·½Ãæ
- Èç¹ûÄ㽫ҪÔËÐÐÈÝÆ÷¡¢Í£Ö¹ËüÃÇ¡¢É¾³ýËüÃÇ»òÕ߯äËü£¬ÄÇôÄã¿ÉÄÜÒ²»á¶Ô±¾µØÊ¼þ¸ÐÐËȤ,²¢ÇÒ»áÈÃÈÝÆ÷µÄÉúÃüÖÜÆÚ¿ÉÒÔ×·×ٺͼàÊÓ¡£Ö®ºóÄãµÄ»ù´¡ÉèÊ©¾Í¿ÉÒÔÖØÐÂ
¼¤»î¶ø²»ÔÙÐèÒªÈ˹¤¸ÉÔ¤¡£Í¬Ñù¶ÔÓÚÏñ¸ºÔØÆ½ºâ£¬·þÎñ·¢Ïֵȴ˷½·¨Ò²ÊÇ¿ÉÓõ쬵«Äǽ«ÊÇÁíһƪÎÄÕµÄÄÚÈÝÁË¡£
·½·¨
ÒÔÏÂÊÇEvanºÍClusterHQµÄ·½·¨£¬ÎÒÃǽ«»áÔËÐУº
ÓÃElasticSearchÀ´Ë÷ÒýÊÕ¼¯µÄÈÕÖ¾Êý¾Ý²¢Ê¹Ëü¸üÒ×ÓÚ²éѯ
ʹÓÃLogstash×÷ΪԶ³ÌsyslogÀ´ÊÕ¼¯À´×ÔÈÝÆ÷µÄÈÕÖ¾
ʹÓÃLogspoutÀ´ÏòLogstash·¢ËÍÈÝÆ÷µÄÈÕÖ¾
ʹÓÃKibana×÷ΪÓëÊÕ¼¯À´µÄÊý¾Ý½øÐн»»¥µÄÒ»¸öƯÁÁµÄǰ¶Ë
Cadvisor£¬Ò»¸ö¼àÊÓÈÝÆ÷×ÊÔ´µÄÖ¸±êµÄÒDZíÅÌ£¬Õâ¸ö´¿Êô¸öÈËϲºÃ(ÔÎÄ£ºfor
kicks)
Èç¹ûËüÃÇÌýÆðÀ´ÏñÊÇ»áÔËÐÐÏÅÈËÊýÁ¿µÄ³ÌÐò£¬ÇëÊÔ×Ų»ÒªÄÇô·³ÄÕ - ÎÒÃǽ«»áÖ±½ÓʹÓà Docker ComposeÀ´¿ªÊ¼ÕâЩ¹¤×÷¡£
ËùÒÔ£¬Èç¹ûÄãÏëÔÚ¼Ò¸úËæÎÒÒ»ÆðÀ´×ö£¬Äã¿ÉÒÔÔËÐÐÒÔÏÂÃüÁîÀ´¿ªÊ¼ (ÄãÐèÒª°²×°×îа汾µÄDockerºÍDocker
Compose):
$ git clone https://github.com/nathanleclaire/elk $ cd elk $ docker-compose -f docker-compose-quickstart.yml up |
Õâ»áÔÚ´ÓDocker HubÉÏ»ñµÃµÄÈÝÆ÷»¯ºÃµÄ¾µÏñÉÏÆô¶¯Ó¦ÓóÌÐò£¬¶øÇÒÄãµÄKibanaǰ¶Ë»á´Ó80ºÅ¶Ë¿Ú½øÐлñÈ¡¶ø²»¹ÜÖ÷»úµÄDOCKER_HOSTÖ¸ÏòʲôµØ·½¡£
¶ÔÎÒ¶øÑÔ£¬ÎÒϲ»¶²¿Êð£¨ÒëÕß×¢£ºÔÎÄkick up£¬²»È·¶¨ÊÇ·ñÄÜÒë³É²¿Êð£©Ò»¸ö DigitalOcean
droplet£¨ÒëÕß×¢£ºDigitalOceanÌṩÁËIaaS·þÎñ£¬dropletsÊÇDigitalOcean¹«Ë¾×¨ÓеÄÔÆ·þÎñÆ÷ÊõÓ»òÕߵȼ۵ÄʹÓÃ
Docker MachineÀ´×öÕâÑùµÄ¹¤×÷£¬ÒòΪÀ¾µÏñËùÐèµÄ´ø¿íÏë±Ø±ÈÁ¬½ÓÄãÁÚ¾ÓµÄWiFiµÄÒªÇó¸ü¸ßһЩ¡£Èç¹ûÄãÒ²ÏëÕâô×ö£¬ÄÇôÏÂÃæµÄÃüÁî¿ÉÒÔ´´½¨Äã×Ô¼ºµÄ·þÎñÆ÷£¨ÔÙ´ÎÇ¿µ÷£¬È·±£°²×°ÁË×îа汾µÄÈí¼þ£©:
$ export DIGITALOCEAN_ACCESS_TOKEN=MY_SECRET_API_TOKEN $ docker-machine create -d digitalocean \ --digitalocean-size 4gb \ --digitalocean-image docker \ droplet .... .... .... To point your Docker client at it, run this in your shell: eval "$(docker-machine env droplet)" $ eval "$(docker-machine env droplet)" |
ÎÒͨ³£½¨ÒéʹÓÃÉÏÎÄÌáµ½µÄÌåÃæ½áʵµÄ·þÎñÆ÷£¬ÒòΪÕâЩ½ø³Ì¿ÉÄÜ»áÏûºÄ´óÁ¿µÄÄÚ´æ¡£ËüÔÚ±¾µØ¹¤×÷µÄ»¹²»´í£¬µ«ÊÇpulls²Ù×÷»áÓеãÂý£¬³ý·ÇÄãʹÓõÄÊǹâÏË¡£
Èç¹ûÄã²»ÊǺÜϲ»¶ÔËÐв»ÊÜÐÅÈξµÏñ£¨»òÕßÄã½ö½öÊÇÐ޸IJ¢¹¹½¨×Ô¼ºµÄ¾µÏñ£©£¬Ã»ÓÐÎÊÌ⣺·¢ÐаæÖÐĬÈϵÄdocker-compose.ymlÊÇ»ùÓÚ¹¹½¨²ÎÊýµÄ£¬ËùÒÔÄã¿ÉÒÔ×Ô¼º¹¹½¨¾µÏñ£º
$ docker-compose build $ docker-compose up |
µ±Äã°ÑÈÝÆ÷Æô¶¯ºó£¬ÄãµÄÖÕ¶ËÉÏ»áÓÐÀàËÆµÄÊä³ö£º

Äã¿ÉÄܻῴµ½¹ØÓÚLogspoutδÄÜÁ´½Óµ½syslogµÄ´íÎ󣬲»¹ýÕâûʲôÎÊÌ⣬ºÜÕý³£¡£¸Ã´íÎóÊÇÒòΪLogstashÈÝÆ÷»¹Ã»ÓÐÆô¶¯¡£µ±°ÑËüÔËÐÐÖ®ºó£¬ÉÏÃæµÄ´íÎó¾Í»áÍ£Ö¹ÁË¡£
ÏÖÔÚµ±Äã²é¿´Æô¶¯ÁËÒ»×éÈÝÆ÷µÄËÞÖ÷»úµÄ80ºÅ¶Ë¿Úʱ£¬ÄãÓ¦¸Ã»á¿´µ½KibanaµÄ»¶Ó½çÃæ£º

µã»÷ÉÏͼÖмýͷָʾµÄ ¡°Logstash dashboard¡± Á´½Ó£¬»òÖ±½Ó·ÃÎÊ<machineIp>/#/dashboard/file/default.json£¬Äã»á±»´øµ½Äãн¨µÄDockerÈÕ
Ö¾¼Ü¹¹µÄÒ³Ãæ£¨ÒëÕß×¢£ºÕæµÄ²»Ïë°ÑdashboardÒë³ÉÒDZíÅÌ£©£¡
ÎÒÒ»Ö±ÔÚÇ¿µ÷£¬¹ØÓÚÈÝÆ÷×î»ù±¾µÄ¡°¼¼ÊõÕ»¡±ÔÚEvanµÄÎÄÕÂÀï±»Ö±½ÓºöÂÔÁË£¬ÕⲢûÓÐʲô²»ºÃ£¬µ«Êǵ±ÎÒ×Ô¼ºÏëҪʵÏÖÕâЩ¼¼ÊõµÄʱºò£¬Óöµ½ÁËһЩÎÊÌ⣺
1.Logspout·¢Ë͵ÄÊý¾Ý¸ñʽ¸úEvanÔÎÄÖÐÌáµ½µÄLogstashµÄgrok¹ýÂËÆ÷ÓÐÂÔ΢µÄ²»Í¬/¸ñʽÖоµÏñÊÇÐèÒªµÄ£¬ËùÒÔ£º
2.ÔÚÈÕÖ¾ÖлáÓкܶàgrok½âÎöʧ°ÜµÄ´íÎó£¨ÕâÒâζ×ÅLogstashÊÔͼȥƥÅäÒ»¸öËüÖªµÀµÄÈÕÖ¾ÐÅϢģʽȴ²»ÄÜÕýÈ·½âÎö£©¡£¶ÔÓÚËü×Ô¼ºÀ´ËµÕâ²¢²»ÊÇʲô´óÎÊÌ⣬µ«ÊÇ£º
3.ÓÉÓÚLogstashÊÇÒ»¸ö±»Logspout¼àÊÓµÄÈÝÆ÷£¬¶øLogspout»á½«LogstashËùÓеÄÈÕ־ת·¢¸øLogstash£¬Õâ»áÔì³ÉÒ»¸ö·è¿ñµÄ
×ÔÐýÑ»·²¢ÇÒ¼¸ºõ»áºÄ¾¡ÈÝÆ÷ÄÚËùÓеÄCPU×ÊÔ´£¨docker stats£¬Ò»¸ö·Ç³£ÓÐÓõÄÃüÁ¿ÉÒÔʵʱ±¨¸æÈÝÆ÷×ÊÔ´µÄʹÓÃÇé¿ö£¬ÎÒ¾ÍÊÇÓÃËüÀ´²¶×½µ½ÁËÉÏÊöµÄÎÊÌ⣩¡£

This can't be good.
ÄÇÒ»¸öºÚ¿Í»á×öÐ©Ê²Ã´ÄØ£¿µ±È»ÊǺڣ¨ÒëÕß×¢£ºÕâÀïÓ¦¸ÃÊǽâ¾öÎÊÌâµÄÒâ˼£©ËüÁË£¡ÎÒ¸´ÖÆ£¨fork£©ÁËEvanµÄÔʼµÄ
Dockerfiles/repos²¢¸ü¸ÄÁËһЩ¶«Î÷¡£µÚÒ»²½£¬ÎÒ°ÑËùÓÐÈÝÆ÷ÈÓ½øÁËÒ»¸ödocker-compose.ymlÎļþµÄ·þÎñÖУ¬Èç´ËÒÔ±ã¿ìËÙ
²Î¿¼£¨ÕâÑùµ±ÎÒÏëÔÙ´ÎÆô¶¯docker¼¼ÊõÕ»µÄʱºò¾Í²»±ØÖظ´ÊäÈëËùÓÐdocker runÃüÁîÁË£©¡£ÎÒÔÚ the
Logspout Github repoµÄÎĵµÖÐ×¢Òâµ½Äã¿ÉÒÔΪÈÝÆ÷Ö¸Ã÷Ò»¸ö»·¾³±äÁ¿À´ÈÃËüµÄÈÕÖ¾²»Òª×ª·¢¸øLogspout¡£ËùÒÔ£¬ÎÒÔÚLogstashÈÝÆ÷ÖÐÉèÖÃÁËÕâ¸ö»·¾³±äÁ¿£ºLOGSPOUT=ignore¡£
¶ÁÊéÒ²Ó¦¸Ã»á×¢Òâµ½£¬gliderlabs/logspout¾µÏñÏÖÔÚÏëÒªDockerÌ×½Ó×Ö¹ÒÔØµ½/var/run/docker.sock
(¾µäµÄλÖÃ), ¶ø²»ÊÇÒÔǰµÄ/tmp/docker.sock - ÔÚÎÒÒâʶµ½Õâµã֮ǰ£¬ÎÒÖð×ÖʹÓÃÁËEvanÎÄÕÂÖиø³öµÄÃüÁ¶øÕâÕâ¸øÎÒÔì³ÉÁ˺ܴóµÄÂé·³¡£ËùÒÔÇë×¢ÒâÕâ¸öÎÊÌ⣡£¡
ÏÖÔÚÕâ¸ö»·¾³£¨stack£©²»ÔÙ³öÏÖÄǸöÎÞÏÞÑ»·À´±ÞÌ¢ÎÒµÄCPUÁË¡£²»¹ý»¹ÓÐÒ»¸öÌôÕ½£ºÄÇЩÔÚÈÕÖ¾ÖÐgrok½âÎöʧ°ÜµÄÏûÏ¢¡£ÎÄÕÂÖÐÌṩµÄ
LogstashÅäÖÃÀý×Ó²»ÄÜºÜºÃµØÆ¥Å䣨ÒëÕß×¢£ºÔÎÄjive well£¬²»ÖªµÀÒÔΪƥÅäÊÇ·ñºÏÊÊ£©logspoutµÄÊä³ö¡£ËùÒÔ£¬ÎªÁ˸üºÃµØÕÆÎÕ·¢ÉúÁËʲô£¬ÎÒ×öÁËÔÚÕâÖÖÇé¿öÏÂËùÓÐÈ˶¼»á×öÊÂÇ飺ÔĶÁ
LogspoutÔ´Âë¡£
û¹ý¶à¾ÃÎÒżȻ·¢ÏÖÁËÕâ¸ö block of code related to
the syslog adapter:
func NewSyslogAdapter(route *router.Route) (router.LogAdapter, error) { transport, found := router.AdapterTransports.Lookup(route.AdapterTransport("udp")) if !found { return nil, errors.New("bad transport: " + route.Adapter) } conn, err := transport.Dial(route.Address, route.Options) if err != nil { return nil, err } format := getopt("SYSLOG_FORMAT", "rfc5424") priority := getopt("SYSLOG_PRIORITY", "{{.Priority}}") hostname := getopt("SYSLOG_HOSTNAME", "{{.Container.Config.Hostname}}") pid := getopt("SYSLOG_PID", "{{.Container.State.Pid}}") tag := getopt("SYSLOG_TAG", "{{.ContainerName}}"+route.Options["append_tag"]) structuredData := getopt("SYSLOG_STRUCTURED_DATA", "") if route.Options["structured_data"] != "" { structuredData = route.Options["structured_data"] } data := getopt("SYSLOG_DATA", "{{.Data}}") var tmplStr string switch format { case "rfc5424": tmplStr = fmt.Sprintf("<%s>1 {{.Timestamp}} %s %s %s - [%s] %s\n", priority, hostname, tag, pid, structuredData, data) case "rfc3164": tmplStr = fmt.Sprintf("<%s>{{.Timestamp}} %s %s[%s]: %s\n", priority, hostname, tag, pid, data) default: return nil, errors.New("unsupported syslog format: " + format) } tmpl, err := template.New("syslog").Parse(tmplStr) if err != nil { return nil, err } return &SyslogAdapter{ route: route, conn: conn, tmpl: tmpl, }, nil |
ÔÀ´ÔÚÎÒµÄÀý×ÓÖÐLogspout°´ÕÕ syslog RFC5424±ê×¼À´×ª·¢ÈÕÖ¾µÄ£¨Äã¿ÉÒÔÔÚÉÏÃæµÄ´úÂëÖв鿴ĬÈϵÄÖµ£©¡£ÎÒ»¨ÁËһЩʱ¼äÔڷdz£ºÃÍæµÄ
Logstash grok parse test appÉÏ£¬µ«Ö®ºóÎ񼆼̮æÍøÉÏÊÇ·ñÒѾÓнâ¾öÕâ¸öÎÊÌâµÄÏÖÓеÄ×ÊÔ´ÁË¡£ÎҺܿìµÄ¹È¸èÁËһϣ¬·¢ÏÖÁËÕâÆª
ÎÄÕ£¬·Ç³£³öÉ«µÄÃèÊöÁËgrok parse filter,¶øÕâÕýÊÇÎÒÏëÒªµÄ¡£ÎÒ½ö½ö¸ÄÁ˲¿·Ö´úÂ루±ÈÈ磬ÎÒ°Ñ¡°app¡±¸ÄΪÁË¡°containername¡±£©¾ÍºÜ¿ìÉϵÀÁË
- °ÑLogspoutµÄÈÕÖ¾½âÎöΪÓÐÓõÄÊý¾ÝÁË¡£
ÎÒ×îÖÕµÄLogstashÅäÖÃÎļþ¿´ÆðÀ´ÊÇÕâÑùµÄ£º
input { tcp { port => 5000 type => syslog } udp { port => 5000 type => syslog } } filter { if [type] == "syslog" { grok { match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-)
+(?:%{HOSTNAME:containerid}|-) +(?:%{NOTSPACE:containername}|-) +(?:%{NOTSPACE:proc}|-)
+(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" } } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } if !("_grokparsefailure" in [tags]) { mutate { replace => [ "@source_host", "%{syslog_hostname}" ] replace => [ "@message", "%{syslog_message}" ] } } mutate { remove_field => [ "syslog_hostname", "syslog_message", "syslog_timestamp" ] } } } output { elasticsearch { host => "elasticsearch" } stdout { codec => rubydebug } |
Ò²Ðí»¹ÓкܴóµÄ¸Ä½ø¿Õ¼ä£¬µ«Ê×ÏÈÎÒ»¹Ðë¸ü³ä·ÖµØÁ˽âLogstash ;P
So what?
ÏÖÔÚÎҵõ½ÁËÓÐÒâÒåµÄ¸ñʽµÄÈÕÖ¾ÁË£¬¶øÇÒÕⲢûÓжÔCPU²úÉú¶à´óµÄÓ°Ï죬̫°ôÁË£¡Ã¿µ±ÎÒÔÚÄÇ̨Ö÷»úÉÏÔËÐÐÒ»¸öÈÝÆ÷£¬ÈÕÖ¾¾Í»á×Ô¶¯µØÔÚ
ElasticSearchÖб»Ë÷Òý²¢ÇÒ¿ÉÒÔÔÚKibanaÖнøÐвéѯ£¡Logstash¹ýÂËÆ÷¸ºÔð½«ÔʼµÄϵͳÈÕÖ¾ÏûÏ¢½âÎöΪ¸üÓÐÓõıêÇ©ÐÅÏ¢¡£Õâ°üÀ¨
ÉÏÎÄÌáµ½¹ýµÄ£¬À´×ÔÔËÐиü¼ÊõÕ»µÄÈÝÆ÷µÄÈÕÖ¾£¨³ýÁËLogstash - ²»È·¶¨ÈçºÎ´¦ÀíËü£¬»òÎÒÊÇ·ñÓ¦¸Ãµ£ÐÄËü¡£¿ÉÄÜÒ»¸ö¸½¼ÓµÄÅäÖòÎÊý¿ÉÒÔÈÃËü½ö´òÓ¡×ÔÉíµÄÈÕÖ¾µ½STDOUT¶ø²»ÊÇËùÓÐÈÝÆ÷µÄÈÕÖ¾£©¡£ÏëÏóÒ»ÏÂÕâÀà×Ô¶¯»¯ÈÝÆ÷
ÈÕÖ¾½«»áÊǶàôÓÐÓ㬵±Ëü´¦ÀíÀàËÆ RancherOSÕâÑùµÄËùÓÐϵͳ·þÎñ¶¼ÔËÐÐÔÚDockerÈÝÆ÷ÄÚ²¿µÄʱºò¡£
Äã¿ÉÒÔ¾ö¶¨ÔÚÈÕÖ¾ÐÅÏ¢ÖÐÏÔʾÄÄЩ×Ö¶ÎÒÔ±ãÀ´¿ìËٲ鿴ÄãµÄÓ¦ÓóÌÐò²úÉúµÄÈÕÖ¾¡£ÕâÑù¾Í¿ÉÒÔʵʱ¸ÐÊܵ½ÔÚÈÝÆ÷Öз¢ÉúµÄÊÂÇé¡£KibanaÓгä·ÖÄÜÁ¦ºÍ¿ÉÅäÖÃÐÔ£¬ÔÊÐíÄãͨ¹ýÄãËùÓµÓеIJ»Í¬×Ö¶ÎÀ´½øÐÐÅÅÐò£¬²éѯÒÔ¼°¹ýÂË¡£

Logs which are nice and easy to read and query!
³¢ÊÔÔÚÒ»¸öÅäÖÃÁËELK¼¼ÊõÕ»£¨ÒëÕß×¢£º°üÀ¨Elasticsearch£¬LogstashºÍKibana£©µÄÖ÷»úÉÏÔËÐÐÒ»¸öÈÝÆ÷£¬È»ºóÀ´²é¿´×Ô¶¯ÏÔʾÔÚKibanaÉϵÄÈÕÖ¾£¨Äã¿ÉÄÜÐèҪˢÐÂÄãµÄä¯ÀÀÆ÷»òµã»÷KibanaÉÏ¡°Ë¢Ð¡±µÄˢа´Å¥£©¡£
$ docker run -d --name number_spitter debian:jessie bash -c 'for i in {0..2000}; do echo $i; done' |
ÄãÏÖÔÚ¿ÉÒÔ¿´µ½ÈÕÖ¾Öдó¶àÏûÏ¢À´×Ônumber_spitterÈÝÆ÷£¬ËüºÜ×ÔÈ»µØbash¹ö¶¯Ìõ£¨ÒëÕß×¢£ºÓ¦¸ÃÊÇÖ¸ÏÂͼ×îϱߵÄÄÇÒ»ÐУ©ÖÐÔÚͳöÁËÒ»´®Êý×Ö¡£
Whaaaaat! The Number Spitter container is so chatty!
Äã¿ÉÒÔÔÚÕâЩ»ù±¾µÄÉèÖÃÖ®ÉÏ×öºÜ¶à²»¿É˼ÒéµÄÊÂÇé¡£×ÔÈ»µØ£¬ÓÐÒ»¸ö¿ÉÒÔÓÃ×÷ÈÝÆ÷»î¶¯µÄ¿ÉÊÓ»¯±íʾµÄʱ¼äÐòÁÐͼ£¬¿ÉÒÔÈÃÄã·¢ÏÖÈȵ㣬²¢¿ìËÙÖªµÀ·¢ÉúÁËʲô£¬ÒÔ¼°ÎªÊ²Ã´»á·¢Éú¡£
What the hell happened here? I don't know, but I can
find out.
ÏÔʾ£ºElasticSearchÈÝÆ÷µÄÕæÊµÊ¼þ¡£
ÓдóÁ¿µÄÊÂÇé¿ÉÒÔ²¢ÇÒÓ¦¸ÃÔÚÅäÖÃÁËLogstashÖ®ºóÀ´½øÐÐ - ÕâÀïÌÖÂÛµÄÅäÖÃÎļþ½ö½öÊÇÒ»¸ö¿ªÊ¼¡£ÓÐЩÈÝÆ÷ʹÓÃËüÃÇ×Ô¼ºµÄÈÕÖ¾¸ñʽ£¬ËüÃÇÐèÒª½øÒ»²½µÄ½øÐнâÎö¡£ÀýÈ磬ÔÚÉÏͼÖÐÏÔʾµÄKibanaÈÝÆ÷µÄ¡°±í¸ñʽ¡±¾ÍÓÐ
Ëü×Ô¼ºµÄʱ¼ä´Á£¬ÒÔ¼°ÄÄЩIPµØÖ··ÃÎÊÄÄЩÎļþµÄÐÅÏ¢£¬HTTPÏìÓ¦µÄ״̬Â룬µÈ¡£
ËùÒÔ£¬ÕâЩ¸½¼ÓµÄÐÅÏ¢¾ø¶Ô¿ÉÒÔ±»½âÎöΪ¸üÓÐÓõĽṹ¸ñʽÖУ¬¶øÇÒÕâЩÊÂÇéÓ¦¸ÃÕë¶Ôÿ¸öÓ¦ÓóÌÐòÀ´×ö£¨on per-app
basis£©¡£Í¬Ñù£¬Äã¿ÉÒÔÏëÏóһϣ¬µ±ÄãµÄÏûÏ¢ÒÔ¸ü¸ßµÄ¹æ¸ñµÄ»ú¹¹À´³ÊÏÖ£¬ËüÃÇ¿ÉÒÔÆ¥ÅäÒ»¸öģʽÀ´¸æËßÄãÊÇ·ñÓÐÓ¦ÓóÌÐò´ÓpanicÖÐÆô¶¯£¬»òÕßÔÚ´úÂë
Ö´Ðз¾¶ÖÐÓöµ½ÁË¿ÕÖ¸ÕëÒì³££¬Òà»òÊDz»ÄÜÁ´½ÓÊý¾Ý¿âµÈ£¬¶¼»áÒÔÒ»¶¨µÄÓÅÏȼ¶ÔÚÈÕÖ¾ÖбíÏÖ³öÀ´£¬ÕâÓ¦¸ÃÊÇÒ»¼þºÜ¿áµÄÊÂÇé°É¡£
²¢ÇÒ£¬Èç¹ûLogspout°ÑDockerµÄʼþ£¨ÎÒ²»Çå³þÊÇ·ñÖ§³ÖÕâÑùµÄ¹¦ÄÜ£¬ÒòΪÎÒËÆºõ¼ÇµÃ¿´µ½Ò»Ð©ÈÝÆ÷µÄɾ³ýʵ«²¢Ã»ÓгöÏÖÆäËû±ðµÄ¶«Î÷£©
ºÍ/»òDockerµÄºǫ́ÈÕ־Ҳת·¢¸øÁËLogstash ½«ÊÇÒ»¼þºÜÇÉÃîµÄÊÂÇé¡£¿ÉÄÜÓÐÒ»ÖÖ¿ÉÒÔÌæ´úLogstashµÄ¸ü¼òµ¥µÄ·½Ê½¡£
´ËÍ⣬Docker 1.6 µÄ log drivers¿É ÄÜ»áÒÔÉÔ΢²»Í¬¹ýµÄ·½Ê½À´×öÀàËÆµÄÊÂÇ飬ËùÒÔÎÒºÜºÃÆæµ±°Ñlog
driver¿¼ÂǽøÀ´µÄ»°Õâ¸öÅäÖûáÓÐʲô±ä»¯¡£ÎÒ²»ÊǺÜÇå³þLogspoutµÄÄÚ²¿Ï¸½Ú£¬ËùÒÔÒ²²»ÖªµÀÊÇ·ñ¿ÉÒÔʹÓÃ--log-driver=none
²ÎÊýÀ´½ûµôlog driver,È»ºó¼ÌÐøÊ¹ÓÃLogspoutÀ´×ª·¢ÈÕÖ¾¡£Äǽ«»áºÜ¿áÒòΪÄãÖ»ÐèÒª¸úÖÐElasticSearchÖеÄÊý¾Ý£¬¶ø²»ÊǼÈÓÐ
ElasticSearchÓÖÓÐ--log-driver=json¸ñʽµÄÊý¾Ý¡£
ÎÒÒ²²»ÊǺÜÈ·¶¨LogstashÊÇ·ñÖ§³Öʼþ£¨ÀýÈ磬¸øÒ»¸öÕýÔÚ´òµç»°µÄÈË·¢ËÍÓʼþ»ò¶ÌÐÅÊÇ·ñ»áÔÚÓÐÏÞʱ¼äÄÚÊÕµ½´óÁ¿µÄ´íÎ󣩣¬ÄÇÊÇÁíÒ»¸öDZÔÚµÄ
Óÿò£¨ÒëÕß×¢£º±±¾©´óѧµÄÉÛάÖÒÀÏʦ¸æ½ëÎÒÃÇuse caseÓ¦¸ÃÒëΪÓÿò£©£¨Èç¹ûÕâÑùµÄÊÂÇ黹ûÓеõ½ºÜºÃÖ§³ÖÎÒ»á¸Ðµ½ºÜ³Ô¾ª£©¡£ÏëÏë¿´£¬ÕâÖÖÊÂÇéͬʱȷʵǿÁÒµØÐèÒªËÉÉ¢µÄ¼¯³É
- ÀýÈ磬ÿ´ÎÎÒÃǹرÕÒ»¸ö·Ç½Ó´¥¶©ÔĵÄʱºò»á֪ͨÏúÊÛÆµµÀ£¬ÎÒÃÇÖªµÀÕâЩÊÂÇ飬ÒòΪËü±»ÓмǼÁËÏÂÀ´¡£²»¹ýÕâЩÅÜÌâÁË¡£
˵µ½ÅÜÌ⣬ÑÝʾ³ÌÐòͬʱ°üº¬ÁËÒ»¸ö cAdvisorµÄʵÀý£¬ÕâÊÇÒ»¸ö·Ç³£ÓÐÓõŤ¾ß£¬Ëü¿ÉÒÔ¼àÊÓÄãÈÝÆ÷ÖÐ×ÊÔ´µÄʹÓÃÇé¿ö¡£Äã¿ÉÒÔÔÚÔÚÄ㹤×÷µÄÖ÷»úµÄ8080ºÅ¶Ë¿Ú·ÃÎÊËü£º
Pretty graphs for your containers
ºÃÁË¡£ÎÒÓ¦¸ÃÂíÉÏ¿ªÊ¼Ê¹ÓÃÕâ¸öÂð£¿
Èç¹ûÄãÏë²»¼ÓÈκÎÐ޸IJ¢Á¢¼´ÔÚÉú²úÖÐʹÓÃÕâ¸öÅäÖã¬ÄÇÕâ²¢²»ÊÇÄãËùÒªµÄ£¬¾¡¹ÜËü¿´ÆðÀ´¾ø¶Ô±È¡°docker
run, ¿ÉÄÜÖ®ºó»¹»áÓÃdocker logsÊÖ¶¯¼ì²é¡±ºÃºÜ¶à¡£ÐèÒª¿¼ÂÇһЩ¶îÍâµÄ¶«Î÷£¬²»·ÖÏȺó£º
1.ElasticSearch¸±±¾£ºÔÚ¶à¸ö½Úµã±£´æÊý¾ÝÀ´Ö§³ÖÈßÓà¡£ÒòΪ»á·¢ÉúÆæ¹ÖµÄÊÂÇ飬½Úµã»á¹Òµô£¬ÀíÏëÇé¿öÏÂÄãµÄ»ù´¡ÉèʩӦ¸Ã¿ÉÒÔÆ½
»¬µÄ´¦ÀíÕâÀà¹ÊÕÏ¡£Í¬Ñù£¬µ±ÄãÓжà¸öÖ÷»ú£¬ÔÚÿ¸ö½ÚµãÅäÖÃLogspoutʵÀýÀ´Ïò¡°master¡±Logstash£¨ÎÒ²»È·¶¨Ó¦¸ÃÈçºÎ´¦ÀíÕâÖÖDZÔڵĹÊ
ÕϵãµÄÈßÓࣩÀ´×ª·¢Ö÷»úµÄÈÕÖ¾ÊÇÄãÐèÒª´¦ÀíµÄÊÂÇé¡£
2.±¸·Ý£¨Backing up£©ºÍÂÖת´æ´¢ÔÚElasticSearchÖеÄÈÕÖ¾Êý¾Ý¡£ÒªÊµÏÖÕâ¸ö£¬ÎÒÈ·¶¨ClusterHQ£¨×Ô³ÆÎª¡°container
data people¡±£©½«»áÖúÄãÒ»±ÛÖ®Á¦;)
3.È·±£·ÃÎʽӿڱ»Ô¼ÊøÔÚÍøÂçºÍÓû§¼¶£¨ÑÝʾ³ÌÐò°ÑËùÓеĽӿڶ¼´ò¿ªÁË£¬ËùÒÔÈç¹ûÄãÔÚ¹«ÓÐÍøÂçÔËÐÐËüµÄʱºò£¬ËùÓÐÈ˶¼ÊÇ¿ÉÒÔ¿´µ½Ëü²¢¶ÔËü×öЩʲô£©
4.Ìí¼ÓÈÝÆ÷ÖØÆô²ßÂÔÒÔ¼°¼à¿Ø£¬À´È·±£·þÎñµÄ½¡¿µºÍÕý³£ÔËÐС£
5.ʹÓõÍȨÏÞÓû§À´ÔËÐÐÈÝÆ÷£¬ÕâÑù¿ÉÒÔÈ·±£¸üºÃµÄ°²È«ÐÔ
ËùÒÔ£¬ÔÚÏÖʵÖÐʹÓÃËüµÄʱºòÈÔÈ»ÓкܶàÊÂÇéÐèҪȥ¿¼ÂÇ£¬µ«ÎÒÏ£ÍûÎÒËù½²µÄÕâЩ¶«Î÷»á¶ÔÄãÓÐËùÆô·¢£¬¾ÍÏñÎÒ°ïÄãÔÚÄãµÄÍ·ÄÔÁ˰²×°Ò»Ð©Ð¡Ð¡³ÝÂÖ£¬Íƶ¯
ÄãÍê³ÉÕâÏ×÷¡£ÎÒÏëÏÖÔÚÒ»¸ö·Ç³£Ð¡µÄ´´Òµ¹«Ë¾¶¼ÊÇ¿ÉÒÔÔËÐÐÕâЩ¹¤¾ßµÄ£¬¶øÇÒÎÒºÜÐË·ÜÏñÕâÑùÊÀ½ç¼¶µÄ¹¤¾ß±äµÃÔ½À´Ô½¶àÁË¡£²»¹ÜÊÇÏÖÔÚ»¹Êǽ«À´£¬¶ÔÒ»¸öÍŶÓ
À´Ëµ×îÖÕËü¶¼»áʹÖÁ¹ØÖØÒªµÄ£¬ÒòΪËûÃÇÐèÒª½«Ê¹ÓÃÒ»¸öÃüÁîÀ´´¦Àí¶ą̀»úÆ÷(SRE)£¨ÒëÕß×¢£º²»ÖªµÀSREÊÇʲôÒâ˼£©,
ÕýÊÇÕâÀ๤¾ßÈÃÕâһĿ±ê±äµÃ¸ü¾ß¿ÉÐÐÐÔ¡£
½áÓï
ÅóÓÑÃÇ£¬¸Ï½ô¶¯ÊÖÈ¥¼Ç¼ÈÕÖ¾°É£¡£¡Èç¹ûÄãÓÐʲôÏë·¨»ò½¨Ò飬¸æËßÎÒ¡£ÎÒÏ£Íû¿´µ½ÔÚ¹ØÓÚÕâÀàÊÂÇéµÄºóÐøÎÄÕ£¬¿ÉÄÜÄã¾ÍÊÇÏÂÒ»¸ö¡£
|