[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EF1CS7NH8NQAGN4T70T1V7":3,"skill-same:01M6EF1CS7NH8NQAGN4T70T1V7":51},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EF1CS7NH8NQAGN4T70T1V7","fluentd",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Ffluentd\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# Fluentd\n\n## Overview\n\nSet up Fluentd as a unified logging layer to collect, filter, transform, and forward logs from applications, containers, and infrastructure to various backends. Covers configuration, plugins, Kubernetes DaemonSet deployment, and buffering strategies.\n\n## Instructions\n\n### Task A: Basic Fluentd Configuration\n\n```xml\n\u003C!-- fluent.conf — Collect application logs and forward to Elasticsearch -->\n\u003Csource>\n  @type tail\n  path \u002Fvar\u002Flog\u002Fapp\u002F*.log\n  pos_file \u002Fvar\u002Flog\u002Ffluentd\u002Fapp.log.pos\n  tag app.logs\n  \u003Cparse>\n    @type json\n    time_key timestamp\n    time_format %Y-%m-%dT%H:%M:%S.%NZ\n  \u003C\u002Fparse>\n\u003C\u002Fsource>\n\n\u003Csource>\n  @type tail\n  path \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n  pos_file \u002Fvar\u002Flog\u002Ffluentd\u002Fnginx.log.pos\n  tag nginx.access\n  \u003Cparse>\n    @type regexp\n    expression \u002F^(?\u003Cremote>[^ ]*) - (?\u003Cuser>[^ ]*) \\[(?\u003Ctime>[^\\]]*)\\] \"(?\u003Cmethod>\\S+) (?\u003Cpath>\\S+) (?\u003Cprotocol>\\S+)\" (?\u003Cstatus>\\d+) (?\u003Csize>\\d+)\u002F\n    time_format %d\u002F%b\u002F%Y:%H:%M:%S %z\n  \u003C\u002Fparse>\n\u003C\u002Fsource>\n\n\u003Cfilter app.logs>\n  @type record_transformer\n  \u003Crecord>\n    hostname \"#{Socket.gethostname}\"\n    environment production\n  \u003C\u002Frecord>\n\u003C\u002Ffilter>\n\n\u003Cfilter app.logs>\n  @type grep\n  \u003Cexclude>\n    key level\n    pattern \u002F^debug$\u002F\n  \u003C\u002Fexclude>\n\u003C\u002Ffilter>\n\n\u003Cmatch app.logs nginx.access>\n  @type elasticsearch\n  host elasticsearch\n  port 9200\n  index_name fluentd-${tag}-%Y.%m.%d\n  \u003Cbuffer tag, time>\n    @type file\n    path \u002Fvar\u002Flog\u002Ffluentd\u002Fbuffer\u002Fes\n    timekey 1h\n    timekey_wait 10m\n    flush_interval 30s\n    chunk_limit_size 8MB\n    total_limit_size 2GB\n    retry_max_interval 30\n    overflow_action block\n  \u003C\u002Fbuffer>\n\u003C\u002Fmatch>\n```\n\n### Task B: Multi-Output Routing\n\n```xml\n\u003C!-- fluent.conf — Route logs to different destinations based on tag -->\n\u003Cmatch error.**>\n  @type copy\n  \u003Cstore>\n    @type elasticsearch\n    host elasticsearch\n    port 9200\n    index_name errors-%Y.%m.%d\n    \u003Cbuffer time>\n      timekey 1d\n      flush_interval 10s\n    \u003C\u002Fbuffer>\n  \u003C\u002Fstore>\n  \u003Cstore>\n    @type slack\n    webhook_url https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FT00\u002FB00\u002FXXXX\n    channel ops-errors\n    message \"Error from %s: %s\"\n    message_keys tag,message\n  \u003C\u002Fstore>\n\u003C\u002Fmatch>\n\n\u003Cmatch audit.**>\n  @type s3\n  aws_key_id \"#{ENV['AWS_ACCESS_KEY_ID']}\"\n  aws_sec_key \"#{ENV['AWS_SECRET_ACCESS_KEY']}\"\n  s3_bucket audit-logs-production\n  s3_region us-east-1\n  path logs\u002F%Y\u002F%m\u002F%d\u002F\n  \u003Cbuffer time>\n    @type file\n    path \u002Fvar\u002Flog\u002Ffluentd\u002Fbuffer\u002Fs3\n    timekey 3600\n    timekey_wait 10m\n    chunk_limit_size 256MB\n  \u003C\u002Fbuffer>\n  \u003Cformat>\n    @type json\n  \u003C\u002Fformat>\n\u003C\u002Fmatch>\n\n\u003Cmatch **>\n  @type elasticsearch\n  host elasticsearch\n  port 9200\n  index_name logs-%Y.%m.%d\n\u003C\u002Fmatch>\n```\n\n### Task C: Kubernetes DaemonSet Deployment\n\n```yaml\n# fluentd-daemonset.yml — Fluentd DaemonSet for Kubernetes log collection\napiVersion: apps\u002Fv1\nkind: DaemonSet\nmetadata:\n  name: fluentd\n  namespace: logging\n  labels:\n    app: fluentd\nspec:\n  selector:\n    matchLabels:\n      app: fluentd\n  template:\n    metadata:\n      labels:\n        app: fluentd\n    spec:\n      serviceAccountName: fluentd\n      tolerations:\n        - key: node-role.kubernetes.io\u002Fcontrol-plane\n          effect: NoSchedule\n      containers:\n        - name: fluentd\n          image: fluent\u002Ffluentd-kubernetes-daemonset:v1.16-debian-elasticsearch8-1\n          env:\n            - name: FLUENT_ELASTICSEARCH_HOST\n              value: \"elasticsearch.logging.svc.cluster.local\"\n            - name: FLUENT_ELASTICSEARCH_PORT\n              value: \"9200\"\n            - name: FLUENT_ELASTICSEARCH_INDEX_NAME\n              value: \"k8s-logs\"\n          resources:\n            limits:\n              memory: 512Mi\n            requests:\n              cpu: 100m\n              memory: 256Mi\n          volumeMounts:\n            - name: varlog\n              mountPath: \u002Fvar\u002Flog\n            - name: containers\n              mountPath: \u002Fvar\u002Flib\u002Fdocker\u002Fcontainers\n              readOnly: true\n            - name: config\n              mountPath: \u002Ffluentd\u002Fetc\u002Ffluent.conf\n              subPath: fluent.conf\n      volumes:\n        - name: varlog\n          hostPath:\n            path: \u002Fvar\u002Flog\n        - name: containers\n          hostPath:\n            path: \u002Fvar\u002Flib\u002Fdocker\u002Fcontainers\n        - name: config\n          configMap:\n            name: fluentd-config\n```\n\n```yaml\n# fluentd-configmap.yml — Kubernetes-aware Fluentd configuration\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: fluentd-config\n  namespace: logging\ndata:\n  fluent.conf: |\n    \u003Csource>\n      @type tail\n      path \u002Fvar\u002Flog\u002Fcontainers\u002F*.log\n      pos_file \u002Fvar\u002Flog\u002Ffluentd-containers.log.pos\n      tag kubernetes.*\n      \u003Cparse>\n        @type cri\n      \u003C\u002Fparse>\n    \u003C\u002Fsource>\n\n    \u003Cfilter kubernetes.**>\n      @type kubernetes_metadata\n      @id filter_kube_metadata\n    \u003C\u002Ffilter>\n\n    \u003Cfilter kubernetes.**>\n      @type grep\n      \u003Cexclude>\n        key $.kubernetes.namespace_name\n        pattern \u002F^(kube-system|logging)$\u002F\n      \u003C\u002Fexclude>\n    \u003C\u002Ffilter>\n\n    \u003Cmatch kubernetes.**>\n      @type elasticsearch\n      host \"#{ENV['FLUENT_ELASTICSEARCH_HOST']}\"\n      port \"#{ENV['FLUENT_ELASTICSEARCH_PORT']}\"\n      index_name k8s-${record['$.kubernetes']['namespace_name']}-%Y.%m.%d\n      \u003Cbuffer tag, time>\n        @type file\n        path \u002Fvar\u002Flog\u002Ffluentd\u002Fbuffer\n        timekey 1h\n        flush_interval 30s\n      \u003C\u002Fbuffer>\n    \u003C\u002Fmatch>\n```\n\n### Task D: Log Parsing and Transformation\n\n```xml\n\u003C!-- fluent.conf — Parse multiline Java stack traces -->\n\u003Csource>\n  @type tail\n  path \u002Fvar\u002Flog\u002Fapp\u002Fjava-app.log\n  tag java.app\n  \u003Cparse>\n    @type multiline\n    format_firstline \u002F^\\d{4}-\\d{2}-\\d{2}\u002F\n    format1 \u002F^(?\u003Ctime>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d{3}) (?\u003Clevel>\\w+) \\[(?\u003Cthread>[^\\]]+)\\] (?\u003Cclass>[^ ]+) - (?\u003Cmessage>.*)\u002F\n  \u003C\u002Fparse>\n\u003C\u002Fsource>\n\n\u003Cfilter java.app>\n  @type record_transformer\n  enable_ruby true\n  \u003Crecord>\n    severity ${record[\"level\"] == \"ERROR\" ? \"error\" : record[\"level\"] == \"WARN\" ? \"warning\" : \"info\"}\n    service \"java-app\"\n  \u003C\u002Frecord>\n\u003C\u002Ffilter>\n```\n\n## Best Practices\n\n- Use file-based buffers in production to prevent log loss during restarts\n- Set `overflow_action block` to apply backpressure instead of dropping logs\n- Exclude debug-level logs early in the pipeline to reduce downstream volume\n- Use `@type copy` for critical logs that need multiple destinations\n- Monitor Fluentd's own metrics via the `@type prometheus` plugin\n- In Kubernetes, use Fluent Bit as a lightweight forwarder and Fluentd as an aggregator\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Ffluentd",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill fluentd",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill fluentd",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill fluentd","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Ffluentd\u002FSKILL.md",true,[45],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"references\u002Flanguages.md","REFERENCE","参考文档",4786,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes_sovereign_data\u002Fskills\u002Fmlops\u002Fmodels\u002Fwhisper\u002Freferences\u002Flanguages.md",[52,66,76,85,91,98],{"skillNo":53,"name":54,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":62,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[57],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[63,64,65],"model","model hierarchy","model hierarchy skill",{"skillNo":67,"name":68,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":72,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[71],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},[73,74,75],"MCP","zoom","zoom mcp",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[82,83,84,74],"sdk","zoom apps sdk","apps",{"skillNo":86,"name":87,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[87],{"skillNo":92,"name":93,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":97,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[96],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},[93],{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":103,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[100]]