背景
很多時候我們在將開發環境的代碼推送到GitLab上面以后,我們在測試的時候發現了問題后無法通過現有的日志輸出級別來定位問題,比如我們需要看EFCore生成的SQL語句,在生產環境我們是不可能輸出這些語句的,這個時候我們就需要將遠程部署的Docker鏡像拉取到本地然后進行調試,然后再看具體的日志以便排查疑難問題。
比如我們在使用Serilog進行日志記錄的時候,我們會在appsettings.Development.json和appsettings.Production.json中配置不同的Serilog格式
在開發環境:
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], "MinimumLevel": "Information", "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "Logs/Dms.Parts.Parts.log" } } ] }
在這里我們會將日志輸出到本地的log文件中去。
在生產環境:
"Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning", "Abp.Auditing.SimpleLogAuditingStore": "Warning" } }, "WriteTo": [ { "Name": "Console", "Args": { "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact" } } ] }
配置好這些后,我們要做的第一步就是把生產環境的鏡像拉取下來,然后調試,那么具體該怎樣進行操作呢?
操作
1 找到GitLab上面的具體鏡像
圖一 獲取特定服務鏡像名稱
2 登錄GitLab
docker login registry.sdtdev.net
然后輸入當前GitLab的用戶名和密碼,否則是不能進行當前鏡像的拉取操作的。
3 拉取鏡像到本地
docker run -e TZ=Asia/Shanghai -e ASPNETCORE__ENVIRONMENT=Development -e ASPNETCORE__URLS=http://+:80 -p 8082:80 --name ocr --rm registry.sdtdev.net/chery/adapters/ocr/master:40647
這里需要注意的是:
3.1 設置ASPNETCORE_ENVIRONMENT=Development,另外設置當前值為Development是為了保證Serilog日志輸出級別為appsettings.Development.json中配置的日志輸出級別,從而能夠輸出更多的日志出來。
3.2 -p 8082:80將80端口映射為本地8082端口。
3.3 --name表示為當前docker鏡像的別名,這個非常重要的。
3.4 --rm命令在此處的作用是當我們執行docker stop命令停止鏡像的時候,后台會在docker容器中移除當前鏡像。
3.5 如果執行完畢后我們可以通過docker ps 或者docker images 來查看鏡像的啟動情況。
4 本地Postman調試
找到需要進行調試的本地URL,然后進行請求發送。
圖二 本地Postman進行調試
這里需要注意在Windows7上面這個Docker鏡像映射到本地的地址是192.168.99.100,如果是Windows10 此時我們可以使用localhost進行代替,這樣發送請求后,我們就可以在cmd 或者powershell窗口中看到輸出的log文件內容了
圖三 cmd窗口輸出日志文件
通過上面的操作我們就能夠將原本本地調試的development級別的內容從log文件中取出,最后顯示在cmd中從而幫助我們進行線上環境問題的排查,上面就是整個過程。