You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.9 KiB
166 lines
5.9 KiB
/** |
|
* Logger that allows to separate log messages into several levels of |
|
* significance and lets users and admins to access only the ones they want |
|
* and/or receive notifications when they happen. |
|
* Copyright 2020 Anton Tarasenko |
|
*------------------------------------------------------------------------------ |
|
* This file is part of Acedia. |
|
* |
|
* Acedia is free software: you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation, version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* Acedia is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with Acedia. If not, see <https://www.gnu.org/licenses/>. |
|
*/ |
|
class LoggerService extends Service |
|
config(AcediaLogger); |
|
|
|
// Log levels, available in Acedia. |
|
enum LogLevel |
|
{ |
|
// For the purposes of "tracing" the code, when trying to figure out |
|
// where exactly problems occurred. |
|
// Should not be used in any released version of |
|
// your packages/mutators. |
|
LOG_Track, |
|
// Information that can be used to track down errors that occur on |
|
// other people's systems, that developer cannot otherwise pinpoint. |
|
// Should be used with purpose of tracking a certain issue and |
|
// not "just in case". |
|
LOG_Debug, |
|
// Information about important events that should be occurring under |
|
// normal conditions, such as initializations/shutdowns, |
|
// successful completion of significant events, configuration assumptions. |
|
// Should not occur too often. |
|
LOG_Info, |
|
// For recoverable issues, anything that might cause errors or |
|
// oddities in behavior. |
|
// Should be used sparingly, i.e. player disconnecting might cause |
|
// interruption in some logic, but should not cause a warning, |
|
// since it is something expected to happen normally. |
|
LOG_Warning, |
|
// Use this for errors, - events that some operation cannot recover from, |
|
// but still does not require your module to shut down. |
|
LOG_Failure, |
|
// Anything that does not allow your module or game to function, |
|
// completely irrecoverable failure state. |
|
LOG_Fatal |
|
}; |
|
|
|
var private const string kfLogPrefix; |
|
var private const string traceLevelName; |
|
var private const string DebugLevelName; |
|
var private const string infoLevelName; |
|
var private const string warningLevelName; |
|
var private const string errorLevelName; |
|
var private const string fatalLevelName; |
|
|
|
var private config array< class<Manifest> > registeredManifests; |
|
var private config bool logTraceInKFLog; |
|
var private config bool logDebugInKFLog; |
|
var private config bool logInfoInKFLog; |
|
var private config bool logWarningInKFLog; |
|
var private config bool logErrorInKFLog; |
|
var private config bool logFatalInKFLog; |
|
|
|
var private array<string> traceMessages; |
|
var private array<string> debugMessages; |
|
var private array<string> infoMessages; |
|
var private array<string> warningMessages; |
|
var private array<string> errorMessages; |
|
var private array<string> fatalMessages; |
|
|
|
public final function bool ShouldAddToKFLog(LogLevel messageLevel) |
|
{ |
|
if (messageLevel == LOG_Track && logTraceInKFLog) return true; |
|
if (messageLevel == LOG_Debug && logDebugInKFLog) return true; |
|
if (messageLevel == LOG_Info && logInfoInKFLog) return true; |
|
if (messageLevel == LOG_Warning && logWarningInKFLog) return true; |
|
if (messageLevel == LOG_Failure && logErrorInKFLog) return true; |
|
if (messageLevel == LOG_Fatal && logFatalInKFLog) return true; |
|
return false; |
|
} |
|
|
|
public final static function LogMessageToKFLog |
|
( |
|
LogLevel messageLevel, |
|
string message |
|
) |
|
{ |
|
local string levelPrefix; |
|
levelPrefix = default.kfLogPrefix; |
|
switch (messageLevel) |
|
{ |
|
case LOG_Track: |
|
levelPrefix = levelPrefix $ default.traceLevelName; |
|
break; |
|
case LOG_Debug: |
|
levelPrefix = levelPrefix $ default.debugLevelName; |
|
break; |
|
case LOG_Info: |
|
levelPrefix = levelPrefix $ default.infoLevelName; |
|
break; |
|
case LOG_Warning: |
|
levelPrefix = levelPrefix $ default.warningLevelName; |
|
break; |
|
case LOG_Failure: |
|
levelPrefix = levelPrefix $ default.errorLevelName; |
|
break; |
|
case LOG_Fatal: |
|
levelPrefix = levelPrefix $ default.fatalLevelName; |
|
break; |
|
default: |
|
} |
|
Log(levelPrefix @ message); |
|
} |
|
|
|
public final function LogMessage(LogLevel messageLevel, string message) |
|
{ |
|
switch (messageLevel) |
|
{ |
|
case LOG_Track: |
|
traceMessages[traceMessages.length] = message; |
|
case LOG_Debug: |
|
debugMessages[debugMessages.length] = message; |
|
case LOG_Info: |
|
infoMessages[infoMessages.length] = message; |
|
case LOG_Warning: |
|
warningMessages[warningMessages.length] = message; |
|
case LOG_Failure: |
|
errorMessages[errorMessages.length] = message; |
|
case LOG_Fatal: |
|
fatalMessages[fatalMessages.length] = message; |
|
default: |
|
} |
|
if (ShouldAddToKFLog(messageLevel)) |
|
{ |
|
LogMessageToKFLog(messageLevel, message); |
|
} |
|
} |
|
|
|
defaultproperties |
|
{ |
|
// Log everything by default, if someone does not like it - |
|
// he/she can disable it themselves. |
|
logTraceInKFLog = true |
|
logDebugInKFLog = true |
|
logInfoInKFLog = true |
|
logWarningInKFLog = true |
|
logErrorInKFLog = true |
|
logFatalInKFLog = true |
|
// Parts of the prefix for our log messages, redirected into kf log file. |
|
kfLogPrefix = "Acedia:" |
|
traceLevelName = "Trace" |
|
debugLevelName = "Debug" |
|
infoLevelName = "Info" |
|
warningLevelName = "Warning" |
|
errorLevelName = "Error" |
|
fatalLevelName = "Fatal" |
|
} |