提交 12255da7 authored 作者: 陈泽健's avatar 陈泽健

feat(health-check): 添加传统平台nginx日志导出功能

- 在服务自检脚本中增加nginx错误日志导出逻辑
- 实现通过docker cp将容器内nginx日志拷贝到宿主机
- 添加远程临时文件下载到本地的处理流程
- 增加对ujava容器的检测和日志导出条件判断
- 添加日志文件清理和错误处理机制
- 更新需求文档中的nginx日志导出说明
- 调整chromedriver路径配置注释状态
上级 e0b0e7a5
......@@ -79,9 +79,9 @@ def browser_init(login_type):
# chromedriver下载地址:https://googlechromelabs.github.io/chrome-for-testing/
# 自动化运行服务器的chromedriver路径:
# 云电脑
# service = Service(r'E:\Python\Scripts\chromedriver.exe')
# 自动化虚拟机##
service = Service(r'C:\Program Files\Python310\Scripts\chromedriver.exe')
service = Service(r'E:\Python\Scripts\chromedriver.exe')
# 自动化虚拟机
# service = Service(r'C:\Program Files\Python310\Scripts\chromedriver.exe')
# 尝试创建WebDriver实例并执行初始化操作
try:
# 创建WebDriver实例
......
......@@ -180,8 +180,12 @@
如果有ujava容器:
1、将/var/www/java/api-java-meeting2.0/logs目录下的ubains-INFO-AND-ERROR.log日志文件导出来命名为:对内后端_ubains-INFO-AND-ERROR.log
2、将/var/www/java/external-meeting-api/logs目录下的ubains-INFO-AND-ERROR.log日志文件导出来命名为:对外后端_ubains-INFO-AND-ERROR.log
3、将nginx日志导出:
- 步骤1:通过docker cp将/usr/local/nginx/logs路径下的error.log日志文件拷贝到宿主机上
- 步骤2:再将宿主机上的这份error.log日志文件命名改为nginx_error.log导出到本地
如果有upython容器:
1、将/var/www/html/log目录下的error.log、uinfo.log和uwsgi.log日志文件导出来命名都增加前缀:运维集控_error.log、运维集控_uinfo.log和运维集控_uwsgi.log
新统一平台:
如果有ujava容器:
......
......@@ -1923,7 +1923,7 @@ function Export-ServiceLogs {
Write-Log -Level "INFO" -Message "共 $($logsToExport.Count) 个日志文件待导出..."
Write-Host ""
# 逐个导出日志文件
# 逐个导出日志文件(常规路径:Java/Upython 等)
foreach ($logConfig in $logsToExport) {
$localFileName = $logConfig.Name
$remotePath = $logConfig.RemotePath
......@@ -2006,6 +2006,138 @@ function Export-ServiceLogs {
}
}
# =============================
# 传统平台 nginx 日志导出 (PRD 183-185)
# =============================
if ($PlatformType -eq "old" -and $SystemInfo.HasUjava) {
Write-Host ""
Write-Log -Level "INFO" -Message "[Nginx] 开始执行传统平台 Nginx 日志导出 (docker cp → nginx_error.log) ..."
# 远端临时目录和临时文件路径
$remoteTmpDir = "/tmp"
$remoteTmpFile = "$remoteTmpDir/nginx_error.log"
$localNginxLog = Join-Path $exportDir "nginx_error.log"
# 步骤1:在远端通过 docker cp 将容器内 /usr/local/nginx/logs/error.log 拷贝到宿主机
$remoteScript = @"
set -e
# 检查是否存在 ujava 容器
if ! docker ps --format '{{.Names}}' | grep -E 'ujava' >/dev/null 2>&1; then
echo '[Nginx] 未检测到 ujava 容器,跳过 Nginx 日志导出。'
exit 0
fi
mkdir -p '$remoteTmpDir'
# 优先使用系统识别到的 ujava 容器名(例如 ujava2)
UJAVA_CONTAINER="$($SystemInfo.UjavaContainer)"
if [ -z "\$UJAVA_CONTAINER" ]; then
# 兜底:取第一个匹配 'ujava' 的容器
UJAVA_CONTAINER=\$(docker ps --format '{{.Names}}' | grep -m 1 'ujava' || true)
fi
if [ -z "\$UJAVA_CONTAINER" ]; then
echo '[Nginx] 未找到可用的 ujava 容器名称,无法导出 Nginx 日志。'
exit 1
fi
echo "[Nginx] 使用容器 \$UJAVA_CONTAINER 导出 /usr/local/nginx/logs/error.log ..."
if ! docker cp "\$UJAVA_CONTAINER:/usr/local/nginx/logs/error.log" '$remoteTmpFile' 2>/tmp/nginx_cp_err.log; then
echo '[Nginx] docker cp 失败,无法从容器内拷贝 error.log,详情如下:'
if [ -f /tmp/nginx_cp_err.log ]; then
cat /tmp/nginx_cp_err.log
fi
exit 1
fi
echo "[Nginx] 已将容器内 /usr/local/nginx/logs/error.log 拷贝到宿主机: $remoteTmpFile"
"@
$cpRes = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $remoteScript
$cpOutput = ($cpRes.Output | Out-String).Trim()
if ($cpOutput) {
Write-Log -Level "INFO" -Message ("[Nginx] 远端执行输出: {0}" -f ($cpOutput -replace '\s+', ' '))
}
# 如果 docker cp 脚本异常退出,则记录失败
if ($cpRes.ExitCode -ne 0) {
Write-Log -Level "ERROR" -Message "[Nginx] 远端 docker cp 执行失败,Nginx 日志导出终止。"
$failedFiles += @{
Name = "nginx_error.log"
RemotePath = "/usr/local/nginx/logs/error.log (in-container)"
Reason = "docker cp 失败,详见远端输出"
}
}
elseif ($cpOutput -match "未检测到 ujava 容器,跳过 Nginx 日志导出") {
# 配置有要求:仅在存在 ujava 容器时导出 Nginx 日志
Write-Log -Level "WARN" -Message "[Nginx] 未检测到 ujava 容器,本次跳过 Nginx 日志导出。"
}
else {
# 步骤2:使用 pscp 将远端临时文件下载到本地,并命名为 nginx_error.log
Write-Log -Level "INFO" -Message "[Nginx] 准备将 $remoteTmpFile 下载到本地: $localNginxLog"
$pscpArgs2 = @(
"-scp",
"-batch",
"-P", $Server.Port,
"-l", $Server.User,
"-pw", $Server.Pass,
"$($Server.User)@$($Server.IP):$remoteTmpFile",
$localNginxLog
)
try {
$dlOut = & $script:PSCP_PATH @pscpArgs2 2>&1
$dlCode = $LASTEXITCODE
if ($dlCode -ne 0 -and ($dlOut -match "host key" -or $dlOut -match "Cannot confirm")) {
$cmdLine2 = "echo y | `"$($script:PSCP_PATH)`" -scp -batch -P $($Server.Port) -l $($Server.User) -pw `"$($Server.Pass)`" `"$($Server.User)@$($Server.IP):$remoteTmpFile`" `"$localNginxLog`""
Write-Log -Level "WARN" -Message "[Nginx] 检测到主机密钥提示,自动接受并重试: $cmdLine2"
$dlOut = cmd /c $cmdLine2 2>&1
$dlCode = $LASTEXITCODE
}
if ($dlCode -eq 0 -and (Test-Path $localNginxLog)) {
$sz = (Get-Item $localNginxLog).Length
$szKB = [math]::Round($sz / 1024, 2)
Write-Log -Level "SUCCESS" -Message "[Nginx] nginx_error.log 导出成功 ($szKB KB): $localNginxLog"
$exportedFiles += @{
Name = "nginx_error.log"
RemotePath = "/usr/local/nginx/logs/error.log (via docker cp)"
LocalPath = $localNginxLog
Size = $sz
}
}
else {
Write-Log -Level "ERROR" -Message ("[Nginx] nginx_error.log 下载失败,ExitCode={0}" -f $dlCode)
if ($dlOut) {
$oneLine2 = ($dlOut -join " ") -replace '\s+', ' '
Write-Log -Level "ERROR" -Message ("[Nginx] pscp 输出: {0}" -f $oneLine2)
}
$failedFiles += @{
Name = "nginx_error.log"
RemotePath = $remoteTmpFile
Reason = "下载失败: ExitCode=$dlCode; Output=$dlOut"
}
}
}
catch {
Write-Log -Level "ERROR" -Message "[Nginx] nginx_error.log 下载异常: $($_.Exception.Message)"
$failedFiles += @{
Name = "nginx_error.log"
RemotePath = $remoteTmpFile
Reason = "异常: $($_.Exception.Message)"
}
}
# 远端清理临时文件(最佳实践,可失败不影响主流程)
$cleanCmd = "rm -f '$remoteTmpFile' 2>/dev/null || true"
[void](Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $cleanCmd)
}
}
Write-Host ""
Write-Log -Level "INFO" -Message "日志导出完成: 成功 $($exportedFiles.Count) 个,失败 $($failedFiles.Count) 个"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论