diff --git a/internal/web/actions/default/servers/fixLog.go b/internal/web/actions/default/clusters/logs/fix.go
similarity index 55%
rename from internal/web/actions/default/servers/fixLog.go
rename to internal/web/actions/default/clusters/logs/fix.go
index 09d40379..22dca5f4 100644
--- a/internal/web/actions/default/servers/fixLog.go
+++ b/internal/web/actions/default/clusters/logs/fix.go
@@ -1,19 +1,28 @@
 // Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 
-package servers
+package logs
 
 import (
 	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+	"github.com/iwind/TeaGo/types"
+	"strings"
 )
 
-type FixLogAction struct {
+type FixAction struct {
 	actionutils.ParentAction
 }
 
-func (this *FixLogAction) RunPost(params struct {
+func (this *FixAction) RunPost(params struct {
 	LogIds []int64
 }) {
+	var logIdStrings = []string{}
+	for _, logId := range params.LogIds {
+		logIdStrings = append(logIdStrings, types.String(logId))
+	}
+
+	defer this.CreateLogInfo("设置日志 %s 为已修复", strings.Join(logIdStrings, ", "))
+
 	_, err := this.RPC().NodeLogRPC().FixNodeLogs(this.AdminContext(), &pb.FixNodeLogsRequest{NodeLogIds: params.LogIds})
 	if err != nil {
 		this.ErrorPage(err)
diff --git a/internal/web/actions/default/clusters/logs/fixAll.go b/internal/web/actions/default/clusters/logs/fixAll.go
new file mode 100644
index 00000000..8ffb541c
--- /dev/null
+++ b/internal/web/actions/default/clusters/logs/fixAll.go
@@ -0,0 +1,25 @@
+// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
+
+package logs
+
+import (
+	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+)
+
+type FixAllAction struct {
+	actionutils.ParentAction
+}
+
+func (this *FixAllAction) RunPost(params struct {
+}) {
+	defer this.CreateLogInfo("设置所有日志为已修复")
+
+	_, err := this.RPC().NodeLogRPC().FixAllNodeLogs(this.AdminContext(), &pb.FixAllNodeLogsRequest{})
+	if err != nil {
+		this.ErrorPage(err)
+		return
+	}
+
+	this.Success()
+}
diff --git a/internal/web/actions/default/clusters/logs/index.go b/internal/web/actions/default/clusters/logs/index.go
index febe6d9f..7d6801de 100644
--- a/internal/web/actions/default/clusters/logs/index.go
+++ b/internal/web/actions/default/clusters/logs/index.go
@@ -3,8 +3,10 @@ package logs
 import (
 	"github.com/TeaOSLab/EdgeAdmin/internal/utils/nodelogutils"
 	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
+	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
 	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
+	"github.com/iwind/TeaGo/lists"
 	"github.com/iwind/TeaGo/maps"
 	timeutil "github.com/iwind/TeaGo/utils/time"
 )
@@ -14,8 +16,11 @@ type IndexAction struct {
 }
 
 func (this *IndexAction) Init() {
-	if this.ParamString("type") == "unread" {
+	var paramType = this.ParamString("type")
+	if paramType == "unread" {
 		this.FirstMenu("unread")
+	} else if paramType == "needFix" {
+		this.FirstMenu("needFix")
 	} else {
 		this.FirstMenu("index")
 	}
@@ -26,7 +31,7 @@ func (this *IndexAction) RunGet(params struct {
 	DayTo     string
 	Keyword   string
 	Level     string
-	Type      string
+	Type      string // unread, needFix
 	Tag       string
 	ClusterId int64
 	NodeId    int64
@@ -40,6 +45,13 @@ func (this *IndexAction) RunGet(params struct {
 	this.Data["clusterId"] = params.ClusterId
 	this.Data["nodeId"] = params.NodeId
 
+	var fixedState configutils.BoolState = 0
+	var allServers = false
+	if params.Type == "needFix" {
+		fixedState = configutils.BoolStateNo
+		allServers = true
+	}
+
 	// 常见标签
 	this.Data["tags"] = nodelogutils.FindNodeCommonTags()
 
@@ -54,6 +66,18 @@ func (this *IndexAction) RunGet(params struct {
 	}
 	this.Data["countUnreadLogs"] = countUnreadResp.Count
 
+	// 需要修复数量
+	countNeedFixResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
+		Role:       nodeconfigs.NodeRoleNode,
+		AllServers: true,
+		FixedState: int32(configutils.BoolStateNo),
+	})
+	if err != nil {
+		this.ErrorPage(err)
+		return
+	}
+	this.Data["countNeedFixLogs"] = countNeedFixResp.Count
+
 	// 日志数量
 	countResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
 		NodeClusterId: params.ClusterId,
@@ -65,13 +89,15 @@ func (this *IndexAction) RunGet(params struct {
 		Level:         params.Level,
 		IsUnread:      params.Type == "unread",
 		Tag:           params.Tag,
+		FixedState:    int32(fixedState),
+		AllServers:    allServers,
 	})
 	if err != nil {
 		this.ErrorPage(err)
 		return
 	}
-	count := countResp.Count
-	page := this.NewPage(count)
+	var count = countResp.Count
+	var page = this.NewPage(count)
 	this.Data["page"] = page.AsHTML()
 
 	logsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
@@ -84,6 +110,8 @@ func (this *IndexAction) RunGet(params struct {
 		Level:         params.Level,
 		IsUnread:      params.Type == "unread",
 		Tag:           params.Tag,
+		FixedState:    int32(fixedState),
+		AllServers:    allServers,
 		Offset:        page.Offset,
 		Size:          page.Size,
 	})
@@ -92,14 +120,14 @@ func (this *IndexAction) RunGet(params struct {
 		return
 	}
 
-	logs := []maps.Map{}
+	var logs = []maps.Map{}
 	for _, log := range logsResp.NodeLogs {
 		// 节点信息
 		nodeResp, err := this.RPC().NodeRPC().FindEnabledNode(this.AdminContext(), &pb.FindEnabledNodeRequest{NodeId: log.NodeId})
 		if err != nil {
 			continue
 		}
-		node := nodeResp.Node
+		var node = nodeResp.Node
 		if node == nil || node.NodeCluster == nil {
 			continue
 		}
@@ -118,6 +146,11 @@ func (this *IndexAction) RunGet(params struct {
 			}
 		}
 
+		var isFixed = true
+		if !log.IsFixed && log.ServerId > 0 && lists.ContainsString([]string{"success", "warning", "error"}, log.Level) {
+			isFixed = false
+		}
+
 		logs = append(logs, maps.Map{
 			"id":          log.Id,
 			"tag":         log.Tag,
@@ -127,6 +160,7 @@ func (this *IndexAction) RunGet(params struct {
 			"isToday":     timeutil.FormatTime("Y-m-d", log.CreatedAt) == timeutil.Format("Y-m-d"),
 			"count":       log.Count,
 			"isRead":      log.IsRead,
+			"isFixed":     isFixed,
 			"node": maps.Map{
 				"id": node.Id,
 				"cluster": maps.Map{
diff --git a/internal/web/actions/default/clusters/logs/init.go b/internal/web/actions/default/clusters/logs/init.go
index eb5a6c06..19cc5e54 100644
--- a/internal/web/actions/default/clusters/logs/init.go
+++ b/internal/web/actions/default/clusters/logs/init.go
@@ -16,6 +16,8 @@ func init() {
 			Get("", new(IndexAction)).
 			Post("/readLogs", new(ReadLogsAction)).
 			Post("/readAllLogs", new(ReadAllLogsAction)).
+			Post("/fix", new(FixAction)).
+			Post("/fixAll", new(FixAllAction)).
 			EndAll()
 	})
 }
diff --git a/internal/web/actions/default/servers/index.go b/internal/web/actions/default/servers/index.go
index c34bb6b0..f18c5d1c 100644
--- a/internal/web/actions/default/servers/index.go
+++ b/internal/web/actions/default/servers/index.go
@@ -5,7 +5,6 @@ import (
 	"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
 	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 	"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
-	"github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs"
 	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 	"github.com/iwind/TeaGo/maps"
@@ -260,72 +259,16 @@ func (this *IndexAction) RunGet(params struct {
 	// 是否有用户管理权限
 	this.Data["canVisitUser"] = configloaders.AllowModule(this.AdminId(), configloaders.AdminModuleCodeUser)
 
-	// 显示服务相关的日志
-	errorLogsResp, err := this.RPC().NodeLogRPC().ListNodeLogs(this.AdminContext(), &pb.ListNodeLogsRequest{
-		NodeId:     0,
-		Role:       nodeconfigs.NodeRoleNode,
-		Offset:     0,
-		Size:       20,
-		Level:      "error,success,warning",
-		FixedState: int32(configutils.BoolStateNo),
+	// 显示服务需要修复的日志数量
+	countNeedFixLogsResp, err := this.RPC().NodeLogRPC().CountNodeLogs(this.AdminContext(), &pb.CountNodeLogsRequest{
 		AllServers: true,
+		FixedState: int32(configutils.BoolStateNo),
 	})
 	if err != nil {
 		this.ErrorPage(err)
 		return
 	}
-	errorLogMaps := []maps.Map{}
-	for _, errorLog := range errorLogsResp.NodeLogs {
-		serverResp, err := this.RPC().ServerRPC().FindEnabledUserServerBasic(this.AdminContext(), &pb.FindEnabledUserServerBasicRequest{ServerId: errorLog.ServerId})
-		if err != nil {
-			this.ErrorPage(err)
-			return
-		}
-
-		// 服务
-		var server = serverResp.Server
-		if server == nil {
-			// 设置为已修复
-			_, err = this.RPC().NodeLogRPC().FixNodeLogs(this.AdminContext(), &pb.FixNodeLogsRequest{NodeLogIds: []int64{errorLog.Id}})
-			if err != nil {
-				this.ErrorPage(err)
-				return
-			}
-
-			continue
-		}
-
-		// 节点
-		nodeResp, err := this.RPC().NodeRPC().FindEnabledNode(this.AdminContext(), &pb.FindEnabledNodeRequest{NodeId: errorLog.NodeId})
-		if err != nil {
-			this.ErrorPage(err)
-			return
-		}
-		var node = nodeResp.Node
-		if node == nil || node.NodeCluster == nil {
-			// 设置为已修复
-			_, err = this.RPC().NodeLogRPC().FixNodeLogs(this.AdminContext(), &pb.FixNodeLogsRequest{NodeLogIds: []int64{errorLog.Id}})
-			if err != nil {
-				this.ErrorPage(err)
-				return
-			}
-
-			continue
-		}
-
-		errorLogMaps = append(errorLogMaps, maps.Map{
-			"id":          errorLog.Id,
-			"description": errorLog.Description,
-			"createdTime": timeutil.FormatTime("Y-m-d H:i:s", errorLog.CreatedAt),
-			"serverId":    errorLog.ServerId,
-			"level":       errorLog.Level,
-			"serverName":  server.Name,
-			"nodeId":      node.Id,
-			"nodeName":    node.Name,
-			"clusterId":   node.NodeCluster.Id,
-		})
-	}
-	this.Data["errorLogs"] = errorLogMaps
+	this.Data["countNeedFixLogs"] = countNeedFixLogsResp.Count
 
 	this.Show()
 }
diff --git a/internal/web/actions/default/servers/init.go b/internal/web/actions/default/servers/init.go
index 0425486e..622bd2cc 100644
--- a/internal/web/actions/default/servers/init.go
+++ b/internal/web/actions/default/servers/init.go
@@ -17,7 +17,6 @@ func init() {
 			Get("", new(IndexAction)).
 			GetPost("/create", new(CreateAction)).
 			GetPost("/update", new(UpdateAction)).
-			Post("/fixLog", new(FixLogAction)).
 			Post("/nearby", new(NearbyAction)).
 
 			//
diff --git a/web/views/@default/clusters/logs/@menu.html b/web/views/@default/clusters/logs/@menu.html
index 356f5ded..c6d1050e 100644
--- a/web/views/@default/clusters/logs/@menu.html
+++ b/web/views/@default/clusters/logs/@menu.html
@@ -1,4 +1,5 @@
 
暂时还没有日志。
+ + + +暂时还没有未读需修复日志。
| 集群 | 节点 | 信息 | -操作 | +操作 | 
|---|
| - 已读 + 已修复 + 已读 |