主頁 > 後端開發 > Beats 入門實戰(2)--FileBeat 介紹

Beats 入門實戰(2)--FileBeat 介紹

2022-10-15 11:04:20 後端開發

本文主要介紹 Filebeat 的相關概念及基本使用,相關的環境及軟體資訊如下:CentOS 7.9、FileBeat 8.2.2、Logstash 8.2.2、Elasticsearch 8.2.2,

1、Filebeat 簡介

1.1、Filebeat 總覽

Filebeat 是用于轉發和集中日志資料的輕量級傳送程式, 作為服務器上的代理安裝,Filebeat 監視你指定的日志檔案或位置,收集日志事件,并將它們轉發到 Elasticsearch 或 Logstash 以進行索引,

Filebeat 具有如下的一些特性:

  • 正確處理日志旋轉:針對每隔一個時間段生產一個新的日志的案例,Filebeat 可以幫我們正確地處理新生產的日志,并重新啟動對新生成日志的處理
  • 背壓敏感:如果日志生成的速度過快,從而導致 Filebeat 生產的速度超過 Elasticsearch 處理的速度,那么 Filebeat 可以自動調節處理的速度,以達到 Elasticsearch 可以處理的范圍內
  • “至少一次”保證:每個日志生成的事件至少被處理一次
  • 結構化日志:可以處理結構化的日志資料資料
  • 多行事件:如果一個日志有多行資訊,也可以被正確處理,比如錯誤資訊往往是多行資料
  • 條件過濾:可以有條件地過濾一些事件

Filebeat 的作業方式如下:啟動 Filebeat 時,它將啟動一個或多個輸入,這些輸入將在為日志資料指定的位置中查找, 對于 Filebeat 所找到的每個日志,Filebeat 都會啟動收集器(havester), 每個收集器都讀取一個日志以獲取新內容,并將新日志資料發送到 libbeat,libbeat 會匯總事件,并將匯總的資料發送到為 Filebeat 配置的輸出,

從上面有可以看出來在 spooler 里有一些快取,這個可以用于重新發送以確保至少一次的事件消費,同時也可以用于背壓敏感,一旦 Filebeat 生成的事件的速度超過 Elasticsearch 能夠處理的極限,這個快取可以用于存盤一些事件,每個 Filebeat 可以配置多個 input,并且每個 input 可以配置來采集一個或多個檔案路徑的檔案, 就像上面的圖顯示的那樣,Filebeat 支持多種輸入方式,Filbeat 支持如下的一些輸出:

  • Elasticsearch
  • Logstash
  • Kafka
  • Redis
  • File
  • Console
  • Cloud

1.2、Filebeat 模塊

一個 Filebeat 模塊通常由如下的部分組成:

Filebeat 模塊簡化了常見日志格式的收集,決議和可視化,檔案集包含以下內容:

  • Filebeat 輸入配置,其中包含在其中查找日志檔案的默認路徑, 這些默認路徑取決于作業系統, Filebeat 配置還負責在需要時將多行事件縫合在一起,
  • Elasticsearch Ingest Node 管道定義,用于決議日志行,
  • 欄位定義,用于為每個欄位配置具有正確的 Elasticsearch 型別,它們還包含每個欄位的簡短說明,
  • 示例 Kibana 儀表板(如果有)可用于可視化日志檔案,

Filebeat 會根據你的環境自動調整這些配置,并將它們加載到相應的 Elastic Stack 組件中,

一個典型的模塊(例如,對于 Nginx 日志)由一個或多個檔案集(對于 Nginx,訪問和錯誤日志)組成,比如,Nginx 模塊決議 NGINX HTTP 服務器創建的訪問和錯誤日志,它在幕后執行如下的一些任務:

  • 設定日志檔案的默認路徑(你可以更改)
  • 確保每個多行日志事件都作為單個事件發送
  • 使用 ingest node 來決議和處理日志行
  • 將資料塑造成適合在 Kibana 中進行可視化的結構
  • 部署儀表板以可視化日志資料

 針對其它的 Beats 模塊來說,基本和 Filebeat 一樣,目前針對 Elasticsearch 所提供的模塊來說,有非常多的模塊可以供使用:

 關于 Filbeat 的模塊資訊,可查看官網檔案:https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html,

2、Filebeat 安裝

根據環境下載對應的安裝包:https://www.elastic.co/cn/downloads/beats/filebeat,這里選擇 Linux x86_64 版本;下載完成后在服務器上解壓即可:

tar zxvf filebeat-8.2.2-linux-x86_64.tar.gz

3、Filebeat 使用

這里使用 Filebeat 來收集 Nginx 訪問日志并發送到 Logstash 和 Elasticsearch 中,

3.1、按照普通日志檔案方式收集 Nginx 訪問日志

3.1.1、配置

修改組態檔 filebeat.yml,配置輸入、輸出,開始可以先把輸出配成 console,除錯沒問題后再配置輸出到 Logstash 和 Elasticsearch,

filebeat.inputs:
- type: filestream
  id: my-filestream-id
  enabled: true
  paths:
    - /home/hadoop/app/nginx-1.8.0/logs/access.log
    
output.console:
  pretty: true
  enable: true

3.1.2、啟動

./filebeat -e -c filebeat.yml 

3.1.3、驗證

訪問 Nginx,日志檔案 /home/hadoop/app/nginx-1.8.0/logs/access.log 會輸出日志:

10.49.196.1 - - [16/Sep/2022:15:35:20 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"

filebeat 的控制臺列印采集的日志資訊如下:

{
  "@timestamp": "2022-09-16T07:35:25.797Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "8.2.2",
    "pipeline": "filebeat-8.2.2-nginx-access-pipeline"
  },
  "event": {
    "timezone": "+08:00",
    "module": "nginx",
    "dataset": "nginx.access"
  },
  "fileset": {
    "name": "access"
  },
  "ecs": {
    "version": "1.12.0"
  },
  "agent": {
    "type": "filebeat",
    "version": "8.2.2",
    "ephemeral_id": "5f0443a4-e5c6-43c0-88d2-4ad7b946c4a7",
    "id": "197bfd49-e03a-416e-b53f-4ac143b94fa5",
    "name": "pxc2"
  },
  "message": "10.49.196.1 - - [16/Sep/2022:15:35:20 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\"",
  "input": {
    "type": "log"
  },
  "host": {
    "id": "a91a3eb89492470398ed77cd24a29299",
    "containerized": false,
    "ip": [
      "10.49.196.11",
      "fe80::2011:ba1b:b32b:b63a"
    ],
    "mac": [
      "00:0c:29:97:29:ce"
    ],
    "hostname": "pxc2",
    "name": "pxc2",
    "architecture": "x86_64",
    "os": {
      "version": "7 (Core)",
      "family": "redhat",
      "name": "CentOS Linux",
      "kernel": "3.10.0-957.el7.x86_64",
      "codename": "Core",
      "type": "linux",
      "platform": "centos"
    }
  },
  "log": {
    "offset": 16308,
    "file": {
      "path": "/home/hadoop/app/nginx-1.8.0/logs/access.log"
    }
  },
  "service": {
    "type": "nginx"
  }
}
View Code

3.1.4、處理器

默認情況下配置了如下處理器:

processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

如果覺得輸出的日志過多,可以把這些處理器去掉并添加去除欄位的處理器:

processors:
  #- add_host_metadata:
  #    when.not.contains.tags: forwarded
  #- add_cloud_metadata: ~
  #- add_docker_metadata: ~
  #- add_kubernetes_metadata: ~
  - drop_fields:
      fields: ["agent.id", "log"]

3.1.5、配置輸出到 Logstash

output.logstash:
  hosts: ["localhost:5044"]

Logstash 接受到的日志資訊如下:

{
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
         "event" => {
        "timezone" => "+08:00",
        "original" => "10.49.196.1 - - [16/Sep/2022:15:51:38 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\"",
         "dataset" => "nginx.access",
          "module" => "nginx"
    },
           "log" => {
        "offset" => 16866,
          "file" => {
            "path" => "/home/hadoop/app/nginx-1.8.0/logs/access.log"
        }
    },
      "@version" => "1",
       "fileset" => {
        "name" => "access"
    },
       "message" => "10.49.196.1 - - [16/Sep/2022:15:51:38 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\"",
    "@timestamp" => 2022-09-16T07:51:45.515Z,
         "agent" => {
                "name" => "pxc2",
                "type" => "filebeat",
        "ephemeral_id" => "9a6a130b-04c6-4bbf-a228-60e1f237f5a9",
             "version" => "8.2.2",
                  "id" => "197bfd49-e03a-416e-b53f-4ac143b94fa5"
    },
           "ecs" => {
        "version" => "1.12.0"
    },
          "host" => {
        "name" => "pxc2"
    },
       "service" => {
        "type" => "nginx"
    },
         "input" => {
        "type" => "log"
    }
}
View Code

3.1.6、配置輸出到 Elasticsearch

output.elasticsearch:
  hosts: ["localhost:9200"] 

Elasticsearch 會自動創建名為 filebeat-8.2.2 的資料流,資料流中保存的日志資訊如下:

{
  "_index": ".ds-filebeat-8.2.2-2022.09.16-000001",
  "_id": "8qxKRYMBPnCOyxVi1GuP",
  "_version": 1,
  "_score": 1,
  "_source": {
    "agent": {
      "name": "pxc2",
      "id": "197bfd49-e03a-416e-b53f-4ac143b94fa5",
      "ephemeral_id": "a6b1d9a5-8485-4391-92be-6a6ae530a5cd",
      "type": "filebeat",
      "version": "8.2.2"
    },
    "nginx": {
      "access": {
        "remote_ip_list": [
          "10.49.196.1"
        ]
      }
    },
    "log": {
      "file": {
        "path": "/home/hadoop/app/nginx-1.8.0/logs/access.log"
      },
      "offset": 17052
    },
    "source": {
      "address": "10.49.196.1",
      "ip": "10.49.196.1"
    },
    "fileset": {
      "name": "access"
    },
    "url": {
      "path": "/",
      "original": "/"
    },
    "input": {
      "type": "log"
    },
    "@timestamp": "2022-09-16T07:54:24.000Z",
    "ecs": {
      "version": "1.12.0"
    },
    "_tmp": {},
    "related": {
      "ip": [
        "10.49.196.1"
      ]
    },
    "service": {
      "type": "nginx"
    },
    "host": {
      "name": "pxc2"
    },
    "http": {
      "request": {
        "method": "GET"
      },
      "response": {
        "status_code": 304,
        "body": {
          "bytes": 0
        }
      },
      "version": "1.1"
    },
    "event": {
      "ingested": "2022-09-16T07:54:34.439241175Z",
      "original": "10.49.196.1 - - [16/Sep/2022:15:54:24 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\"",
      "timezone": "+08:00",
      "created": "2022-09-16T07:54:33.213Z",
      "kind": "event",
      "module": "nginx",
      "category": [
        "web"
      ],
      "type": [
        "access"
      ],
      "dataset": "nginx.access",
      "outcome": "success"
    },
    "user_agent": {
      "original": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
      "os": {
        "name": "Windows",
        "version": "10",
        "full": "Windows 10"
      },
      "name": "Chrome",
      "device": {
        "name": "Other"
      },
      "version": "105.0.0.0"
    }
  },
  "fields": {
    "event.category": [
      "web"
    ],
    "user_agent.os.full": [
      "Windows 10"
    ],
    "user_agent.original.text": [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    ],
    "url.original.text": [
      "/"
    ],
    "source.address": [
      "10.49.196.1"
    ],
    "user_agent.os.name.text": [
      "Windows"
    ],
    "user_agent.os.version": [
      "10"
    ],
    "user_agent.os.name": [
      "Windows"
    ],
    "traefik.access.user_agent.name": [
      "Chrome"
    ],
    "service.type": [
      "nginx"
    ],
    "agent.type": [
      "filebeat"
    ],
    "event.module": [
      "nginx"
    ],
    "http.request.method": [
      "GET"
    ],
    "related.ip": [
      "10.49.196.1"
    ],
    "traefik.access.user_agent.original": [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    ],
    "source.ip": [
      "10.49.196.1"
    ],
    "agent.name": [
      "pxc2"
    ],
    "host.name": [
      "pxc2"
    ],
    "user_agent.version": [
      "105.0.0.0"
    ],
    "http.response.status_code": [
      304
    ],
    "http.version": [
      "1.1"
    ],
    "event.kind": [
      "event"
    ],
    "event.timezone": [
      "+08:00"
    ],
    "event.outcome": [
      "success"
    ],
    "user_agent.original": [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    ],
    "event.original": [
      "10.49.196.1 - - [16/Sep/2022:15:54:24 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\""
    ],
    "fileset.name": [
      "access"
    ],
    "nginx.access.remote_ip_list": [
      "10.49.196.1"
    ],
    "input.type": [
      "log"
    ],
    "log.offset": [
      17052
    ],
    "user_agent.name": [
      "Chrome"
    ],
    "agent.hostname": [
      "pxc2"
    ],
    "http.response.body.bytes": [
      0
    ],
    "traefik.access.user_agent.os_name": [
      "Windows"
    ],
    "user_agent.os.full.text": [
      "Windows 10"
    ],
    "event.ingested": [
      "2022-09-16T07:54:34.439Z"
    ],
    "url.original": [
      "/"
    ],
    "@timestamp": [
      "2022-09-16T07:54:24.000Z"
    ],
    "url.path": [
      "/"
    ],
    "agent.id": [
      "197bfd49-e03a-416e-b53f-4ac143b94fa5"
    ],
    "ecs.version": [
      "1.12.0"
    ],
    "event.type": [
      "access"
    ],
    "log.file.path": [
      "/home/hadoop/app/nginx-1.8.0/logs/access.log"
    ],
    "event.created": [
      "2022-09-16T07:54:33.213Z"
    ],
    "agent.ephemeral_id": [
      "a6b1d9a5-8485-4391-92be-6a6ae530a5cd"
    ],
    "agent.version": [
      "8.2.2"
    ],
    "user_agent.device.name": [
      "Other"
    ],
    "event.dataset": [
      "nginx.access"
    ]
  }
}
View Code

3.2、使用 Nginx 模塊收集 Nginx 訪問日志

 Filebeat 中 Nginx 模塊可以針對 Nginx 日志進行決議,簡化了我們處理日志的程序,

3.2.1、配置

A、filebeat.yml 檔案配置

filebeat.inputs:
- type: filestream
  id: my-filestream-id
  enabled: false
  paths:
    - /home/hadoop/app/nginx-1.8.0/logs/access.log
    
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

output.elasticsearch:
  hosts: ["localhost:9200"]

B、modules.d/nginx.yml 檔案配置

- module: nginx
  access:
    enabled: true
    var.paths: ["/home/hadoop/app/nginx-1.8.0/logs/access.log"]
  error:
    enabled: false
  ingress_controller:
    enabled: false

3.2.2、啟用 Nginx 模塊并啟動 Filebeat

./filebeat modules enable nginx

./filebeat -e -c filebeat.yml 

3.2.3、驗證

訪問 Nginx 后,Elasticsearch 會自動創建名為 filebeat-8.2.2 的資料流,資料流中保存的日志資訊如下:

{
  "_index": ".ds-filebeat-8.2.2-2022.09.16-000001",
  "_id": "-qxgRYMBPnCOyxVikGvO",
  "_version": 1,
  "_score": 1,
  "_source": {
    "agent": {
      "name": "pxc2",
      "id": "197bfd49-e03a-416e-b53f-4ac143b94fa5",
      "type": "filebeat",
      "ephemeral_id": "c7505853-b6de-46b0-abb0-7727dfb37d4b",
      "version": "8.2.2"
    },
    "nginx": {
      "access": {
        "remote_ip_list": [
          "10.49.196.1"
        ]
      }
    },
    "log": {
      "file": {
        "path": "/home/hadoop/app/nginx-1.8.0/logs/access.log"
      },
      "offset": 17424
    },
    "source": {
      "address": "10.49.196.1",
      "ip": "10.49.196.1"
    },
    "fileset": {
      "name": "access"
    },
    "url": {
      "path": "/",
      "original": "/"
    },
    "input": {
      "type": "log"
    },
    "@timestamp": "2022-09-16T08:18:09.000Z",
    "ecs": {
      "version": "1.12.0"
    },
    "_tmp": {},
    "related": {
      "ip": [
        "10.49.196.1"
      ]
    },
    "service": {
      "type": "nginx"
    },
    "host": {
      "name": "pxc2"
    },
    "http": {
      "request": {
        "method": "GET"
      },
      "response": {
        "status_code": 304,
        "body": {
          "bytes": 0
        }
      },
      "version": "1.1"
    },
    "event": {
      "ingested": "2022-09-16T08:18:19.574911507Z",
      "original": "10.49.196.1 - - [16/Sep/2022:16:18:09 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\"",
      "timezone": "+08:00",
      "created": "2022-09-16T08:18:18.539Z",
      "kind": "event",
      "module": "nginx",
      "category": [
        "web"
      ],
      "type": [
        "access"
      ],
      "dataset": "nginx.access",
      "outcome": "success"
    },
    "user_agent": {
      "original": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
      "os": {
        "name": "Windows",
        "version": "10",
        "full": "Windows 10"
      },
      "name": "Chrome",
      "device": {
        "name": "Other"
      },
      "version": "105.0.0.0"
    }
  },
  "fields": {
    "event.category": [
      "web"
    ],
    "user_agent.os.full": [
      "Windows 10"
    ],
    "user_agent.original.text": [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    ],
    "url.original.text": [
      "/"
    ],
    "source.address": [
      "10.49.196.1"
    ],
    "user_agent.os.name.text": [
      "Windows"
    ],
    "user_agent.os.version": [
      "10"
    ],
    "user_agent.os.name": [
      "Windows"
    ],
    "traefik.access.user_agent.name": [
      "Chrome"
    ],
    "service.type": [
      "nginx"
    ],
    "agent.type": [
      "filebeat"
    ],
    "event.module": [
      "nginx"
    ],
    "http.request.method": [
      "GET"
    ],
    "related.ip": [
      "10.49.196.1"
    ],
    "traefik.access.user_agent.original": [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    ],
    "source.ip": [
      "10.49.196.1"
    ],
    "agent.name": [
      "pxc2"
    ],
    "host.name": [
      "pxc2"
    ],
    "user_agent.version": [
      "105.0.0.0"
    ],
    "http.response.status_code": [
      304
    ],
    "http.version": [
      "1.1"
    ],
    "event.kind": [
      "event"
    ],
    "event.timezone": [
      "+08:00"
    ],
    "event.outcome": [
      "success"
    ],
    "user_agent.original": [
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
    ],
    "event.original": [
      "10.49.196.1 - - [16/Sep/2022:16:18:09 +0800] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36\""
    ],
    "fileset.name": [
      "access"
    ],
    "nginx.access.remote_ip_list": [
      "10.49.196.1"
    ],
    "input.type": [
      "log"
    ],
    "log.offset": [
      17424
    ],
    "user_agent.name": [
      "Chrome"
    ],
    "agent.hostname": [
      "pxc2"
    ],
    "http.response.body.bytes": [
      0
    ],
    "traefik.access.user_agent.os_name": [
      "Windows"
    ],
    "user_agent.os.full.text": [
      "Windows 10"
    ],
    "event.ingested": [
      "2022-09-16T08:18:19.574Z"
    ],
    "url.original": [
      "/"
    ],
    "@timestamp": [
      "2022-09-16T08:18:09.000Z"
    ],
    "url.path": [
      "/"
    ],
    "agent.id": [
      "197bfd49-e03a-416e-b53f-4ac143b94fa5"
    ],
    "ecs.version": [
      "1.12.0"
    ],
    "event.type": [
      "access"
    ],
    "log.file.path": [
      "/home/hadoop/app/nginx-1.8.0/logs/access.log"
    ],
    "event.created": [
      "2022-09-16T08:18:18.539Z"
    ],
    "agent.ephemeral_id": [
      "c7505853-b6de-46b0-abb0-7727dfb37d4b"
    ],
    "agent.version": [
      "8.2.2"
    ],
    "user_agent.device.name": [
      "Other"
    ],
    "event.dataset": [
      "nginx.access"
    ]
  }
}
View Code

可以看到日志資訊已經被決議出各個單獨的有用欄位,如:source.ip,url.path,user_agent.name 等等,

 

參考:https://blog.csdn.net/UbuntuTouch/article/details/104432643



轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514266.html

標籤:其他

上一篇:day46-JDBC和連接池02

下一篇:C語言小白刷題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more