{"componentChunkName":"component---src-templates-post-template-jsx","path":"/history/posts/2022-09-17--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"743678f9-5bc9-55a2-b96b-f19f8665ac01","html":"<h1>✔️ 먼저 알아두면 좋은 내용</h1>\n<h2>1. common plugin parameters</h2>\n<ul>\n<li>builtin plugin parameter 의 경우 prefix로 <code class=\"language-text\">@</code> 가 붙는다</li>\n</ul>\n<p><strong>1.1. <code class=\"language-text\">@type</code></strong></p>\n<ul>\n<li>specifies the plugin type</li>\n</ul>\n<p><strong>1.2. <code class=\"language-text\">@id</code></strong></p>\n<ul>\n<li>specifies the plugin id.</li>\n<li><code class=\"language-text\">in_monitor_agent</code> uses this value for<code class=\"language-text\">plugin_id</code> field</li>\n<li>버퍼, 스토리지, 로깅 및 기타 목적을 위한 경로로 사용됨</li>\n</ul>\n<p><strong>1.3. <code class=\"language-text\">@label</code></strong></p>\n<ul>\n<li>specifies the label symbol. See<a href=\"https://www.notion.so/configuration/config-file#5.-group-filter-and-output-the-label-directive\">label</a>section.</li>\n</ul>\n<p><strong>1.4. <code class=\"language-text\">@log_level</code></strong> </p>\n<ul>\n<li>specifies per plugin log level. See <a href=\"https://www.notion.so/deployment/logging#per-plugin-log\">Per Plugin Log</a> section.</li>\n</ul>\n<p>자세한 내용은 아래 참고</p>\n<p><a href=\"https://docs.fluentd.org/configuration/plugin-common-parameters#parameters-for-all-the-plugins\">Config: Common Parameters</a></p>\n<br/>\n<h2>2. wildcards, expansions and other tips</h2>\n<ul>\n<li><code class=\"language-text\">match</code> , <code class=\"language-text\">filter</code> 태그에서 사용한다.</li>\n</ul>\n<p><strong>2.1. <code class=\"language-text\">*</code></strong> </p>\n<ul>\n<li>single tag 와 매치</li>\n<li><code class=\"language-text\">a.*</code> 의 경우 <code class=\"language-text\">a.b</code> 와 매치, <code class=\"language-text\">a</code> 또는 <code class=\"language-text\">a.b.c</code> 와는 매치 안됨</li>\n</ul>\n<p><strong>2.2. `</strong>`**</p>\n<ul>\n<li>zero or more tag 와 매치</li>\n<li><code class=\"language-text\">a.**</code> 의 경우 <code class=\"language-text\">a</code>, <code class=\"language-text\">a.b</code>, <code class=\"language-text\">a.b.c</code> 와 모두 매치</li>\n</ul>\n<p><strong>2.3. 그외</strong></p>\n<ul>\n<li>\n<p>그외 regex, 값 매치 등은 아래에서 확인</p>\n<p><a href=\"https://docs.fluentd.org/configuration/config-file#wildcards-expansions-and-other-tips\">Config File Syntax</a></p>\n</li>\n</ul>\n<br/>\n<h2><strong>3. Embedding Ruby Expressions</strong></h2>\n<ul>\n<li>fluentd 1.4.0 부터 <code class=\"language-text\">#{...}</code> 표현식에 루비 코드를 넣을 수 있다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>match <span class=\"token string\">\"app.#{ENV['FLUENTD_TAG']}\"</span><span class=\"token operator\">></span>\n  @type stdout\n<span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span></code></pre></div>\n<hr>\n<h1>✔️ Directive</h1>\n<h2>1. source</h2>\n<ul>\n<li>input 에 대한 지시어</li>\n<li>사용할 input plugin에 대한 값이 <code class=\"language-text\">@type</code> 으로 명시가 되야한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Receive events from 24224/tcp</span>\n<span class=\"token comment\"># This is used by log forwarding and the fluent-cat command</span>\n<span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n  @type forward\n  port <span class=\"token number\">24224</span>\n<span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span>\n\n<span class=\"token comment\"># http://&lt;ip>:9880/myapp.access?json={\"event\":\"data\"}</span>\n<span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n  @type http\n  port <span class=\"token number\">9880</span>\n<span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span></code></pre></div>\n<h2>2. match</h2>\n<ul>\n<li>output plugin 으로 동작하며, 명시된 태그에 대해서만 output destination으로 보내진다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Receive events from 24224/tcp</span>\n<span class=\"token comment\"># This is used by log forwarding and the fluent-cat command</span>\n<span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n  @type forward\n  port <span class=\"token number\">24224</span>\n<span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span>\n\n<span class=\"token comment\"># http://&lt;ip>:9880/myapp.access?json={\"event\":\"data\"}</span>\n<span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n  @type http\n  port <span class=\"token number\">9880</span>\n<span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span>\n\n<span class=\"token comment\"># Match events tagged with \"myapp.access\" and</span>\n<span class=\"token comment\"># store them to /var/log/fluent/access.%Y-%m-%d</span>\n<span class=\"token comment\"># Of course, you can control how you partition your data</span>\n<span class=\"token comment\"># with the time_slice_format option.</span>\n<span class=\"token operator\">&lt;</span>match myapp.access<span class=\"token operator\">></span>\n  @type <span class=\"token function\">file</span>\n  path /var/log/fluent/access\n<span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span></code></pre></div>\n<h2>3. filter</h2>\n<ul>\n<li>match 와 동일한 syntax를 가지고 있고, 로그 필터에 대한 지시어이다.</li>\n<li>event flow 는 아래와 같다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/ec6a4bfdf176b286337a7b944acbde90/8ae78/001-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 7.916666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAaUlEQVQI1yWMSxKAMAhDvf8dHZ1q7b/0py5jwUUGSF5YqHa08cBHgjYexkWwV9pA7ffMXvT7F/uXC9DWI6QCn0g4mrpskGzJpQmYqMnDTem5VxFnUqhDJt8uZihtcU7WhoSYf457637gA/pxlxte/OxfAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/ec6a4bfdf176b286337a7b944acbde90/d9199/001-01.png\"\n        srcset=\"/devHistoryBlog/static/ec6a4bfdf176b286337a7b944acbde90/8ff5a/001-01.png 240w,\n/devHistoryBlog/static/ec6a4bfdf176b286337a7b944acbde90/e85cb/001-01.png 480w,\n/devHistoryBlog/static/ec6a4bfdf176b286337a7b944acbde90/d9199/001-01.png 960w,\n/devHistoryBlog/static/ec6a4bfdf176b286337a7b944acbde90/8ae78/001-01.png 1096w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># http://this.host:9880/myapp.access?json={\"event\":\"data\"}</span>\n<span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n  @type http\n  port <span class=\"token number\">9880</span>\n<span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span>\n\n<span class=\"token operator\">&lt;</span>filter myapp.access<span class=\"token operator\">></span>\n  @type record_transformer\n  <span class=\"token operator\">&lt;</span>record<span class=\"token operator\">></span>\n    host_param <span class=\"token string\">\"#{Socket.gethostname}\"</span>\n  <span class=\"token operator\">&lt;</span>/record<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n\n<span class=\"token operator\">&lt;</span>match myapp.access<span class=\"token operator\">></span>\n  @type <span class=\"token function\">file</span>\n  path /var/log/fluent/access\n<span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span></code></pre></div>\n<p><strong>✔️ 위 예제 동작 플로우</strong></p>\n<ul>\n<li>input 으로 tag: myapp.access, data: {”event”: “data”} 이벤트를 받고,</li>\n<li>첫번째 filter인 record<em>transformer 는 `“host</em>param”` 필드를 이벤트에 추가한다.</li>\n<li>그럼 <code class=\"language-text\">{&quot;event&quot;:&quot;data&quot;,&quot;host_param&quot;:&quot;webserver1&quot;}</code> 값이 ouput plugin 으로 보내져 파일로 출력하게 된다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/f2f8dc70a72607c91067758eb1b40258/f32b7/001-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 34.583333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAzElEQVQoz31R0Q6DIBDj/79QExNnsuiDOhVEQIUbPefijK5JcwSa3l0RIQQ6E/A+0LKszHUFPZ/396P2CEE3mCZLWfakPC+5pmlBj6Iia92P4Zmi61UUzeTcRpzneWHDsmyobnqqqiaypbruSCn9aRkuBxFJUpCMon18TKC1uRv82xBADDu995uh1pbG0bARhMY4zuxqLQA5SqmpfQ2s33NGI1QBZ4hRN4a/GQFSjpyrjrEMwxgHmkhFsuHVWsefvLpHY2wCIlPkDeL+DQ4cJZdwVmywAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/f2f8dc70a72607c91067758eb1b40258/d9199/001-02.png\"\n        srcset=\"/devHistoryBlog/static/f2f8dc70a72607c91067758eb1b40258/8ff5a/001-02.png 240w,\n/devHistoryBlog/static/f2f8dc70a72607c91067758eb1b40258/e85cb/001-02.png 480w,\n/devHistoryBlog/static/f2f8dc70a72607c91067758eb1b40258/d9199/001-02.png 960w,\n/devHistoryBlog/static/f2f8dc70a72607c91067758eb1b40258/f32b7/001-02.png 1136w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<hr>\n<h1>✔️ 서비스에 설정한 fluentd daemonset config 설정 분석</h1>\n<ul>\n<li>\n<p>전체 설정 내용</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">data:\n  fluent.conf: <span class=\"token operator\">|</span>\n    <span class=\"token operator\">&lt;</span>system<span class=\"token operator\">></span>\n      workers <span class=\"token number\">1</span>\n      @log_level info\n    <span class=\"token operator\">&lt;</span>/system<span class=\"token operator\">></span>\n    @include input-kubernetes.conf\n    @include filter-kubernetes.conf\n    <span class=\"token operator\">&lt;</span>match **<span class=\"token operator\">></span>\n      @type copy\n      <span class=\"token operator\">&lt;</span>store<span class=\"token operator\">></span>\n        @type                         kafka2\n        @id                           out_kafka\n        brokers                       logis-kafka.dev.kakaoi.io:9092\n        max_send_retries              <span class=\"token number\">10</span>\n        required_acks                 <span class=\"token number\">1</span>\n\n        default_topic                 xoauth-dev\n    \n        exception_backup              <span class=\"token boolean\">false</span>\n        compression_codec             <span class=\"token function\">gzip</span>\n    \n        <span class=\"token operator\">&lt;</span>format<span class=\"token operator\">></span>\n          @type                       json\n        <span class=\"token operator\">&lt;</span>/format<span class=\"token operator\">></span>\n\n        <span class=\"token operator\">&lt;</span>buffer topic,tag<span class=\"token operator\">></span>\n          @type                       <span class=\"token function\">file</span>\n          path                        /var/log/td-agent/buffer/td\n          flush_interval              5s\n          chunk_limit_size            16M\n          queue_limit_length          <span class=\"token number\">32</span>\n          retry_forever               <span class=\"token boolean\">true</span>\n        <span class=\"token operator\">&lt;</span>/buffer<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>/store<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span>\n\n  input-kubernetes.conf: <span class=\"token operator\">|</span>\n    <span class=\"token comment\"># Prevent fluentd from handling records containing its own logs. Otherwise</span>\n    <span class=\"token comment\"># it can lead to an infinite loop, when error in sending one message generates</span>\n    <span class=\"token comment\"># another message which also fails to be sent and so on.</span>\n    <span class=\"token operator\">&lt;</span>match fluent.**<span class=\"token operator\">></span>\n      @type                           null\n    <span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n      @type                           <span class=\"token function\">tail</span>\n      @id                             in_tail_container_logs\n      path                            /var/log/containers/xoauth*.log\n      pos_file                        /var/log/fluentd-containers.log.pos\n      tag                             kubernetes.*\n      read_from_head                  <span class=\"token string\">\"#{ENV['FLUENTD_INPUT_READ_FROM_HEAD'] || 'false'}\"</span>\n      limit_recently_modified         <span class=\"token string\">\"#{ENV['LIMIT_RECENTLY_MODIFIED'] || '120m'}\"</span>\n      rotate_wait                     <span class=\"token number\">0</span>\n      enable_stat_watcher             <span class=\"token boolean\">false</span>\n      <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n        @type                         regexp\n        expression                    /^<span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>time<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>^ <span class=\"token punctuation\">]</span>+<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>stream<span class=\"token operator\">></span>stdout<span class=\"token operator\">|</span>stderr<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>flags<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>^ <span class=\"token punctuation\">]</span>+<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>message<span class=\"token operator\">></span>.*<span class=\"token punctuation\">)</span>$/\n      <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span>\n\n  filter-kubernetes.conf: <span class=\"token operator\">|</span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           kubernetes_metadata\n      @id                             filter_kube_metadata\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           record_modifier\n      tag                             <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"container_name\").gsub('-'<span class=\"token operator\">,</span> '.')}</span>\n      <span class=\"token operator\">&lt;</span>record<span class=\"token operator\">></span>\n        @timestamp                    <span class=\"token variable\">${(Time.at(time) + (60*60*9)).strftime('<span class=\"token operator\">%</span>Y-<span class=\"token operator\">%</span>m-<span class=\"token operator\">%</span>dT<span class=\"token operator\">%</span>H<span class=\"token operator\">:</span><span class=\"token operator\">%</span>M<span class=\"token operator\">:</span><span class=\"token operator\">%</span>S.<span class=\"token operator\">%</span>L+09<span class=\"token operator\">:</span>00')}</span>\n        cluster_name                  <span class=\"token string\">\"xoauth-dev\"</span>\n        <span class=\"token function\">hostname</span>                      <span class=\"token string\">\"#{ENV['K8S_NODE_NAME']}\"</span>\n        container_image               <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"container_image\")}</span>\n        pod_name                      <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"pod_name\")}</span>\n      <span class=\"token operator\">&lt;</span>/record<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           parser\n      key_name                        message\n      reserve_data                    <span class=\"token boolean\">true</span>\n      remove_key_name_field           <span class=\"token boolean\">true</span>\n      <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n        @type                         json\n      <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           record_transformer\n      remove_keys                     $.kubernetes\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n</li>\n</ul>\n<h2>1. Input에 대한 설정</h2>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">input-kubernetes.conf: <span class=\"token operator\">|</span>\n    <span class=\"token operator\">&lt;</span>match fluent.**<span class=\"token operator\">></span>\n      @type                           null\n    <span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n      @type                           <span class=\"token function\">tail</span>\n      @id                             in_tail_container_logs\n      path                            /var/log/containers/xoauth*.log\n      pos_file                        /var/log/fluentd-containers.log.pos\n      tag                             kubernetes.*\n      read_from_head                  <span class=\"token string\">\"#{ENV['FLUENTD_INPUT_READ_FROM_HEAD'] || 'false'}\"</span>\n      limit_recently_modified         <span class=\"token string\">\"#{ENV['LIMIT_RECENTLY_MODIFIED'] || '120m'}\"</span>\n      rotate_wait                     <span class=\"token number\">0</span>\n      enable_stat_watcher             <span class=\"token boolean\">false</span>\n      <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n        @type                         regexp\n        expression                    /^<span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>time<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>^ <span class=\"token punctuation\">]</span>+<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>stream<span class=\"token operator\">></span>stdout<span class=\"token operator\">|</span>stderr<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>flags<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>^ <span class=\"token punctuation\">]</span>+<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>message<span class=\"token operator\">></span>.*<span class=\"token punctuation\">)</span>$/\n      <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span></code></pre></div>\n<h3>1.1. 로그 input</h3>\n<ul>\n<li>/var/log/containers/xoauth*.log 파일을 타겟으로 tail 을 사용하여 input을 수행한다.</li>\n<li>해당 이벤트에 kubernetes.* 태그를 붙인다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>source<span class=\"token operator\">></span>\n  @type                           <span class=\"token function\">tail</span>\n  @id                             in_tail_container_logs\n  path                            /var/log/containers/xoauth*.log\n  pos_file                        /var/log/fluentd-containers.log.pos\n  tag                             kubernetes.*\n  read_from_head                  <span class=\"token string\">\"#{ENV['FLUENTD_INPUT_READ_FROM_HEAD'] || 'false'}\"</span>\n  limit_recently_modified         <span class=\"token string\">\"#{ENV['LIMIT_RECENTLY_MODIFIED'] || '120m'}\"</span>\n  rotate_wait                     <span class=\"token number\">0</span>\n  enable_stat_watcher             <span class=\"token boolean\">false</span>\n  <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n    @type                         regexp\n    expression                    /^<span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>time<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>^ <span class=\"token punctuation\">]</span>+<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>stream<span class=\"token operator\">></span>stdout<span class=\"token operator\">|</span>stderr<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>flags<span class=\"token operator\">></span><span class=\"token punctuation\">[</span>^ <span class=\"token punctuation\">]</span>+<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>?<span class=\"token operator\">&lt;</span>message<span class=\"token operator\">></span>.*<span class=\"token punctuation\">)</span>$/\n  <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/source<span class=\"token operator\">></span></code></pre></div>\n<ul>\n<li>실제 들어온 이벤트의 레코드 데이터는 아래와 같다 (/var/log/containers/xoauth*.log 파일 포맷)</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token number\">2022</span>-08-23T16:20:02.313036458+09:00 stdout F <span class=\"token punctuation\">{</span><span class=\"token string\">\"@timestamp\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"2022-08-23T07:20:02.312+00:00\"</span>,<span class=\"token string\">\"@version\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"1\"</span>,<span class=\"token string\">\"message\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"Running with Spring Boot v2.2.0.RELEASE, Spring v5.2.0.RELEASE\"</span>,<span class=\"token string\">\"logger_name\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"com.kakao.xoauth.XoauthApplication\"</span>,<span class=\"token string\">\"thread_name\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"main\"</span>,<span class=\"token string\">\"level\"</span><span class=\"token builtin class-name\">:</span><span class=\"token string\">\"DEBUG\"</span>,<span class=\"token string\">\"level_value\"</span>:10000<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>\n<p><code class=\"language-text\">&lt;parse&gt;</code> 의 regexp 를 통해 아래와 같이 파싱이 된다.</p>\n<ul>\n<li>regexp 의 결과값을 확인할 수 있는 사이트 : <a href=\"http://fluentular.herokuapp.com/\">http://fluentular.herokuapp.com</a></li>\n</ul>\n</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/6052f/001-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 42.083333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAzElEQVQoz5WS2QrEIAxF/f9/lIJd3uy+bxlOIKXDdGAmcLBeY7ymurIsJU1TybJMvPdS17UQ53l+8Eu4qqokSRJpmkaO45B933WEe1DQ9G+Q43BE0XVdZZommedZ6fteQgh6EHRdd609wV5quHEcdfPdiY3DMGgiLMvytv4U6pAe0j8cUHzbNj2J0VpgmP4Ea+S4tm31R+Amxnht/Ie7Ce0hhbgSveJ6OAX7tmsb1jODHDR1iEBBTuD52BMqikLyPFfQmKMz59vmBjqFXyhXbZH8VWj7AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/d9199/001-03.png\"\n        srcset=\"/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/8ff5a/001-03.png 240w,\n/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/e85cb/001-03.png 480w,\n/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/d9199/001-03.png 960w,\n/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/07a9c/001-03.png 1440w,\n/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/29114/001-03.png 1920w,\n/devHistoryBlog/static/193efcf311a7efcc41c6851eab2594dd/6052f/001-03.png 2030w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>1.2. fluentd 로그 제거</h3>\n<ul>\n<li>fluentd.** tag로 들어온 이벤트는 모두 버린다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>match fluent.**<span class=\"token operator\">></span>\n  @type                           null\n<span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span></code></pre></div>\n<br/>\n<h2>2. Filter에 대한 설정</h2>\n<p><strong>✔️ 전체 코드</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">filter-kubernetes.conf: <span class=\"token operator\">|</span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           kubernetes_metadata\n      @id                             filter_kube_metadata\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           record_modifier\n      tag                             <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"container_name\").gsub('-'<span class=\"token operator\">,</span> '.')}</span>\n      <span class=\"token operator\">&lt;</span>record<span class=\"token operator\">></span>\n        @timestamp                    <span class=\"token variable\">${(Time.at(time) + (60*60*9)).strftime('<span class=\"token operator\">%</span>Y-<span class=\"token operator\">%</span>m-<span class=\"token operator\">%</span>dT<span class=\"token operator\">%</span>H<span class=\"token operator\">:</span><span class=\"token operator\">%</span>M<span class=\"token operator\">:</span><span class=\"token operator\">%</span>S.<span class=\"token operator\">%</span>L+09<span class=\"token operator\">:</span>00')}</span>\n        cluster_name                  <span class=\"token string\">\"xoauth-dev\"</span>\n        <span class=\"token function\">hostname</span>                      <span class=\"token string\">\"#{ENV['K8S_NODE_NAME']}\"</span>\n        container_image               <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"container_image\")}</span>\n        pod_name                      <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"pod_name\")}</span>\n      <span class=\"token operator\">&lt;</span>/record<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           parser\n      key_name                        message\n      reserve_data                    <span class=\"token boolean\">true</span>\n      remove_key_name_field           <span class=\"token boolean\">true</span>\n      <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n        @type                         json\n      <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span>\n    <span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n      @type                           record_transformer\n      remove_keys                     $.kubernetes\n    <span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<h3>2.1. K8S Metadata 정보 포함시키기</h3>\n<ul>\n<li><code class=\"language-text\">kubernetes_metadata</code> 타입의 필터로 인해 해당 로그 레코드를 내보낸 컨테이너에 대한 기본 메타데이터(hostname, pod<em>name, container</em>name 등) 가 해당 레코드에 포함된다.</li>\n<li>해당 필터는 fluend 에 내장된 플러그인은 아니고, <code class=\"language-text\">fluent-plugin-kubernetes_metadata_filter</code> 를 설치해야 사용할 수 있다. (<a href=\"https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter\">https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter</a>)</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n  @type                           kubernetes_metadata\n  @id                             filter_kube_metadata\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<p><strong>✔️ fluent-plugin-kubernetes<em>metadata</em>filter 설치는 언제?</strong></p>\n<ul>\n<li>daemonset으로 설치된 fluentd pod 에서 Gemfile을 확인해보니 해당 플러그인이 포함되어 있었다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/db3cbcc11dad1ee8e0d55256f6e1fb5d/53639/001-04.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 49.16666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABTklEQVQoz4WS266CUAxECRIUEsALARHFewygQVDB+P//VbOacF6Mnoem7N12OjMbY7lcyuVykcViIb7vy3g8lvl8rnkymUgQBDKbzSQMQ/E8TwzD+B2bzUYej4es12sFmE6nwhIywZI4jiWKIrEs63/A6/Uqt9tN9vu9MiGvVitdsN1u9QxjAFk0GAx+AzJMM2BEzw4L0jSVqqo0I7ksS7ViNBp9B6Q5SRKVBjALGO6B67qWLMu0pygKud/v0rat7HY7rX8Ank4nfRQygzQiEW8Bf71efzZgDYyxg4UQ+ACkiLzep+PxqBLxj29YUSNYSL/rut8lw44hWPS/EGDcEV3XaQ2w8/mscmE9HA7Ftm1xHEeDbwXM81x9appG5TD0fD71jj+AAJRFBKxZjAXYhCoU8qAKSBEGBP4dDgdlBkvOSGSQM0x6aTAyTfND8hsT7fxPGQXvFwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 04\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/db3cbcc11dad1ee8e0d55256f6e1fb5d/d9199/001-04.png\"\n        srcset=\"/devHistoryBlog/static/db3cbcc11dad1ee8e0d55256f6e1fb5d/8ff5a/001-04.png 240w,\n/devHistoryBlog/static/db3cbcc11dad1ee8e0d55256f6e1fb5d/e85cb/001-04.png 480w,\n/devHistoryBlog/static/db3cbcc11dad1ee8e0d55256f6e1fb5d/d9199/001-04.png 960w,\n/devHistoryBlog/static/db3cbcc11dad1ee8e0d55256f6e1fb5d/53639/001-04.png 1358w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>✔️ <strong>input/output 에 대한 예제</strong></p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/966c1/001-05.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 86.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAAByUlEQVQ4y41U2XKCQBDkPakcqKDIIYcXgqgoaGKZVI7//6TJ9MhS3vGha2aX3WZ6ekBrOxHtEZLlDajj9gWmHVKj7ZFuutTs9O6ER1ownFK2fKc0f6Ni+01TzvvxnKLxjHqDlGx/REY3uAstyycN1eASohOMJe/2hpL7TOiEsRxUF66hJjTtQOR2XJaNnKUaXZ8eXwx6eG5JfNLbd0MDEapDHzsMS3oYkW44NV4N+zJa59AgSfUszkqJLu9hHzJumdCyzvuoedGE0sWGxtOVIGLyXj8R4Bkg+ckagLLTXmowAE7DAERUpy4iV/CipCbCWUARHrkMwjgraLH+oIQrRbWQHs9KClm+LW5PpceYy0McunvgckiDyYJyJpwwSbn9oXm5kzyZryViTjGT6JspU3A8e2eEw3RJ690vzVZbIcg3nzLoqDCqAJMgsVlVB/KLhEiCUUYbJpwXO8qYtHj/EoNG/CKRz0ArsEal6gu6KhlNHya5jA/gVtXgEr4YZYwTVIaxMej9dUI+BGPQSwBE2JN5q+Q1DuK/kvFWGICIytTYnI7FpZ/B2RziEsrfSxrXuZJ9i/Di38aUhb//bvnf12DoZpWLtPuB83+xMdJoHZd7egAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 05\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/d9199/001-05.png\"\n        srcset=\"/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/8ff5a/001-05.png 240w,\n/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/e85cb/001-05.png 480w,\n/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/d9199/001-05.png 960w,\n/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/07a9c/001-05.png 1440w,\n/devHistoryBlog/static/e638e9f47d1756d2582376b943ef4375/966c1/001-05.png 1694w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>2.2. 이벤트 레코드에 필드 추가하기</h3>\n<ul>\n<li>record_modifier 타입의 필터를 사용하여 필드를 추가/수정 할 수 있다.</li>\n<li>추가/수정되는 필드는 <code class=\"language-text\">&lt;record&gt;</code> 내에 정의 해주면 된다.</li>\n<li>기본 내장된 플러그인은 아니며, <code class=\"language-text\">fluent-plugin-record-modifier</code> 플러그인을 설치해줘야 한다. (<a href=\"https://github.com/repeatedly/fluent-plugin-record-modifier\">https://github.com/repeatedly/fluent-plugin-record-modifier</a>)</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n  @type                           record_modifier\n  tag                             <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"container_name\").gsub('-'<span class=\"token operator\">,</span> '.')}</span>\n  <span class=\"token operator\">&lt;</span>record<span class=\"token operator\">></span>\n    @timestamp                    <span class=\"token variable\">${(Time.at(time) + (60*60*9)).strftime('<span class=\"token operator\">%</span>Y-<span class=\"token operator\">%</span>m-<span class=\"token operator\">%</span>dT<span class=\"token operator\">%</span>H<span class=\"token operator\">:</span><span class=\"token operator\">%</span>M<span class=\"token operator\">:</span><span class=\"token operator\">%</span>S.<span class=\"token operator\">%</span>L+09<span class=\"token operator\">:</span>00')}</span>\n    cluster_name                  <span class=\"token string\">\"xoauth-dev\"</span>\n    <span class=\"token function\">hostname</span>                      <span class=\"token string\">\"#{ENV['K8S_NODE_NAME']}\"</span>\n    container_image               <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"container_image\")}</span>\n    pod_name                      <span class=\"token variable\">${record.dig(\"kubernetes\"<span class=\"token operator\">,</span> \"pod_name\")}</span>\n  <span class=\"token operator\">&lt;</span>/record<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<p><strong>✔️ fluent-plugin-record-modifier 설치는 언제?</strong></p>\n<ul>\n<li>위 k8s metadata 필터와 동일하게 daemonset pod 의 Gemfile 에 명시가 되어있다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/439a3524ae30b1fd3d6179cdee6ce244/b1001/001-06.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 7.916666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAf0lEQVQI1z2MsQqFIABFQyhoDYJCjZqksSF1k/Av+oGGCvT/hxPP4Q2He85yqxAC1lqcc8QYC/u+cxwH27bhvWddV5ZlQWuNMabQdR193zNNE8MwMM9z8SqlxHVdPM/Dfd+871s651z8PE/GcURKWQ6UUrRtixCCuq5pmua/Pz50aD7OuGu0YAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 06\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/439a3524ae30b1fd3d6179cdee6ce244/d9199/001-06.png\"\n        srcset=\"/devHistoryBlog/static/439a3524ae30b1fd3d6179cdee6ce244/8ff5a/001-06.png 240w,\n/devHistoryBlog/static/439a3524ae30b1fd3d6179cdee6ce244/e85cb/001-06.png 480w,\n/devHistoryBlog/static/439a3524ae30b1fd3d6179cdee6ce244/d9199/001-06.png 960w,\n/devHistoryBlog/static/439a3524ae30b1fd3d6179cdee6ce244/b1001/001-06.png 1380w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p><strong>✔️ record_transformer 와의 차이점은?</strong></p>\n<ul>\n<li>속도가 더 빠르다고 한다. 그외의 내용은 깃헙을 참고한다.</li>\n</ul>\n<h3>2.3. 서비스 Application에서 출력한 로그 파싱</h3>\n<ul>\n<li><code class=\"language-text\">parser</code> 타입의 필터는 key_name에 명시된 필드를 파싱하고 이벤트 레코드를 파싱된 결과로 변경한다.</li>\n<li>위 input의 <code class=\"language-text\">&lt;source&gt;</code> 태그에서 message 키에 매핑된 application 로그를 파싱한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n  @type                           parser\n  key_name                        message\n  reserve_data                    <span class=\"token boolean\">true</span>\n  remove_key_name_field           <span class=\"token boolean\">true</span>\n  <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n    @type                         json\n  <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<p><strong>✔️ reserve_data</strong></p>\n<ul>\n<li>파싱된 결과에서 원래 key-value 쌍을 유지한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>filter foo.bar<span class=\"token operator\">></span>\n  @type parser\n  key_name log\n  reserve_data <span class=\"token boolean\">true</span>\n  <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n    @type json\n  <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/00e09/001-07.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 34.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABB0lEQVQoz5VR2W7DMAzL///khrZJcye+z4ST1CHI42aAsE1YlEg3znkobWCdw7YraDoba2Gtg1IapRT8ZZ3nKWhiSjAkagWBxNx118bBh4gQE2LKsjOYS7mg1ONCLpWaVzTGejy7Ht/PDv20oBsmtP2I13sgfkD7HvFoe7zo/B5nfD1adP0kb+dNYVp2jPMGTTo+ZjQhRngf4G7wIQgXaZpaP51L/QVFwFym/QJNW48DB1vWxkheLCR2BVayTDnjv6txlAeP3JOdVRlM6/6xsWwYphXzqoRje+uu5S1zYjEkuBsC5dzwZOO8UvGChYpmKl42FqVCgvMR3JQhAv6zB8pLPuoG/qgfz0UeALzdiZEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 07\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/d9199/001-07.png\"\n        srcset=\"/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/8ff5a/001-07.png 240w,\n/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/e85cb/001-07.png 480w,\n/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/d9199/001-07.png 960w,\n/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/07a9c/001-07.png 1440w,\n/devHistoryBlog/static/5d28144d91159a4e450fa3d9264dce4c/00e09/001-07.png 1854w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p><strong>✔️ remove<em>key</em>name_field</strong></p>\n<ul>\n<li>파싱에 성공하면 key_name에 해당하는 필드를 지운다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>filter foo.bar<span class=\"token operator\">></span>\n  @type parser\n  key_name log\n  reserve_data <span class=\"token boolean\">true</span>\n  remove_key_name_field <span class=\"token boolean\">true</span>\n  <span class=\"token operator\">&lt;</span>parse<span class=\"token operator\">></span>\n    @type json\n  <span class=\"token operator\">&lt;</span>/parse<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/6fa81/001-08.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 16.249999999999996%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAd0lEQVQI15WMWw4DIQhF3f9K2/GJ4GO0ya1o2/+anFxAOCYzQ2ERJCJQZkgpECnIq55z4p9niAt8yrA+IRLDR4ILafOt7afXf82w9qV2tD5Q+71Y2W6M+YLRpaf1eFzuHHsl4nJh55nFDUtdooayZCo6wvETq/ANTR/nrsCdbAEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 08\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/d9199/001-08.png\"\n        srcset=\"/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/8ff5a/001-08.png 240w,\n/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/e85cb/001-08.png 480w,\n/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/d9199/001-08.png 960w,\n/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/07a9c/001-08.png 1440w,\n/devHistoryBlog/static/62abac888cbac04b8d93496b763175a5/6fa81/001-08.png 1856w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>2.4. 불필요한 K8S Metadata 정보 제거</h3>\n<ul>\n<li>위 record<em>modifier filter에서 필요한 kubernetes 메타 정보만 새로 추가했으므로, kubernetes</em>metadata filter에서 추가한 메타정보를 모두 삭제한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>filter kubernetes.**<span class=\"token operator\">></span>\n  @type                           record_transformer\n  remove_keys                     $.kubernetes\n<span class=\"token operator\">&lt;</span>/filter<span class=\"token operator\">></span></code></pre></div>\n<ul>\n<li>위 필터를 추가하지 않으면 불필요한 kubernetes 메타정보들이 표시된다.</li>\n<li>따라서 kubernetes_metadata filter 에서 생성된 메타정보 중, 필요한 정보만 새로운 key로 이벤트 레코드에 추가해주는것이 좋다.</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/f51c0/001-09.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 31.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAwElEQVQY03WRCw6EMAhEvf9Z1dKPWovtLGA1rps1mUgtvAEcfAjwPoC8RymM1iBqt47jgHNOcjxCjCAik55TSrdCiPYeHHkp8Fi3LMX1W7WZyThO0DwWeJVvKr3nR+4VG3CaSRwStrzfoDOhYe/AZVkt5l78T4OOq9AQk3RTuhjVRgaYWSZQw4AoI+v9ey1PGZDo3M++F+miA+sJ1FhBzAdyzmaghdfobw3UgVqoz+mODmy2t2ma7UeYqXXYAe1XH2r11XDUD/i6AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 09\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/d9199/001-09.png\"\n        srcset=\"/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/8ff5a/001-09.png 240w,\n/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/e85cb/001-09.png 480w,\n/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/d9199/001-09.png 960w,\n/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/07a9c/001-09.png 1440w,\n/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/29114/001-09.png 1920w,\n/devHistoryBlog/static/27ef619477b99d6d6e557d5980c50b95/f51c0/001-09.png 2994w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br/>\n<h2>3. Output에 대한 설정</h2>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">&lt;</span>match **<span class=\"token operator\">></span>\n  @type copy\n  <span class=\"token operator\">&lt;</span>store<span class=\"token operator\">></span>\n    @type                         kafka2\n    @id                           out_kafka\n    brokers                       logis-kafka.dev.kakaoi.io:9092\n    max_send_retries              <span class=\"token number\">10</span>\n    required_acks                 <span class=\"token number\">1</span>\n\n    default_topic                 xoauth-dev\n\n    exception_backup              <span class=\"token boolean\">false</span>\n    compression_codec             <span class=\"token function\">gzip</span>\n\n    <span class=\"token operator\">&lt;</span>format<span class=\"token operator\">></span>\n      @type                       json\n    <span class=\"token operator\">&lt;</span>/format<span class=\"token operator\">></span>\n\n    <span class=\"token operator\">&lt;</span>buffer topic,tag<span class=\"token operator\">></span>\n      @type                       <span class=\"token function\">file</span>\n      path                        /var/log/td-agent/buffer/td\n      flush_interval              5s\n      chunk_limit_size            16M\n      queue_limit_length          <span class=\"token number\">32</span>\n      retry_forever               <span class=\"token boolean\">true</span>\n    <span class=\"token operator\">&lt;</span>/buffer<span class=\"token operator\">></span>\n  <span class=\"token operator\">&lt;</span>/store<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>/match<span class=\"token operator\">></span></code></pre></div>","fields":{"tagSlugs":["/tags/fluentd/"],"slug":"/history/posts/2022-09-17--001"},"frontmatter":{"title":"Fluentd 설정파일 분석","tags":["fluentd"],"date":"2022-09-17","description":""}}},"pageContext":{"slug":"/history/posts/2022-09-17--001"}},"staticQueryHashes":[]}