基于Docker搭建Graylog分布式日志采集系統(tǒng)的詳細(xì)過程
一、簡介
Graylog是一個開源的日志管理工具,主要功能包括日志收集、解析、存儲、搜索和可視化。它可以從各種數(shù)據(jù)源(如應(yīng)用程序、系統(tǒng)和網(wǎng)絡(luò)設(shè)備)收集日志,通過內(nèi)置的解析器將日志格式化并存儲在數(shù)據(jù)庫中。用戶可以使用其強(qiáng)大的搜索功能快速查找特定日志,設(shè)置告警規(guī)則以監(jiān)控關(guān)鍵事件,且支持創(chuàng)建自定義儀表板和圖表以可視化數(shù)據(jù)。這樣,Graylog幫助用戶實(shí)時監(jiān)控系統(tǒng)健康,快速定位問題源,并進(jìn)行深入分析。
二、Graylog
1、主要特點(diǎn)
- 日志收集:支持從多種數(shù)據(jù)源(如系統(tǒng)日志、應(yīng)用日志、網(wǎng)絡(luò)設(shè)備)收集日志數(shù)據(jù),通過多種輸入插件(如Syslog、HTTP、Kafka)進(jìn)行接入。
- 日志解析:通過內(nèi)置的解析器和提取器將日志數(shù)據(jù)標(biāo)準(zhǔn)化和格式化,支持對復(fù)雜日志數(shù)據(jù)進(jìn)行提取和解析,使數(shù)據(jù)更加結(jié)構(gòu)化和可操作。
- 存儲和索引:將日志數(shù)據(jù)存儲在Elasticsearch中,利用其高效的索引和搜索功能來處理大規(guī)模的日志數(shù)據(jù)。
- 實(shí)時搜索:提供強(qiáng)大的搜索功能,支持基于時間、字段和內(nèi)容的復(fù)雜查詢,以快速檢索和分析日志信息。
- 可視化:允許創(chuàng)建自定義的儀表板、圖表和報告,實(shí)時展示關(guān)鍵指標(biāo)和日志數(shù)據(jù)的趨勢,幫助用戶更直觀地理解系統(tǒng)狀態(tài)和性能。
- 告警和通知:支持設(shè)置告警條件,根據(jù)日志內(nèi)容或系統(tǒng)指標(biāo)觸發(fā)通知,及時響應(yīng)潛在問題或異常情況。
- 用戶管理:提供多級別的權(quán)限控制,允許管理員配置用戶角色和權(quán)限,以確保數(shù)據(jù)訪問的安全性和合規(guī)性。
- 插件和擴(kuò)展:支持通過插件擴(kuò)展功能,包括自定義輸入、處理管道、輸出插件等,以滿足特定需求。
這些功能共同作用,使Graylog成為一個強(qiáng)大的日志管理和分析工具,幫助用戶實(shí)時監(jiān)控和優(yōu)化系統(tǒng)性能。
2、組件
- Graylog Server:核心組件,負(fù)責(zé)處理和分析日志數(shù)據(jù)。包括接收、解析、存儲、索引和搜索功能。
- Elasticsearch:用于存儲和索引日志數(shù)據(jù)的搜索引擎,支持高效的全文搜索和復(fù)雜查詢。
- MongoDB:存儲Graylog的配置數(shù)據(jù)、用戶信息和其他元數(shù)據(jù)。
- Graylog Web Interface:基于Web的用戶界面,提供日志搜索、儀表板創(chuàng)建、報告生成和告警配置功能。
3、工作流程介紹
部署 graylog 最簡單的架構(gòu)就是單機(jī)部署,復(fù)雜的就是部署集群模式,架構(gòu)圖如下所示。我們可以看到其中包含了三個組件,分別是 Elasticsearch、MongoDB 和 Graylog。
- Elasticsearch 用來持久化存儲和檢索日志文件數(shù)據(jù)(IO 密集)
- MongoDB 用來存儲關(guān)于 Graylog 的相關(guān)配置
- Graylog 用來提供 Web 界面和對外接口的(CPU 密集)。
最小化單機(jī)部署
最優(yōu)化集群部署
配置 Graylog 服務(wù)的核心就是理解對應(yīng)組件的功能以及其運(yùn)作方式!
簡單來講,Input 表示日志數(shù)據(jù)的來源,對不同來源的日志可以通過 Extractors 來進(jìn)行日志的字段轉(zhuǎn)換,比如將日記 Nginx 的狀態(tài)碼變成對應(yīng)的英文表述等。然后,通過不同的標(biāo)簽類型組成不同的標(biāo)簽 Stream,并將這些日志數(shù)據(jù)存儲到指定的地方 Index 庫中進(jìn)行了持久化保存。
組件名稱 | 功能介紹 | 主要特點(diǎn) |
---|---|---|
Dashboards | 數(shù)據(jù)面板固定展示 | 主要是用來保存特定搜索條件的數(shù)據(jù)面板 |
Searching | 日志信息條件搜索 | 關(guān)鍵字搜索、時間搜索、搜索保存、創(chuàng)建面板、分組查詢、結(jié)果導(dǎo)出、查詢高亮顯示,自定義時間 |
Alert | 設(shè)置告警提示方式 | 支持郵件告警、HTTP 回調(diào)和自定義腳本觸發(fā) |
Inputs | 日志數(shù)據(jù)抓取接收 | 部署 Sidercar 主動抓取或使用其他服務(wù)被動上報 |
Extractors | 日志數(shù)據(jù)格式轉(zhuǎn)換 | json 解析、kv 解析、時間解析、正則解析 |
Streams | 日志信息分類分組 | 設(shè)置日志分類條件并發(fā)送到不同的索引文件中去 |
Indices | 持久化數(shù)據(jù)存儲 | 設(shè)置數(shù)據(jù)存儲性能 |
Outputs | 日志數(shù)據(jù)的轉(zhuǎn)發(fā) | 解析的 Stream 發(fā)送到其他 Graylog 集群或服務(wù) |
Pipelines | 日志數(shù)據(jù)的過濾 | 建立數(shù)據(jù)清洗的過濾規(guī)則、字段添加刪除、條件過濾、自定義函數(shù)等 |
Sidecar | 輕量級的日志采集器 | 相當(dāng)于 C/S 模式,大規(guī)模時使用 |
Lookup Tables | 服務(wù)解析 | 基于 IP 的 Whois 查詢和基于來源 IP 的情報監(jiān)控 |
Geolocation | 可視化地理位置 | 實(shí)現(xiàn)基于來源 IP 的情報監(jiān)控 |
- Graylog 通過 Input 搜集日志,每個 Input 單獨(dú)配置 Extractors 用來做字段轉(zhuǎn)換。Graylog
- 中日志搜索的基本單位是 Stream,每個 Stream 可以有自己單獨(dú)的 Elastic Index Set,也可以共享一個 Index
- Set。
- Extractor 在 System/Input 中配置。Graylog 中很方便的一點(diǎn)就是可以加載一條日志,然后基于這個實(shí)際的例子進(jìn)行配置并能直接看到結(jié)果。內(nèi)置的 Extractor 基本可以完成各種字段提取和轉(zhuǎn)換的任務(wù),但是也有些限制,在應(yīng)用里寫日志的時候就需要考慮到這些限制。Input 可以配置多個 Extractors,按照順序依次執(zhí)行。
- 系統(tǒng)會有一個默認(rèn)的 Stream,所有日志默認(rèn)都會保存到這個 Stream 中,除非匹配了某個 Stream,并且這個 Stream 里配置了不保存日志到默認(rèn) Stream??梢酝ㄟ^菜單 Streams 創(chuàng)建更多的 Stream,新創(chuàng)建的 Stream 是暫停狀態(tài),需要在配置完成后手動啟動。Stream 通過配置條件匹配日志,滿足條件的日志添加 stream ID 標(biāo)識字段并保存到對應(yīng)的 Elastic Index Set 中。
- Index Set 通過菜單 System/Indices 創(chuàng)建。日志存儲的性能,可靠性和過期策略都通過 Index Set 來配置。性能和可靠性就是配置 Elastic Index 的一些參數(shù),主要參數(shù)包括,Shards 和 Replicas。
- 除了上面提到的日志處理流程,Graylog 還提供了 Pipeline 腳本實(shí)現(xiàn)更靈活的日志處理方案。這里不詳細(xì)闡述,只介紹如果使用 Pipelines 來過濾不需要的日志。下面是丟棄 level > 6 的所有日志的 Pipeline Rule 的例子。從數(shù)據(jù)采集(input),字段解析(extractor),分流到 stream,再到 pipeline 的清洗,一氣呵成,無需再通過其他方式進(jìn)行二次加工。
- Sidecar 是一個輕量級的日志采集器,通過訪問 graylog 進(jìn)行集中式管理,支持 linux 和 windows 系統(tǒng)。Sidecar 守護(hù)進(jìn)程會定期訪問 graylog 的 REST API 接口獲取 Sidecar 配置文件中定義的標(biāo)簽(tag) ,Sidecar 在首次運(yùn)行時會從 graylog 服務(wù)器拉取配置文件中指定標(biāo)簽(tag) 的配置信息同步到本地。目前 Sidecar 支持 NXLog,F(xiàn)ilebeat 和 Winlogbeat。他們都通過 graylog 中的 web 界面進(jìn)行統(tǒng)一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等輸出類型。Graylog 最厲害的在于可以在配置文件中指定 Sidecar 把日志發(fā)送到哪個 graylog 群集,并對 graylog 群體中的多個 input 進(jìn)行負(fù)載均衡,這樣在遇到日志量非常龐大的時候,graylog 也能應(yīng)付自如。
- 日志集中保存到 Graylog 后就可以方便地使用搜索器了。不過有時候還是需要對數(shù)據(jù)進(jìn)行近一步的處理。主要有兩個途徑,分別是直接訪問。 Elastic 中保存的數(shù)據(jù),或者通過 Graylog 的 Output 轉(zhuǎn)發(fā)到其它服務(wù)。
使用 Graylog 來收集日志
4、使用場景
- 系統(tǒng)監(jiān)控:實(shí)時收集和分析系統(tǒng)日志,監(jiān)控服務(wù)器、應(yīng)用程序和網(wǎng)絡(luò)設(shè)備的健康狀態(tài)和性能。
- 故障排除:快速定位系統(tǒng)或應(yīng)用程序中的問題,通過日志搜索和分析找到錯誤和異常的根源。
- 安全事件管理:跟蹤和分析安全日志,檢測異常行為,識別潛在的安全威脅。
- 合規(guī)性審計(jì):記錄和存檔日志數(shù)據(jù),滿足行業(yè)合規(guī)性要求,如PCI-DSS、HIPAA等。
- 性能優(yōu)化:分析日志數(shù)據(jù)以了解系統(tǒng)性能瓶頸,優(yōu)化資源分配和應(yīng)用程序性能。
- 運(yùn)維自動化:設(shè)置告警和自動化響應(yīng)策略,減少人工干預(yù),提高運(yùn)維效率。
三、Graylog 安裝部署
1、 安裝 docker
linux上進(jìn)行docker安裝有兩種方式:
- Docker自動化安裝
- Docker手動安裝
可以根據(jù)該文章的步驟進(jìn)行安裝:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502
2、安裝docker compose 國內(nèi)鏡像秒下載
curl -L https://get.daocloud.io/docker/compose/releases/download/2.16.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
如果遇到版本更新,把版本數(shù)字更改一下就可以了。
修改文件執(zhí)行權(quán)限
sudo chmod +x /usr/local/bin/docker-compose
創(chuàng)建軟鏈
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
測試是否安裝成功
docker-compose --version
3、 安裝graylog
創(chuàng)建目錄
mkdir -p /opt/graylog/mongo_data mkdir -p /opt/graylog/es_data mkdir -p /opt/graylog/graylog_data mkdir -p /opt/graylog/graylog_data/config
目錄賦權(quán)
chmod -R +777 /opt/graylog/mongo_data chmod -R +777 /opt/graylog/es_data chmod -R +777 /opt/graylog/graylog_data
進(jìn)入/opt/graylog/graylog_data/config目錄
cd /opt/graylog/graylog_data/config
下載配置文件
wget http://raw.githubusercontent.com/Graylog2/graylog-docker/4.3/config/graylog.conf wget http://raw.githubusercontent.com/Graylog2/graylog-docker/4.3/config/log4j2.xml
目錄賦權(quán)
chown -R 1100:1100 /opt/graylog/graylog_data
設(shè)置查詢高亮和國內(nèi)時區(qū)
vim /opt/graylog/graylog_data/config/graylog.conf
國內(nèi)時區(qū):root_timezone = PRC
查詢高亮:allow_highlighting = true
進(jìn)入/opt/graylog目錄
cd /opt/graylog
創(chuàng)建docker-compose.yml文件
vim docker-compose.yml
文件內(nèi)容如下
version: '3' services: mongodb: container_name: mongodb image: mongo:4.4.0 restart: always volumes: - /opt/graylog/mongo_data:/data/db - /etc/localtime:/etc/localtime:ro - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2 container_name: elasticsearch restart: always volumes: - /opt/graylog/es_data:/usr/share/elasticsearch/data - /etc/localtime:/etc/localtime:ro - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro ports: - 9200:9200 - 9300:9300 environment: - TZ=Asia/Shanghai - http.host=0.0.0.0 - transport.host=localhost - network.host=0.0.0.0 - http.cors.allow-origin=* - http.cors.enabled=true - discovery.type=single-node - 'ES_JAVA_OPTS=-Xms1024m -Xmx1024m' graylog: image: graylog/graylog:4.3.6 container_name: graylog restart: always volumes: - /opt/graylog/graylog_data:/usr/share/graylog/data - /etc/localtime:/etc/localtime:ro - /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone:ro environment: # CHANGE ME (must be at least 16 characters)! - GRAYLOG_PASSWORD_SECRET=somepasswordpepper # Password: admin - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/ - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog - GRAYLOG_ELASTICSEARCH_HOSTS=http://elasticsearch:9200 - TZ=Asia/Shanghai entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 -- /docker-entrypoint.sh depends_on: - mongodb - elasticsearch links: - mongodb - elasticsearch ports: # Graylog web interface and REST API - 9000:9000 # Syslog TCP - 1514:1514 # Syslog UDP - 1514:1514/udp # GELF TCP - 12201:12201 # GELF UDP - 12201:12201/udp
開始安裝(也是啟動命令)
docker-compose up -d
指定文件啟動
docker-compose -f docker-compose.yml up -d
停止
docker-compose down
指定文件停止
docker-compose -f docker-compose.yml down
驗(yàn)證安裝
docker ps
可以看見 graylog 容器的運(yùn)行情況,可以看到 12201 udp這樣才算成功
版本兼容要求
見官方文檔說明鏈接:
https://go2docs.graylog.org/5-2/downloading_and_installing_graylog/installing_graylog.html
4、Graylog控制臺
測試
安裝完成之后,訪問
http://127.0.0.1:9000/ (或 ip:9000)
默認(rèn)docker-compose.yml文件設(shè)置的賬號密碼
賬號:admin
密碼:admin
至此,Graylog分布式日志服務(wù)就安裝成功了
設(shè)置Graylog日志保留時間
- 在導(dǎo)航欄中選擇“System”。
- 在左側(cè)面板中選擇“Indices”。
- 在“Indices”頁面中,可以看到已經(jīng)存在的索引以及它們的相關(guān)信息。
- 在這里,點(diǎn)擊“Edit”按鈕來編輯索引的保留策略。
- 在彈出的窗口中,可以設(shè)置索引的保留策略,包括保留時間、最大文檔數(shù)、最大索引大小等。
四、springboot集成Graylog
項(xiàng)目pom.xml中引入logback-gelf
<!-- graylog 日志依賴 --> <dependency> <groupId>de.siegmar</groupId> <artifactId>logback-gelf</artifactId> <version>3.0.0</version> </dependency>
這樣就可以再logback配置文件中加入 GelfTcpAppender GelfUdpAppender
項(xiàng)目logback文件中加入 Gelf Appender
在application.yaml 中指定logback的配置文件
#配置logback日志組件 logging: config: classpath:logback.xml
在 logback.xml配置文件中加入GelfTcpAppender (GELF_LOG 為graylog的日志記錄)(為了防止graylog出現(xiàn)故障,可以在本地和graylog中同時記錄日志)
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_HOME" value="./logs"/> <property name="APP_NAME" value="cx-mail"/> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}\t%-5level\t%thread\t%logger\t%file:%line\t[%X{traceid}]\t%msg%n"/> <!-- 控制臺輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- INFO 日志文件 --> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/info.${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>64MB</maxFileSize> <maxHistory>15</maxHistory> <totalSizeCap>32GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>UTF-8</charset> <immediateFlush>true</immediateFlush> </encoder> <!-- 排除帶有 apiLogger marker 的日志 --> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> <marker>apiLogger</marker> </evaluator> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> </appender> <!-- ERROR 日志文件 --> <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/error.${APP_NAME}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern> <maxFileSize>64MB</maxFileSize> <maxHistory>15</maxHistory> <totalSizeCap>32GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>${LOG_PATTERN}</pattern> <charset>UTF-8</charset> <immediateFlush>true</immediateFlush> </encoder> <!-- 僅記錄 ERROR 級別的日志 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- 排除帶有 apiLogger marker 的日志 --> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> <marker>apiLogger</marker> </evaluator> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> </appender> <!-- graylog日志配置 --> <appender name="GELF_LOG" class="de.siegmar.logbackgelf.GelfUdpAppender"> <!-- Graylog服務(wù)的地址 --> <graylogHost>10.0.32.199</graylogHost> <!-- UDP Input端口 --> <graylogPort>12201</graylogPort> <!--以下為可選配置--> <maxChunkSize>508</maxChunkSize> <useCompression>true</useCompression> <encoder class="de.siegmar.logbackgelf.GelfEncoder"> <!-- 是否發(fā)送原生的日志信息 --> <includeRawMessage>true</includeRawMessage> <includeMarker>true</includeMarker> <includeMdcData>true</includeMdcData> <includeCallerData>true</includeCallerData> <includeRootCauseData>true</includeRootCauseData> <includeLevelName>true</includeLevelName> <!-- 是否發(fā)送日志級別的名稱,否則默認(rèn)以數(shù)字代表日志級別 --> <includeLevelName>true</includeLevelName> <shortPatternLayout class="ch.qos.logback.classic.PatternLayout"> <pattern>%m%nopex</pattern> </shortPatternLayout> <fullPatternLayout class="ch.qos.logback.classic.PatternLayout"> <!-- 使用定義的格式模式 --> <pattern>[%-5level]\t%d{yyyy-MM-dd HH:mm:ss.SSS}\t%thread\t%logger\t%file:%line\t[%X{traceid}]\t%msg%n</pattern> </fullPatternLayout> <!-- 配置應(yīng)用名稱(服務(wù)名稱),通過staticField標(biāo)簽可以自定義一些固定的日志字段 --> <staticField>app_name:${APP_NAME}</staticField> </encoder> </appender> <logger name="com.cx" level="INFO"/> <!-- 日志級別排序?yàn)椋?TRACE < DEBUG < INFO < WARN < ERROR --> <root level="INFO"> <appender-ref ref="STDOUT"/> <appender-ref ref="INFO_FILE"/> <appender-ref ref="ERROR_FILE"/> <appender-ref ref="GELF_LOG"/> </root> </configuration>
配置GrayLog
此時需要配置GrayLog 的input選擇 新增TCP 或 UDP 的輸入
測試日志收集
到此這篇關(guān)于基于Docker搭建Graylog分布式日志采集系統(tǒng)的文章就介紹到這了,更多相關(guān)docker搭建Graylog分布式日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
centos6使用docker部署zookeeper操作示例
這篇文章主要介紹了centos6使用docker部署zookeeper操作,結(jié)合實(shí)例形式分析了centos6平臺使用docker部署zookeeper相關(guān)命令與使用技巧,需要的朋友可以參考下2020-02-02使用Docker Compose搭建 Confluence的教程
本文將介紹如何使用 Docker Compose 快速搭建 Confluence 、以及如何和 Traefik 一同使用,如果你看過之前的內(nèi)容,跟隨本文應(yīng)該能在十分鐘內(nèi)解決戰(zhàn)斗,感興趣的朋友快來看看吧2021-06-06Docker出現(xiàn)Cannot connect to the Docker daemon. Is the docker d
這篇文章主要介紹了Docker出現(xiàn)Cannot connect to the Docker daemon. Is the docker daemon running on this host錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12Docker 制作鏡像Dockerfile和commit操作
這篇文章主要介紹了Docker 制作鏡像Dockerfile和commit操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11docker在win10家庭版下構(gòu)建laravel開發(fā)環(huán)境的教程詳解
這篇文章主要介紹了docker在win10家庭版下構(gòu)建laravel開發(fā)環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Docker部署ElasticSearch和ElasticSearch-Head的實(shí)現(xiàn)
這篇文章主要介紹了Docker部署ElasticSearch和ElasticSearch-Head的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12在docker-compose.yml文件中配置容器的環(huán)境變量方式
本文介紹了在docker-compose.yml文件中設(shè)置和使用環(huán)境變量的方法,包括直接設(shè)置環(huán)境變量、從文件讀取環(huán)境變量以及使用多個環(huán)境文件進(jìn)行不同部署環(huán)境的配置2024-11-11