Procházet zdrojové kódy

Added WIP system wide log

Toby Chui před 3 roky
rodič
revize
3dd7c868ac
12 změnil soubory, kde provedl 73 přidání a 63 odebrání
  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
 system/auth/authlog.db
 fsdb/*
+system/logs/*
 
 #Setting related
 system/network/wifi/ap/*

+ 1 - 0
Makefile

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

+ 3 - 4
agi.go

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

+ 1 - 2
apt.go

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

+ 3 - 4
auth.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	"crypto/rand"
-	"log"
 	"net/http"
 
 	auth "imuslab.com/arozos/mod/auth"
@@ -20,9 +19,9 @@ func AuthInit() {
 			rand.Read(key)
 			newSessionKey := string(key)
 			sysdb.Write("auth", "sessionkey", newSessionKey)
-			log.Println("New authentication session key generated")
+			systemWideLogger.PrintAndLog("Auth", "New authentication session key generated", nil)
 		} else {
-			log.Println("Authentication session key loaded from database")
+			systemWideLogger.PrintAndLog("Auth", "Authentication session key loaded from database", nil)
 
 		}
 		skeyString := ""
@@ -37,7 +36,7 @@ func AuthInit() {
 		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
 	} else {
 		//Default is false. But just in case

+ 3 - 2
desktop.go

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

+ 34 - 33
file_system.go

@@ -4,6 +4,7 @@ import (
 	"crypto/sha256"
 	"encoding/hex"
 	"encoding/json"
+	"errors"
 	"io"
 	"io/fs"
 	"log"
@@ -144,21 +145,21 @@ func FileSystemInit() {
 	//Create user root if not exists
 	err := os.MkdirAll(*root_directory+"users/", 0755)
 	if err != nil {
-		log.Println("Failed to create system storage root.")
+		systemWideLogger.PrintAndLog("File System", "Failed to create system storage root", err)
 		panic(err)
 	}
 
 	//Create database table if not exists
 	err = sysdb.NewTable("fs")
 	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)
 	}
 
 	//Create new table for sort preference
 	err = sysdb.NewTable("fs-sortpref")
 	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)
 	}
 
@@ -211,10 +212,10 @@ func FileSystemInit() {
 	go func() {
 		//Start version history cleaning in background
 		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)
 }
@@ -443,7 +444,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 	upgrader.CheckOrigin = func(r *http.Request) bool { return true }
 	c, err := upgrader.Upgrade(w, r, 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.Write([]byte("500 WebSocket upgrade failed"))
 		return
@@ -466,7 +467,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 			case <-ticker.C:
 				if time.Now().Unix()-lastChunkArrivalTime > 300 {
 					//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))
 					time.Sleep(1 * time.Second)
 					c.Close()
@@ -481,7 +482,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 		mt, message, err := c.ReadMessage()
 		if err != nil {
 			//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
 			time.Sleep(1 * time.Second)
 			if isHugeFile {
@@ -515,7 +516,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 
 			if writeErr != nil {
 				//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\"}`))
 
 				//Close the connection
@@ -576,7 +577,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 			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
@@ -601,7 +602,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 	}
 
 	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.WriteControl(8, []byte{}, time.Now().Add(time.Second))
 		time.Sleep(1 * time.Second)
@@ -618,7 +619,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 		}
 
 		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\"}`))
 			return
 		}
@@ -646,7 +647,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 
 	if err != nil {
 		// 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\"}`))
 		return
 	}
@@ -665,7 +666,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 		//This is local buffer file. Upload to dest fsh
 		f, err := os.Open(mergeFileLocation)
 		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\"}`))
 			f.Close()
 			return
@@ -673,7 +674,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 
 		err = fsh.FileSystemAbstraction.WriteStream(decodedUploadLocation, f, 0775)
 		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\"}`))
 			f.Close()
 			return
@@ -685,7 +686,7 @@ func system_fs_handleLowMemoryUpload(w http.ResponseWriter, r *http.Request) {
 	}
 
 	//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
 	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)
 	if err != nil {
 		//Filesize too big
-		log.Println(err)
+		systemWideLogger.PrintAndLog("File System", "Upload file size too big", err)
 		common.SendErrorResponse(w, "File too large")
 		return
 	}
 
 	file, handler, err := r.FormFile("file")
 	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")
 		return
 	}
@@ -823,12 +824,12 @@ func system_fs_handleUpload(w http.ResponseWriter, r *http.Request) {
 	//Move the file to destination file location
 	if *enable_asyncFileUpload {
 		//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)
 	if err != nil {
-		log.Println(err.Error())
+		systemWideLogger.PrintAndLog("File System", "Write stream to destination file system abstraction from upload failed", err)
 	}
 	file.Close()
 
@@ -847,7 +848,7 @@ func system_fs_handleUpload(w http.ResponseWriter, r *http.Request) {
 	*/
 
 	//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
 
@@ -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)))
 	restoreFolderRoot := filepath.Dir(filepath.Dir(filepath.Dir(realpath)))
 	targetPath := filepath.ToSlash(filepath.Join(restoreFolderRoot, originalFilename))
-	//log.Println(targetPath)
+	//systemWideLogger.PrintAndLog("File System", (targetPath)
 	fshAbs.Rename(realpath, targetPath)
 
 	//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)
 		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.")
 			return
 		}
@@ -1274,7 +1275,7 @@ func system_fs_handleNewObjects(w http.ResponseWriter, r *http.Request) {
 
 			err = fshAbs.WriteFile(newfilePath, defaultFileCotent, 0775)
 			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())
 				return
 			}
@@ -1330,7 +1331,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 	decodedSourceFiles, _ := url.QueryUnescape(vsrcFiles)
 	err = json.Unmarshal([]byte(decodedSourceFiles), &sourceFiles)
 	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.")
 		return
 	}
@@ -1356,7 +1357,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 
 	//Permission checking
 	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.Write([]byte("403 - Access Denied"))
 		return
@@ -1366,7 +1367,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 	if operation == "move" || operation == "copy" || operation == "zip" || operation == "unzip" {
 
 	} 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.Write([]byte("500 - Not supported operation"))
 		return
@@ -1468,7 +1469,7 @@ func system_fs_handleWebSocketOpr(w http.ResponseWriter, r *http.Request) {
 			f, _ := os.Open(zipDestPath)
 			err = destFshAbs.WriteStream(outputFilename, f, 0775)
 			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()
 
@@ -1859,7 +1860,7 @@ func system_fs_handleOpr(w http.ResponseWriter, r *http.Request) {
 				targetNewName := filepath.Join(filepath.Dir(rsrcFile), thisFilename)
 				err = srcFshAbs.Rename(rsrcFile, targetNewName)
 				if err != nil {
-					log.Println(err)
+					systemWideLogger.PrintAndLog("File System", "File rename failed", err)
 					common.SendErrorResponse(w, err.Error())
 					return
 				}
@@ -2502,7 +2503,7 @@ func system_fs_handleList(w http.ResponseWriter, r *http.Request) {
 			os.MkdirAll(filepath.Clean(realpath), 0775)
 		} else {
 			//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")
 			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
 	files, err := fshAbs.Glob(realpath + "/*")
 	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
 	}
 	var shortCutInfo *shortcut.ShortcutData = nil
@@ -3178,14 +3179,14 @@ func bufferRemoteFileToLocal(targetFsh *filesystem.FileSystemHandler, rpath stri
 	newBufferFilename := getFsBufferFilepath(rpath, keepOriginalName)
 	src, err := targetFsh.FileSystemAbstraction.ReadStream(rpath)
 	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
 	}
 	defer src.Close()
 
 	dest, err := os.OpenFile(newBufferFilename, os.O_CREATE|os.O_WRONLY, 0775)
 	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
 	}
 	io.Copy(dest, src)

+ 3 - 0
main.flags.go

@@ -8,6 +8,7 @@ import (
 	apt "imuslab.com/arozos/mod/apt"
 	auth "imuslab.com/arozos/mod/auth"
 	db "imuslab.com/arozos/mod/database"
+	"imuslab.com/arozos/mod/info/logger"
 	permission "imuslab.com/arozos/mod/permission"
 	user "imuslab.com/arozos/mod/user"
 	"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 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 systemWideLogger *logger.Logger                            //The sync map to store all system wide loggers
 
 // =========== SYSTEM FLAGS ==============
 //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
 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_logging = flag.Bool("logging", true, "Enable logging to file for debug purpose")
 
 //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")

+ 2 - 3
main.go

@@ -46,9 +46,8 @@ func executeShutdownSequence() {
 	log.Println("\r- Shutting down storage pools")
 	closeAllStoragePools()
 
-	//Shutdown Subservices
-	log.Println("\r- Shutting down background subservices")
-	//system_subservice_handleShutdown()
+	//Shutdown Logger
+	systemWideLogger.Close()
 
 	//Shutdown 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
 	}
 
-	log.Println("Key-value Database Service Started: " + dbfile)
-
 	tableMap := sync.Map{}
 	//Build the table list from database
 	err = db.View(func(tx *bolt.Tx) error {

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

@@ -1,6 +1,7 @@
 package logger
 
 import (
+	"fmt"
 	"log"
 	"os"
 	"path/filepath"
@@ -16,35 +17,41 @@ import (
 */
 
 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 {
 		return nil, err
 	}
 	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)
 	if err != nil {
 		return nil, err
 	}
 	return &Logger{
-		Title: title,
-		file:  f,
+		LogToFile: logToFile,
+		file:      f,
 	}, 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() {

+ 2 - 0
startup.go

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