mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Allow manager logging to set SQL (#20064)
This PR adds a new manager command to switch on SQL logging and to turn it off. ``` gitea manager logging log-sql gitea manager logging log-sql --off ``` Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		| @@ -174,6 +174,18 @@ var ( | |||||||
| 						Action: runAddSMTPLogger, | 						Action: runAddSMTPLogger, | ||||||
| 					}, | 					}, | ||||||
| 				}, | 				}, | ||||||
|  | 			}, { | ||||||
|  | 				Name:  "log-sql", | ||||||
|  | 				Usage: "Set LogSQL", | ||||||
|  | 				Flags: []cli.Flag{ | ||||||
|  | 					cli.BoolFlag{ | ||||||
|  | 						Name: "debug", | ||||||
|  | 					}, cli.BoolFlag{ | ||||||
|  | 						Name:  "off", | ||||||
|  | 						Usage: "Switch off SQL logging", | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 				Action: runSetLogSQL, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| @@ -381,3 +393,18 @@ func runReleaseReopenLogging(c *cli.Context) error { | |||||||
| 	fmt.Fprintln(os.Stdout, msg) | 	fmt.Fprintln(os.Stdout, msg) | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func runSetLogSQL(c *cli.Context) error { | ||||||
|  | 	ctx, cancel := installSignals() | ||||||
|  | 	defer cancel() | ||||||
|  | 	setup("manager", c.Bool("debug")) | ||||||
|  |  | ||||||
|  | 	statusCode, msg := private.SetLogSQL(ctx, !c.Bool("off")) | ||||||
|  | 	switch statusCode { | ||||||
|  | 	case http.StatusInternalServerError: | ||||||
|  | 		return fail("InternalServerError", msg) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	fmt.Fprintln(os.Stdout, msg) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|   | |||||||
| @@ -287,3 +287,12 @@ func GetMaxID(beanOrTableName interface{}) (maxID int64, err error) { | |||||||
| 	_, err = x.Select("MAX(id)").Table(beanOrTableName).Get(&maxID) | 	_, err = x.Select("MAX(id)").Table(beanOrTableName).Get(&maxID) | ||||||
| 	return maxID, err | 	return maxID, err | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func SetLogSQL(ctx context.Context, on bool) { | ||||||
|  | 	e := GetEngine(ctx) | ||||||
|  | 	if x, ok := e.(*xorm.Engine); ok { | ||||||
|  | 		x.ShowSQL(on) | ||||||
|  | 	} else if sess, ok := e.(*xorm.Session); ok { | ||||||
|  | 		sess.Engine().ShowSQL(on) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ package db | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"sync/atomic" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
|  |  | ||||||
| @@ -14,15 +15,19 @@ import ( | |||||||
|  |  | ||||||
| // XORMLogBridge a logger bridge from Logger to xorm | // XORMLogBridge a logger bridge from Logger to xorm | ||||||
| type XORMLogBridge struct { | type XORMLogBridge struct { | ||||||
| 	showSQL bool | 	showSQLint *int32 | ||||||
| 	logger  log.Logger | 	logger     log.Logger | ||||||
| } | } | ||||||
|  |  | ||||||
| // NewXORMLogger inits a log bridge for xorm | // NewXORMLogger inits a log bridge for xorm | ||||||
| func NewXORMLogger(showSQL bool) xormlog.Logger { | func NewXORMLogger(showSQL bool) xormlog.Logger { | ||||||
|  | 	showSQLint := int32(0) | ||||||
|  | 	if showSQL { | ||||||
|  | 		showSQLint = 1 | ||||||
|  | 	} | ||||||
| 	return &XORMLogBridge{ | 	return &XORMLogBridge{ | ||||||
| 		showSQL: showSQL, | 		showSQLint: &showSQLint, | ||||||
| 		logger:  log.GetLogger("xorm"), | 		logger:     log.GetLogger("xorm"), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -94,14 +99,16 @@ func (l *XORMLogBridge) SetLevel(lvl xormlog.LogLevel) { | |||||||
|  |  | ||||||
| // ShowSQL set if record SQL | // ShowSQL set if record SQL | ||||||
| func (l *XORMLogBridge) ShowSQL(show ...bool) { | func (l *XORMLogBridge) ShowSQL(show ...bool) { | ||||||
| 	if len(show) > 0 { | 	showSQL := int32(1) | ||||||
| 		l.showSQL = show[0] | 	if len(show) > 0 && !show[0] { | ||||||
| 	} else { | 		showSQL = 0 | ||||||
| 		l.showSQL = true |  | ||||||
| 	} | 	} | ||||||
|  | 	atomic.StoreInt32(l.showSQLint, showSQL) | ||||||
| } | } | ||||||
|  |  | ||||||
| // IsShowSQL if record SQL | // IsShowSQL if record SQL | ||||||
| func (l *XORMLogBridge) IsShowSQL() bool { | func (l *XORMLogBridge) IsShowSQL() bool { | ||||||
| 	return l.showSQL | 	showSQL := atomic.LoadInt32(l.showSQLint) | ||||||
|  |  | ||||||
|  | 	return showSQL == 1 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ import ( | |||||||
| 	"io" | 	"io" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
|  | 	"strconv" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| @@ -139,6 +140,24 @@ func ReleaseReopenLogging(ctx context.Context) (int, string) { | |||||||
| 	return http.StatusOK, "Logging Restarted" | 	return http.StatusOK, "Logging Restarted" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // SetLogSQL sets database logging | ||||||
|  | func SetLogSQL(ctx context.Context, on bool) (int, string) { | ||||||
|  | 	reqURL := setting.LocalURL + "api/internal/manager/set-log-sql?on=" + strconv.FormatBool(on) | ||||||
|  |  | ||||||
|  | 	req := newInternalRequest(ctx, reqURL, "POST") | ||||||
|  | 	resp, err := req.Response() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return http.StatusInternalServerError, fmt.Sprintf("Unable to contact gitea: %v", err.Error()) | ||||||
|  | 	} | ||||||
|  | 	defer resp.Body.Close() | ||||||
|  |  | ||||||
|  | 	if resp.StatusCode != http.StatusOK { | ||||||
|  | 		return resp.StatusCode, decodeJSONError(resp).Err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return http.StatusOK, "Log SQL setting set" | ||||||
|  | } | ||||||
|  |  | ||||||
| // LoggerOptions represents the options for the add logger call | // LoggerOptions represents the options for the add logger call | ||||||
| type LoggerOptions struct { | type LoggerOptions struct { | ||||||
| 	Group  string | 	Group  string | ||||||
|   | |||||||
| @@ -68,6 +68,7 @@ func Routes() *web.Route { | |||||||
| 	r.Post("/manager/pause-logging", PauseLogging) | 	r.Post("/manager/pause-logging", PauseLogging) | ||||||
| 	r.Post("/manager/resume-logging", ResumeLogging) | 	r.Post("/manager/resume-logging", ResumeLogging) | ||||||
| 	r.Post("/manager/release-and-reopen-logging", ReleaseReopenLogging) | 	r.Post("/manager/release-and-reopen-logging", ReleaseReopenLogging) | ||||||
|  | 	r.Post("/manager/set-log-sql", SetLogSQL) | ||||||
| 	r.Post("/manager/add-logger", bind(private.LoggerOptions{}), AddLogger) | 	r.Post("/manager/add-logger", bind(private.LoggerOptions{}), AddLogger) | ||||||
| 	r.Post("/manager/remove-logger/{group}/{name}", RemoveLogger) | 	r.Post("/manager/remove-logger/{group}/{name}", RemoveLogger) | ||||||
| 	r.Get("/manager/processes", Processes) | 	r.Get("/manager/processes", Processes) | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/modules/context" | 	"code.gitea.io/gitea/modules/context" | ||||||
| 	"code.gitea.io/gitea/modules/graceful" | 	"code.gitea.io/gitea/modules/graceful" | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| @@ -67,6 +68,12 @@ func ReleaseReopenLogging(ctx *context.PrivateContext) { | |||||||
| 	ctx.PlainText(http.StatusOK, "success") | 	ctx.PlainText(http.StatusOK, "success") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // SetLogSQL re-sets database SQL logging | ||||||
|  | func SetLogSQL(ctx *context.PrivateContext) { | ||||||
|  | 	db.SetLogSQL(ctx, ctx.FormBool("on")) | ||||||
|  | 	ctx.PlainText(http.StatusOK, "success") | ||||||
|  | } | ||||||
|  |  | ||||||
| // RemoveLogger removes a logger | // RemoveLogger removes a logger | ||||||
| func RemoveLogger(ctx *context.PrivateContext) { | func RemoveLogger(ctx *context.PrivateContext) { | ||||||
| 	group := ctx.Params("group") | 	group := ctx.Params("group") | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user