Browse Source

Added WIP system wide log

Toby Chui 3 years ago
parent
commit
3dd7c868ac
12 changed files with 73 additions and 63 deletions
  1. 1 0
      .gitignore
  2. 1 0
      Makefile
  3. 3 4
      agi.go
  4. 1 2
      apt.go
  5. 3 4
      auth.go
  6. 3 2
      desktop.go
  7. 34 33
      file_system.go
  8. 3 0
      main.flags.go
  9. 2 3
      main.go
  10. 0 2
      mod/database/database_core.go
  11. 20 13
      mod/info/logger/logger.go
  12. 2 0
      startup.go

+ 1 - 0
.gitignore

@@ -23,6 +23,7 @@ system/ao.db.lock
 ./web/aofs.db
 ./web/aofs.db
 system/auth/authlog.db
 system/auth/authlog.db
 fsdb/*
 fsdb/*
+system/logs/*
 
 
 #Setting related
 #Setting related
 system/network/wifi/ap/*
 system/network/wifi/ap/*

+ 1 - 0
Makefile

@@ -42,6 +42,7 @@ web.tar.gz:
 	-rm ./dist/system/storage.json
 	-rm ./dist/system/storage.json
 	# -mv ./dist/system/storage.json ./dist/system/storage.json.example
 	# -mv ./dist/system/storage.json ./dist/system/storage.json.example
 	-rm -rf ./dist/system/aecron/
 	-rm -rf ./dist/system/aecron/
+	-rm -rf ./dist/system/logs/
 	-rm ./dist/system/cron.json
 	-rm ./dist/system/cron.json
 	-rm ./dist/system/bridge.json
 	-rm ./dist/system/bridge.json
 	-rm ./dist/system/auth/authlog.db
 	-rm ./dist/system/auth/authlog.db

+ 3 - 4
agi.go

@@ -1,7 +1,6 @@
 package main
 package main
 
 
 import (
 import (
-	"log"
 	"net/http"
 	"net/http"
 
 
 	agi "imuslab.com/arozos/mod/agi"
 	agi "imuslab.com/arozos/mod/agi"
@@ -30,7 +29,7 @@ func AGIInit() {
 		TempFolderPath:       *tmp_directory,
 		TempFolderPath:       *tmp_directory,
 	})
 	})
 	if err != nil {
 	if err != nil {
-		log.Println("AGI Gateway Initialization Failed")
+		systemWideLogger.PrintAndLog("AGI", "AGI Gateway Initialization Failed", err)
 	}
 	}
 
 
 	//Register user request handler endpoint
 	//Register user request handler endpoint
@@ -54,11 +53,11 @@ func AGIInit() {
 		}
 		}
 
 
 		//Validate Token
 		//Validate Token
-		if authAgent.TokenValid(token) == true {
+		if authAgent.TokenValid(token) {
 			//Valid
 			//Valid
 			thisUsername, err := gw.Option.UserHandler.GetAuthAgent().GetTokenOwner(token)
 			thisUsername, err := gw.Option.UserHandler.GetAuthAgent().GetTokenOwner(token)
 			if err != nil {
 			if err != nil {
-				log.Println(err)
+				systemWideLogger.PrintAndLog("AGI", "Unable to validate token owner", err)
 				w.WriteHeader(http.StatusInternalServerError)
 				w.WriteHeader(http.StatusInternalServerError)
 				w.Write([]byte("500 - Internal Server Error"))
 				w.Write([]byte("500 - Internal Server Error"))
 				return
 				return

+ 1 - 2
apt.go

@@ -1,7 +1,6 @@
 package main
 package main
 
 
 import (
 import (
-	"log"
 	"net/http"
 	"net/http"
 
 
 	apt "imuslab.com/arozos/mod/apt"
 	apt "imuslab.com/arozos/mod/apt"
@@ -12,7 +11,7 @@ import (
 func PackagManagerInit() {
 func PackagManagerInit() {
 	//Create a package manager
 	//Create a package manager
 	packageManager = apt.NewPackageManager(*allow_package_autoInstall)
 	packageManager = apt.NewPackageManager(*allow_package_autoInstall)
-	log.Println("Package Manager Initiated")
+	systemWideLogger.PrintAndLog("APT", "Package Manager Initiated", nil)
 
 
 	//Create a System Setting handler
 	//Create a System Setting handler
 	//aka who can access System Setting can see contents about packages
 	//aka who can access System Setting can see contents about packages

+ 3 - 4
auth.go

@@ -2,7 +2,6 @@ package main
 
 
 import (
 import (
 	"crypto/rand"
 	"crypto/rand"
-	"log"
 	"net/http"
 	"net/http"
 
 
 	auth "imuslab.com/arozos/mod/auth"
 	auth "imuslab.com/arozos/mod/auth"
@@ -20,9 +19,9 @@ func AuthInit() {
 			rand.Read(key)
 			rand.Read(key)
 			newSessionKey := string(key)
 			newSessionKey := string(key)
 			sysdb.Write("auth", "sessionkey", newSessionKey)
 			sysdb.Write("auth", "sessionkey", newSessionKey)
-			log.Println("New authentication session key generated")
+			systemWideLogger.PrintAndLog("Auth", "New authentication session key generated", nil)
 		} else {
 		} else {
-			log.Println("Authentication session key loaded from database")
+			systemWideLogger.PrintAndLog("Auth", "Authentication session key loaded from database", nil)
 
 
 		}
 		}
 		skeyString := ""
 		skeyString := ""
@@ -37,7 +36,7 @@ func AuthInit() {
 		http.Redirect(w, r, common.ConstructRelativePathFromRequestURL(r.RequestURI, "login.system")+"?redirect="+r.URL.Path, 307)
 		http.Redirect(w, r, common.ConstructRelativePathFromRequestURL(r.RequestURI, "login.system")+"?redirect="+r.URL.Path, 307)
 	})
 	})
 
 
-	if *allow_autologin == true {
+	if *allow_autologin {
 		authAgent.AllowAutoLogin = true
 		authAgent.AllowAutoLogin = true
 	} else {
 	} else {
 		//Default is false. But just in case
 		//Default is false. But just in case

+ 3 - 2
desktop.go

@@ -19,7 +19,7 @@ import (
 
 
 //Desktop script initiation
 //Desktop script initiation
 func DesktopInit() {
 func DesktopInit() {
-	log.Println("Starting Desktop Services")
+	systemWideLogger.PrintAndLog("Desktop", "Starting Desktop Services", nil)
 
 
 	router := prout.NewModuleRouter(prout.RouterOption{
 	router := prout.NewModuleRouter(prout.RouterOption{
 		ModuleName:  "Desktop",
 		ModuleName:  "Desktop",
@@ -73,7 +73,8 @@ func desktop_initUserFolderStructure(username string) {
 	userinfo, _ := userHandler.GetUserInfoFromUsername(username)
 	userinfo, _ := userHandler.GetUserInfoFromUsername(username)
 	homedir, err := userinfo.GetHomeDirectory()
 	homedir, err := userinfo.GetHomeDirectory()
 	if err != nil {
 	if err != nil {
-		log.Println(err)
+		systemWideLogger.PrintAndLog("Desktop", "Unable to initiate user desktop folder", err)
+		return
 	}
 	}
 
 
 	if !fs.FileExists(filepath.Join(homedir, "Desktop")) {
 	if !fs.FileExists(filepath.Join(homedir, "Desktop")) {

+ 34 - 33
file_system.go

@@ -4,6 +4,7 @@ import (
 	"crypto/sha256"
 	"crypto/sha256"
 	"encoding/hex"
 	"encoding/hex"
 	"encoding/json"
 	"encoding/json"
+	"errors"
 	"io"
 	"io"
 	"io/fs"
 	"io/fs"
 	"log"
 	"log"
@@ -144,21 +145,21 @@ func FileSystemInit() {
 	//Create user root if not exists
 	//Create user root if not exists
 	err := os.MkdirAll(*root_directory+"users/", 0755)
 	err := os.MkdirAll(*root_directory+"users/", 0755)
 	if err != nil {
 	if err != nil {
-		log.Println("Failed to create system storage root.")
+		systemWideLogger.PrintAndLog("File System", "Failed to create system storage root", err)
 		panic(err)
 		panic(err)
 	}
 	}
 
 
 	//Create database table if not exists
 	//Create database table if not exists
 	err = sysdb.NewTable("fs")
 	err = sysdb.NewTable("fs")
 	if err != nil {
 	if err != nil {
-		log.Println("Failed to create table for file system")
+		systemWideLogger.PrintAndLog("File System", "Failed to create table for file system", err)
 		panic(err)
 		panic(err)
 	}
 	}
 
 
 	//Create new table for sort preference
 	//Create new table for sort preference
 	err = sysdb.NewTable("fs-sortpref")
 	err = sysdb.NewTable("fs-sortpref")
 	if err != nil {
 	if err != nil {
-		log.Println("Failed to create table for file system")
+		systemWideLogger.PrintAndLog("File System", "Failed to create table for file system", err)
 		panic(err)
 		panic(err)
 	}
 	}
 
 
@@ -211,10 +212,10 @@ func FileSystemInit() {
 	go func() {
 	go func() {
 		//Start version history cleaning in background
 		//Start version history cleaning in background
 		system_fs_clearVersionHistories()
 		system_fs_clearVersionHistories()
-		log.Println("[LocVer] Startup File Version History Cleaning Completed")
+		systemWideLogger.PrintAndLog("File System", "Startup File Version History Cleaning Completed", nil)
 
 
 	}()
 	}()
-	log.Println("Started File Version History Cleaning in background")
+	systemWideLogger.PrintAndLog("File System", "Started File Version History Cleaning in background", nil)
 
 
 	nightlyManager.RegisterNightlyTask(system_fs_clearVersionHistories)
 	nightlyManager.RegisterNightlyTask(system_fs_clearVersionHistories)
 }
 }
@@ -443,7 +444,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 	upgrader.CheckOrigin = func(r *http.Request) bool { return true }
 	upgrader.CheckOrigin = func(r *http.Request) bool { return true }
 	c, err := upgrader.Upgrade(w, r, nil)
 	c, err := upgrader.Upgrade(w, r, nil)
 	if err != nil {
 	if err != nil {
-		log.Println("Failed to upgrade websocket connection: ", err.Error())
+		systemWideLogger.PrintAndLog("File System", "Failed to upgrade websocket connection: ", err)
 		w.WriteHeader(http.StatusInternalServerError)
 		w.WriteHeader(http.StatusInternalServerError)
 		w.Write([]byte("500 WebSocket upgrade failed"))
 		w.Write([]byte("500 WebSocket upgrade failed"))
 		return
 		return
@@ -466,7 +467,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 			case <-ticker.C:
 			case <-ticker.C:
 				if time.Now().Unix()-lastChunkArrivalTime > 300 {
 				if time.Now().Unix()-lastChunkArrivalTime > 300 {
 					//Already 5 minutes without new data arraival. Stop connection
 					//Already 5 minutes without new data arraival. Stop connection
-					log.Println("Upload WebSocket connection timeout. Disconnecting.")
+					systemWideLogger.PrintAndLog("File System", "Upload WebSocket connection timeout. Disconnecting.", errors.New("websocket connection timeout"))
 					c.WriteControl(8, []byte{}, time.Now().Add(time.Second))
 					c.WriteControl(8, []byte{}, time.Now().Add(time.Second))
 					time.Sleep(1 * time.Second)
 					time.Sleep(1 * time.Second)
 					c.Close()
 					c.Close()
@@ -481,7 +482,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 		mt, message, err := c.ReadMessage()
 		mt, message, err := c.ReadMessage()
 		if err != nil {
 		if err != nil {
 			//Connection closed by client. Clear the tmp folder and exit
 			//Connection closed by client. Clear the tmp folder and exit
-			log.Println("Upload terminated by client. Cleaning tmp folder.")
+			systemWideLogger.PrintAndLog("File System", "Upload terminated by client. Cleaning tmp folder", err)
 			//Clear the tmp folder
 			//Clear the tmp folder
 			time.Sleep(1 * time.Second)
 			time.Sleep(1 * time.Second)
 			if isHugeFile {
 			if isHugeFile {
@@ -515,7 +516,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 
 
 			if writeErr != nil {
 			if writeErr != nil {
 				//Unable to write block. Is the tmp folder fulled?
 				//Unable to write block. Is the tmp folder fulled?
-				log.Println("[Upload] Upload chunk write failed: " + err.Error())
+				systemWideLogger.PrintAndLog("File System", "Upload chunk write failed: "+err.Error(), err)
 				c.WriteMessage(1, []byte(`{\"error\":\"Write file chunk to disk failed\"}`))
 				c.WriteMessage(1, []byte(`{\"error\":\"Write file chunk to disk failed\"}`))
 
 
 				//Close the connection
 				//Close the connection
@@ -576,7 +577,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 			c.WriteMessage(1, []byte("next"))
 			c.WriteMessage(1, []byte("next"))
 
 
 		}
 		}
-		//log.Println("recv:", len(message), "type", mt)
+		//systemWideLogger.PrintAndLog("File System", ("recv:", len(message), "type", mt)
 	}
 	}
 
 
 	//Try to decode the location if possible
 	//Try to decode the location if possible
@@ -601,7 +602,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 	}
 	}
 
 
 	if err != nil {
 	if err != nil {
-		log.Println("Failed to open file:", err)
+		systemWideLogger.PrintAndLog("File System", "Failed to open file:"+err.Error(), err)
 		c.WriteMessage(1, []byte(`{\"error\":\"Failed to open destination file\"}`))
 		c.WriteMessage(1, []byte(`{\"error\":\"Failed to open destination file\"}`))
 		c.WriteControl(8, []byte{}, time.Now().Add(time.Second))
 		c.WriteControl(8, []byte{}, time.Now().Add(time.Second))
 		time.Sleep(1 * time.Second)
 		time.Sleep(1 * time.Second)
@@ -618,7 +619,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 		}
 		}
 
 
 		if err != nil {
 		if err != nil {
-			log.Println("Failed to open Source Chunk", filesrc, " with error ", err.Error())
+			systemWideLogger.PrintAndLog("File System", "Failed to open Source Chunk"+filesrc+" with error "+err.Error(), err)
 			c.WriteMessage(1, []byte(`{\"error\":\"Failed to open Source Chunk\"}`))
 			c.WriteMessage(1, []byte(`{\"error\":\"Failed to open Source Chunk\"}`))
 			return
 			return
 		}
 		}
@@ -646,7 +647,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 
 
 	if err != nil {
 	if err != nil {
 		// Could not obtain stat, handle error
 		// Could not obtain stat, handle error
-		log.Println("Failed to validate uploaded file: ", mergeFileLocation, ". Error Message: ", err.Error())
+		systemWideLogger.PrintAndLog("File System", "Failed to validate uploaded file: "+mergeFileLocation+". Error Message: "+err.Error(), err)
 		c.WriteMessage(1, []byte(`{\"error\":\"Failed to validate uploaded file\"}`))
 		c.WriteMessage(1, []byte(`{\"error\":\"Failed to validate uploaded file\"}`))
 		return
 		return
 	}
 	}
@@ -665,7 +666,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 		//This is local buffer file. Upload to dest fsh
 		//This is local buffer file. Upload to dest fsh
 		f, err := os.Open(mergeFileLocation)
 		f, err := os.Open(mergeFileLocation)
 		if err != nil {
 		if err != nil {
-			log.Println("Failed to open buffered file at ", mergeFileLocation, " with error ", err.Error())
+			systemWideLogger.PrintAndLog("File System", "Failed to open buffered file at "+mergeFileLocation+" with error "+err.Error(), err)
 			c.WriteMessage(1, []byte(`{\"error\":\"Failed to open buffered object\"}`))
 			c.WriteMessage(1, []byte(`{\"error\":\"Failed to open buffered object\"}`))
 			f.Close()
 			f.Close()
 			return
 			return
@@ -673,7 +674,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 
 
 		err = fsh.FileSystemAbstraction.WriteStream(decodedUploadLocation, f, 0775)
 		err = fsh.FileSystemAbstraction.WriteStream(decodedUploadLocation, f, 0775)
 		if err != nil {
 		if err != nil {
-			log.Println("Failed to write to file system: ", fsh.UUID, " with error ", err.Error())
+			systemWideLogger.PrintAndLog("File System", "Failed to write to file system: "+fsh.UUID+" with error "+err.Error(), err)
 			c.WriteMessage(1, []byte(`{\"error\":\"Failed to upload to remote file system\"}`))
 			c.WriteMessage(1, []byte(`{\"error\":\"Failed to upload to remote file system\"}`))
 			f.Close()
 			f.Close()
 			return
 			return
@@ -685,7 +686,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 	}
 	}
 
 
 	//Log the upload filename
 	//Log the upload filename
-	log.Println(userinfo.Username + " uploaded a file: " + filepath.Base(decodedUploadLocation))
+	systemWideLogger.PrintAndLog("File System", userinfo.Username+" uploaded a file: "+filepath.Base(decodedUploadLocation), nil)
 
 
 	//Set owner of the new uploaded file
 	//Set owner of the new uploaded file
 	userinfo.SetOwnerOfFile(fsh, unescapedPath)
 	userinfo.SetOwnerOfFile(fsh, unescapedPath)
@@ -738,14 +739,14 @@ func system_fs_handleUpload(w http.ResponseWriter, r *http.Request) {
 	err = r.ParseMultipartForm(int64(*upload_buf) << 20)
 	err = r.ParseMultipartForm(int64(*upload_buf) << 20)
 	if err != nil {
 	if err != nil {
 		//Filesize too big
 		//Filesize too big
-		log.Println(err)
+		systemWideLogger.PrintAndLog("File System", "Upload file size too big", err)
 		common.SendErrorResponse(w, "File too large")
 		common.SendErrorResponse(w, "File too large")
 		return
 		return
 	}
 	}
 
 
 	file, handler, err := r.FormFile("file")
 	file, handler, err := r.FormFile("file")
 	if err != nil {
 	if err != nil {
-		log.Println("Error Retrieving File from upload by user: " + userinfo.Username)
+		systemWideLogger.PrintAndLog("File System", "Error Retrieving File from upload by user: "+userinfo.Username, err)
 		common.SendErrorResponse(w, "Unable to parse file from upload")
 		common.SendErrorResponse(w, "Unable to parse file from upload")
 		return
 		return
 	}
 	}
@@ -823,12 +824,12 @@ func system_fs_handleUpload(w http.ResponseWriter, r *http.Request) {
 	//Move the file to destination file location
 	//Move the file to destination file location
 	if *enable_asyncFileUpload {
 	if *enable_asyncFileUpload {
 		//Use Async upload method
 		//Use Async upload method
-		log.Println("[File System] AsyncFileUpload flag has been deprecated. Falling back to blocking upload.")
+		systemWideLogger.PrintAndLog("File System", "AsyncFileUpload flag has been deprecated. Falling back to blocking upload.", errors.New("call to deprecated flag: asyncFileUpload"))
 	}
 	}
 
 
 	err = targetFs.WriteStream(destFilepath, file, 0775)
 	err = targetFs.WriteStream(destFilepath, file, 0775)
 	if err != nil {
 	if err != nil {
-		log.Println(err.Error())
+		systemWideLogger.PrintAndLog("File System", "Write stream to destination file system abstraction from upload failed", err)
 	}
 	}
 	file.Close()
 	file.Close()
 
 
@@ -847,7 +848,7 @@ func system_fs_handleUpload(w http.ResponseWriter, r *http.Request) {
 	*/
 	*/
 
 
 	//Fnish upload. Fix the tmp filename
 	//Fnish upload. Fix the tmp filename
-	log.Println(userinfo.Username + " uploaded a file: " + handler.Filename)
+	systemWideLogger.PrintAndLog("File System", userinfo.Username+" uploaded a file: "+handler.Filename, nil)
 
 
 	//Do upload finishing stuff
 	//Do upload finishing stuff
 
 
@@ -1085,7 +1086,7 @@ func system_fs_restoreFile(w http.ResponseWriter, r *http.Request) {
 	originalFilename := strings.TrimSuffix(filepath.Base(realpath), filepath.Ext(filepath.Base(realpath)))
 	originalFilename := strings.TrimSuffix(filepath.Base(realpath), filepath.Ext(filepath.Base(realpath)))
 	restoreFolderRoot := filepath.Dir(filepath.Dir(filepath.Dir(realpath)))
 	restoreFolderRoot := filepath.Dir(filepath.Dir(filepath.Dir(realpath)))
 	targetPath := filepath.ToSlash(filepath.Join(restoreFolderRoot, originalFilename))
 	targetPath := filepath.ToSlash(filepath.Join(restoreFolderRoot, originalFilename))
-	//log.Println(targetPath)
+	//systemWideLogger.PrintAndLog("File System", (targetPath)
 	fshAbs.Rename(realpath, targetPath)
 	fshAbs.Rename(realpath, targetPath)
 
 
 	//Check if the parent dir has no more fileds. If yes, remove it
 	//Check if the parent dir has no more fileds. If yes, remove it
@@ -1217,7 +1218,7 @@ func system_fs_handleNewObjects(w http.ResponseWriter, r *http.Request) {
 
 
 		jsonString, err := json.Marshal(newItemList)
 		jsonString, err := json.Marshal(newItemList)
 		if err != nil {
 		if err != nil {
-			log.Println("*File System* Unable to parse JSON string for new item list!")
+			systemWideLogger.PrintAndLog("File System", "Unable to parse JSON string for new item list", err)
 			common.SendErrorResponse(w, "Unable to parse new item list. See server log for more information.")
 			common.SendErrorResponse(w, "Unable to parse new item list. See server log for more information.")
 			return
 			return
 		}
 		}
@@ -1274,7 +1275,7 @@ func system_fs_handleNewObjects(w http.ResponseWriter, r *http.Request) {
 
 
 			err = fshAbs.WriteFile(newfilePath, defaultFileCotent, 0775)
 			err = fshAbs.WriteFile(newfilePath, defaultFileCotent, 0775)
 			if err != nil {
 			if err != nil {
-				log.Println("[File System] Unable to create new file: " + err.Error())
+				systemWideLogger.PrintAndLog("File System", "Unable to create new file: "+err.Error(), err)
 				common.SendErrorResponse(w, err.Error())
 				common.SendErrorResponse(w, err.Error())
 				return
 				return
 			}
 			}
@@ -1330,7 +1331,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 	decodedSourceFiles, _ := url.QueryUnescape(vsrcFiles)
 	decodedSourceFiles, _ := url.QueryUnescape(vsrcFiles)
 	err = json.Unmarshal([]byte(decodedSourceFiles), &sourceFiles)
 	err = json.Unmarshal([]byte(decodedSourceFiles), &sourceFiles)
 	if err != nil {
 	if err != nil {
-		log.Println("Source file JSON parse error.", err.Error())
+		systemWideLogger.PrintAndLog("File System", "Websocket file operation source file JSON parse error", err)
 		common.SendErrorResponse(w, "Source file JSON parse error.")
 		common.SendErrorResponse(w, "Source file JSON parse error.")
 		return
 		return
 	}
 	}
@@ -1356,7 +1357,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 
 
 	//Permission checking
 	//Permission checking
 	if !userinfo.CanWrite(vdestFile) {
 	if !userinfo.CanWrite(vdestFile) {
-		log.Println("Access denied for " + userinfo.Username + " try to access " + vdestFile)
+		systemWideLogger.PrintAndLog("File System", "Access denied for "+userinfo.Username+" try to access "+vdestFile, nil)
 		w.WriteHeader(http.StatusForbidden)
 		w.WriteHeader(http.StatusForbidden)
 		w.Write([]byte("403 - Access Denied"))
 		w.Write([]byte("403 - Access Denied"))
 		return
 		return
@@ -1366,7 +1367,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 	if operation == "move" || operation == "copy" || operation == "zip" || operation == "unzip" {
 	if operation == "move" || operation == "copy" || operation == "zip" || operation == "unzip" {
 
 
 	} else {
 	} else {
-		log.Println("This file operation is not supported on WebSocket file operations endpoint. Please use the legacy endpoint instead. Received: ", operation)
+		systemWideLogger.PrintAndLog("File System", "This file operation is not supported on WebSocket file operations endpoint. Please use the legacy endpoint instead. Received: "+operation, errors.New("operaiton not supported on websocket endpoint"))
 		w.WriteHeader(http.StatusInternalServerError)
 		w.WriteHeader(http.StatusInternalServerError)
 		w.Write([]byte("500 - Not supported operation"))
 		w.Write([]byte("500 - Not supported operation"))
 		return
 		return
@@ -1468,7 +1469,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 			f, _ := os.Open(zipDestPath)
 			f, _ := os.Open(zipDestPath)
 			err = destFshAbs.WriteStream(outputFilename, f, 0775)
 			err = destFshAbs.WriteStream(outputFilename, f, 0775)
 			if err != nil {
 			if err != nil {
-				log.Println("[File System] Zip write to remote file system error: ", err.Error())
+				systemWideLogger.PrintAndLog("File System", "Zip write to remote file system with driver"+destFsh.Filesystem+" failed", err)
 			}
 			}
 			f.Close()
 			f.Close()
 
 
@@ -1859,7 +1860,7 @@ func system_fs_handleOpr(w http.ResponseWriter, r *http.Request) {
 				targetNewName := filepath.Join(filepath.Dir(rsrcFile), thisFilename)
 				targetNewName := filepath.Join(filepath.Dir(rsrcFile), thisFilename)
 				err = srcFshAbs.Rename(rsrcFile, targetNewName)
 				err = srcFshAbs.Rename(rsrcFile, targetNewName)
 				if err != nil {
 				if err != nil {
-					log.Println(err)
+					systemWideLogger.PrintAndLog("File System", "File rename failed", err)
 					common.SendErrorResponse(w, err.Error())
 					common.SendErrorResponse(w, err.Error())
 					return
 					return
 				}
 				}
@@ -2502,7 +2503,7 @@ func system_fs_handleList(w http.ResponseWriter, r *http.Request) {
 			os.MkdirAll(filepath.Clean(realpath), 0775)
 			os.MkdirAll(filepath.Clean(realpath), 0775)
 		} else {
 		} else {
 			//Folder not exists
 			//Folder not exists
-			log.Println("[File Explorer] Requested path: ", realpath, " does not exists!")
+			systemWideLogger.PrintAndLog("File System", "Requested path: "+realpath+" does not exists", nil)
 			common.SendErrorResponse(w, "Folder not exists")
 			common.SendErrorResponse(w, "Folder not exists")
 			return
 			return
 		}
 		}
@@ -2516,7 +2517,7 @@ func system_fs_handleList(w http.ResponseWriter, r *http.Request) {
 	//Check for really special exception in where the path contains [ or ] which cannot be handled via Golang Glob function
 	//Check for really special exception in where the path contains [ or ] which cannot be handled via Golang Glob function
 	files, err := fshAbs.Glob(realpath + "/*")
 	files, err := fshAbs.Glob(realpath + "/*")
 	if err != nil {
 	if err != nil {
-		log.Println("[File System] Unable to list dir: " + err.Error())
+		systemWideLogger.PrintAndLog("File System", "Unable to list dir: "+err.Error(), err)
 		return
 		return
 	}
 	}
 	var shortCutInfo *shortcut.ShortcutData = nil
 	var shortCutInfo *shortcut.ShortcutData = nil
@@ -3178,14 +3179,14 @@ func bufferRemoteFileToLocal(targetFsh *filesystem.FileSystemHandler, rpath stri
 	newBufferFilename := getFsBufferFilepath(rpath, keepOriginalName)
 	newBufferFilename := getFsBufferFilepath(rpath, keepOriginalName)
 	src, err := targetFsh.FileSystemAbstraction.ReadStream(rpath)
 	src, err := targetFsh.FileSystemAbstraction.ReadStream(rpath)
 	if err != nil {
 	if err != nil {
-		log.Println("[File System] Buffer from remote to local failed: ", err.Error())
+		systemWideLogger.PrintAndLog("File System", "Buffer from remote to local failed: "+err.Error(), err)
 		return "", err
 		return "", err
 	}
 	}
 	defer src.Close()
 	defer src.Close()
 
 
 	dest, err := os.OpenFile(newBufferFilename, os.O_CREATE|os.O_WRONLY, 0775)
 	dest, err := os.OpenFile(newBufferFilename, os.O_CREATE|os.O_WRONLY, 0775)
 	if err != nil {
 	if err != nil {
-		log.Println("[File System] Buffer from remote to local failed: ", err.Error())
+		systemWideLogger.PrintAndLog("File System", "Buffer from remote to local failed: "+err.Error(), err)
 		return "", err
 		return "", err
 	}
 	}
 	io.Copy(dest, src)
 	io.Copy(dest, src)

+ 3 - 0
main.flags.go

@@ -8,6 +8,7 @@ import (
 	apt "imuslab.com/arozos/mod/apt"
 	apt "imuslab.com/arozos/mod/apt"
 	auth "imuslab.com/arozos/mod/auth"
 	auth "imuslab.com/arozos/mod/auth"
 	db "imuslab.com/arozos/mod/database"
 	db "imuslab.com/arozos/mod/database"
+	"imuslab.com/arozos/mod/info/logger"
 	permission "imuslab.com/arozos/mod/permission"
 	permission "imuslab.com/arozos/mod/permission"
 	user "imuslab.com/arozos/mod/user"
 	user "imuslab.com/arozos/mod/user"
 	"imuslab.com/arozos/mod/www"
 	"imuslab.com/arozos/mod/www"
@@ -41,6 +42,7 @@ var iconSystem = "img/vendor/system_icon.png"          //System icon location
 var max_upload_size int64 = 8192 << 20                         //Maxmium upload size, default 8GB
 var max_upload_size int64 = 8192 << 20                         //Maxmium upload size, default 8GB
 var sudo_mode bool = (os.Geteuid() == 0 || os.Geteuid() == -1) //Check if the program is launched as sudo mode or -1 on windows
 var sudo_mode bool = (os.Geteuid() == 0 || os.Geteuid() == -1) //Check if the program is launched as sudo mode or -1 on windows
 var startupTime int64 = time.Now().Unix()                      //The startup time of the ArozOS Core
 var startupTime int64 = time.Now().Unix()                      //The startup time of the ArozOS Core
+var systemWideLogger *logger.Logger                            //The sync map to store all system wide loggers
 
 
 // =========== SYSTEM FLAGS ==============
 // =========== SYSTEM FLAGS ==============
 //Flags related to System startup
 //Flags related to System startup
@@ -88,6 +90,7 @@ var enable_buffering = flag.Bool("enable_buffpool", true, "Enable buffer pool fo
 //Flags related to compatibility or testing
 //Flags related to compatibility or testing
 var enable_beta_scanning_support = flag.Bool("beta_scan", false, "Allow compatibility to ArOZ Online Beta Clusters")
 var enable_beta_scanning_support = flag.Bool("beta_scan", false, "Allow compatibility to ArOZ Online Beta Clusters")
 var enable_console = flag.Bool("console", false, "Enable the debugging console.")
 var enable_console = flag.Bool("console", false, "Enable the debugging console.")
+var enable_logging = flag.Bool("logging", true, "Enable logging to file for debug purpose")
 
 
 //Flags related to running on Cloud Environment or public domain
 //Flags related to running on Cloud Environment or public domain
 var allow_public_registry = flag.Bool("public_reg", false, "Enable public register interface for account creation")
 var allow_public_registry = flag.Bool("public_reg", false, "Enable public register interface for account creation")

+ 2 - 3
main.go

@@ -46,9 +46,8 @@ func executeShutdownSequence() {
 	log.Println("\r- Shutting down storage pools")
 	log.Println("\r- Shutting down storage pools")
 	closeAllStoragePools()
 	closeAllStoragePools()
 
 
-	//Shutdown Subservices
-	log.Println("\r- Shutting down background subservices")
-	//system_subservice_handleShutdown()
+	//Shutdown Logger
+	systemWideLogger.Close()
 
 
 	//Shutdown database
 	//Shutdown database
 	log.Println("\r- Shutting down database")
 	log.Println("\r- Shutting down database")

+ 0 - 2
mod/database/database_core.go

@@ -18,8 +18,6 @@ func newDatabase(dbfile string, readOnlyMode bool) (*Database, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	log.Println("Key-value Database Service Started: " + dbfile)
-
 	tableMap := sync.Map{}
 	tableMap := sync.Map{}
 	//Build the table list from database
 	//Build the table list from database
 	err = db.View(func(tx *bolt.Tx) error {
 	err = db.View(func(tx *bolt.Tx) error {

+ 20 - 13
mod/info/logger/logger.go

@@ -1,6 +1,7 @@
 package logger
 package logger
 
 
 import (
 import (
+	"fmt"
 	"log"
 	"log"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
@@ -16,35 +17,41 @@ import (
 */
 */
 
 
 type Logger struct {
 type Logger struct {
-	Title string
-	file  *os.File
+	LogToFile bool
+	file      *os.File
 }
 }
 
 
-func NewLogger(title string, logFolder string) (*Logger, error) {
-	saveFolder := filepath.Join(logFolder, title)
-	err := os.MkdirAll(saveFolder, 0775)
+func NewLogger(logFilePrefix string, logFolder string, logToFile bool) (*Logger, error) {
+	err := os.MkdirAll(logFolder, 0775)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 	year, month, _ := time.Now().Date()
 	year, month, _ := time.Now().Date()
-	logFilePath := filepath.Join(saveFolder, title+"_"+strconv.Itoa(year)+"-"+strconv.Itoa(int(month))+".log")
+	logFilePath := filepath.Join(logFolder, logFilePrefix+"_"+strconv.Itoa(year)+"-"+strconv.Itoa(int(month))+".log")
 	f, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755)
 	f, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 	return &Logger{
 	return &Logger{
-		Title: title,
-		file:  f,
+		LogToFile: logToFile,
+		file:      f,
 	}, nil
 	}, nil
 }
 }
 
 
-func (l *Logger) PrintAndLog(errorMessage string, originalError error) {
-	l.Log(errorMessage, originalError)
-	log.Println("[" + l.Title + "] " + errorMessage)
+func (l *Logger) PrintAndLog(title string, message string, originalError error) {
+	l.Log(title, message, originalError)
+	log.Println("[" + title + "] " + message)
 }
 }
 
 
-func (l *Logger) Log(errorMessage string, originalError error) {
-	l.file.WriteString(time.Now().Format("2006-01-02 15:04:05.000000") + " " + errorMessage + " " + originalError.Error())
+func (l *Logger) Log(title string, errorMessage string, originalError error) {
+	if l.LogToFile {
+		if originalError == nil {
+			l.file.WriteString(time.Now().Format("2006-01-02 15:04:05.000000") + "|" + fmt.Sprintf("%-16s", title) + " [INFO]" + errorMessage + "\n")
+		} else {
+			l.file.WriteString(time.Now().Format("2006-01-02 15:04:05.000000") + "|" + fmt.Sprintf("%-16s", title) + " [ERROR]" + errorMessage + " " + originalError.Error() + "\n")
+		}
+
+	}
 }
 }
 
 
 func (l *Logger) Close() {
 func (l *Logger) Close() {

+ 2 - 0
startup.go

@@ -13,9 +13,11 @@ import (
 	db "imuslab.com/arozos/mod/database"
 	db "imuslab.com/arozos/mod/database"
 	"imuslab.com/arozos/mod/filesystem"
 	"imuslab.com/arozos/mod/filesystem"
 	fs "imuslab.com/arozos/mod/filesystem"
 	fs "imuslab.com/arozos/mod/filesystem"
+	"imuslab.com/arozos/mod/info/logger"
 )
 )
 
 
 func RunStartup() {
 func RunStartup() {
+	systemWideLogger, _ = logger.NewLogger("system", "system/logs/", true)
 	//1. Initiate the main system database
 	//1. Initiate the main system database
 
 
 	//Check if system or web both not exists and web.tar.gz exists. Unzip it for the user
 	//Check if system or web both not exists and web.tar.gz exists. Unzip it for the user