diff --git a/utils/@LogHandler/LogHandler.m b/utils/@LogHandler/LogHandler.m new file mode 100644 index 0000000..7d5e140 --- /dev/null +++ b/utils/@LogHandler/LogHandler.m @@ -0,0 +1,38 @@ +classdef LogHandler < handle + % Use to start an stop using a LogWriter. + % Useful complement to static Logger. + + properties + active = false; + handle = []; + end + + methods + function obj = LogHanlder() + end + + function start(obj, logFileCategory) + if not(isfolder("log")) + warning("The %s folder does not exist. Log file not created.",... + fullfile(pwd, "log")); + return + end + if obj.active + obj.handle.closeBlock(); + obj.handle.logn("LOG FILE WRITING INTERRUPTED BY STARTING A NEW LOG FILE.") + obj.stop(); + end + obj.handle = LogWriter(logFileCategory); + obj.active = true; + end + + function stop(obj) + if obj.active + obj.handle.closeLog(); + obj.handle = []; + obj.active = false; + end + end + end + +end \ No newline at end of file diff --git a/utils/@Logger/Logger.m b/utils/@LogWriter/LogWriter.m similarity index 60% copy from utils/@Logger/Logger.m copy to utils/@LogWriter/LogWriter.m index 30640ef..2383e1c 100644 --- a/utils/@Logger/Logger.m +++ b/utils/@LogWriter/LogWriter.m @@ -1,173 +1,164 @@ -classdef Logger < handle +classdef LogWriter < handle % Class to create and manage log files. % % Log files are created automatically and include starting and ending timstamps. % Methods are available to create section and delimitations in the % handled log file. % % The log file name is chosen based on the logFileCategory argument % given to the contructor. This argument is also used to delete % the oldest log files according to the maxNumberOfLogFiles (default = 5) -% used with a Logger(logFileCategory,maxNumberOfLogFiles). +% used with a LogWriter(logFileCategory,maxNumberOfLogFiles). properties (Access = private) startTime logFileCategory maxNumberOfLogFiles logFid prefix suffix horizontalDelimiter end methods - - function obj = Logger(logFileCategory,varargin) - obj.startTime = datetime('now'); - obj.logFileCategory = logFileCategory; + function obj = LogWriter(logFileCategory,varargin) + obj.startTime = datetime("now"); + obj.logFileCategory = string(logFileCategory); if nargin == 2 obj.maxNumberOfLogFiles = varargin{1}; else obj.maxNumberOfLogFiles = 5; end - obj.prefix = ''; - obj.suffix = ''; - obj.horizontalDelimiter = '_______________________________________'; + obj.prefix = ""; + obj.suffix = ""; + obj.horizontalDelimiter = "_______________________________________"; obj.createNewLog; end function log(obj,textToLog,varargin) % to be used like sprintf(). % write arguments in current log file. - textToLog = obj.replaceSpecialCharacter(textToLog); + textToLog = string(textToLog); + textToLog = replace(textToLog, "\", "/"); textToLog = sprintf(textToLog,varargin{:}); - fprintf(obj.logFid,[textToLog obj.suffix]); + fprintf(obj.logFid,textToLog+obj.suffix); end function logn(obj,textToLog,varargin) - obj.suffix = [obj.suffix '\n']; + obj.suffix = obj.suffix+"\n"; try obj.log(textToLog,varargin{:}); catch ME warning(ME.message); end - obj.suffix = obj.suffix(1:end-2); + obj.suffix = replace(obj.suffix, "\n", ""); fprintf(obj.logFid,obj.prefix); end function newSection(obj,title) if isempty(obj.prefix) obj.newBlock; end - obj.logn(''); - obj.prefix = [obj.prefix ' ']; + obj.logn(""); + obj.prefix = obj.prefix+" "; obj.logn(title); end function newDelimitedSection(obj,title) if not(isempty(obj.prefix)) prefixSave = obj.prefix; obj.prefix = obj.prefix(1); - obj.logn(''); + obj.logn(""); obj.logn(obj.horizontalDelimiter); obj.prefix = prefixSave; - obj.logn(''); - obj.prefix = [obj.prefix ' ']; + obj.logn(""); + obj.prefix = obj.prefix+" "; obj.log(title); else obj.newSection(title); end end function closeSection(obj) if (length(obj.prefix) > 3) - obj.prefix = obj.prefix(1:end-2); - obj.logn(''); + currentPrefix = char(obj.prexif); + obj.prefix = currentPrefix(1:end-2); + obj.logn(""); elseif (length(obj.prefix) > 0) obj.closeBlock; end end function closeBlock(obj) if (length(obj.prefix) > 0) - obj.prefix = obj.prefix(1); - obj.logn(''); + obj.prefix = replace(obj.prefix, " ", ""); + obj.logn(""); obj.log(obj.horizontalDelimiter); - obj.prefix = ''; + obj.prefix = ""; obj.logn(obj.horizontalDelimiter); - obj.logn(''); - obj.logn(''); + obj.logn(""); + obj.logn(""); end end function closeLog(obj) obj.delete; end function deleteExtraLogFiles(obj) - existingLogFiles = dir(['log\' obj.logFileCategory '_*.log']); + existingLogFiles = dir(fullfile("log", obj.logFileCategory+"*.log")); numberOfExtraFiles = (length(existingLogFiles) - obj.maxNumberOfLogFiles); if (numberOfExtraFiles > 0) for i = 1:numberOfExtraFiles delete(fullfile(existingLogFiles(i).folder,existingLogFiles(i).name)); end end end - end - methods (Access = private, Hidden = true) - function createNewLog(obj) - if isempty(dir('log')) - mkdir('log'); + if isempty(dir("log")) + mkdir("log"); end obj.createLogFile; obj.deleteExtraLogFiles; obj.logHeader; end function createLogFile(obj) - obj.startTime.Format = '_yyyy_MM_dd_HHmmss'; - obj.logFid = fopen(fullfile('log',[obj.logFileCategory char(obj.startTime) '.log']),'w'); + obj.startTime.Format = "_yyyy_MM_dd_HHmmss"; + obj.logFid = fopen(fullfile("log",obj.logFileCategory+char(obj.startTime)+".log"),"w"); end function logHeader(obj) - obj.logn([obj.logFileCategory '.log']); - obj.startTime.Format = 'default'; - obj.logn('Date: %s',char(obj.startTime)); - obj.logn(''); - end - - function str = replaceSpecialCharacter(obj,str) - str = strrep(str,'\','/'); + obj.logn(obj.logFileCategory+".log"); + obj.startTime.Format = "default"; + obj.logn("Date: %s",char(obj.startTime)); + obj.logn(""); end function newBlock(obj) - obj.logn(''); - obj.logn(''); + obj.logn(""); + obj.logn(""); obj.log(obj.horizontalDelimiter); - obj.prefix = ['| ']; + obj.prefix = "| "; obj.logn(obj.horizontalDelimiter); - obj.logn(''); + obj.logn(""); end function delete(obj) obj.closeBlock; - obj.logn(''); - obj.logn(''); - obj.logn('Stop time: %s',char(datetime('now'))); - obj.log('End of log file.'); + obj.logn(""); + obj.logn(""); + obj.logn("Stop time: %s",char(datetime("now"))); + obj.log("End of log file."); fclose(obj.logFid); obj.logFid = -1; end - end - - end diff --git a/utils/@Logger/Logger.m b/utils/@Logger/Logger.m index 30640ef..4f64049 100644 --- a/utils/@Logger/Logger.m +++ b/utils/@Logger/Logger.m @@ -1,173 +1,59 @@ -classdef Logger < handle -% Class to create and manage log files. -% -% Log files are created automatically and include starting and ending timstamps. -% Methods are available to create section and delimitations in the -% handled log file. -% -% The log file name is chosen based on the logFileCategory argument -% given to the contructor. This argument is also used to delete -% the oldest log files according to the maxNumberOfLogFiles (default = 5) -% used with a Logger(logFileCategory,maxNumberOfLogFiles). +classdef Logger + % Static interface to LogWriter - properties (Access = private) - startTime - logFileCategory - maxNumberOfLogFiles - logFid - prefix - suffix - horizontalDelimiter + properties (Constant, Access = private) + writing = LogHandler; end - methods - - function obj = Logger(logFileCategory,varargin) - obj.startTime = datetime('now'); - obj.logFileCategory = logFileCategory; - if nargin == 2 - obj.maxNumberOfLogFiles = varargin{1}; - else - obj.maxNumberOfLogFiles = 5; - end - obj.prefix = ''; - obj.suffix = ''; - obj.horizontalDelimiter = '_______________________________________'; - obj.createNewLog; + methods (Static) + function output = isactive() + output = Logger.writing.active; end - function log(obj,textToLog,varargin) - % to be used like sprintf(). - % write arguments in current log file. - textToLog = obj.replaceSpecialCharacter(textToLog); - textToLog = sprintf(textToLog,varargin{:}); - fprintf(obj.logFid,[textToLog obj.suffix]); + function start(logFileCategory) + Logger.writing.start(logFileCategory); end - function logn(obj,textToLog,varargin) - obj.suffix = [obj.suffix '\n']; - try - obj.log(textToLog,varargin{:}); - catch ME - warning(ME.message); - end - obj.suffix = obj.suffix(1:end-2); - fprintf(obj.logFid,obj.prefix); + function stop() + Logger.writing.stop(); end - function newSection(obj,title) - if isempty(obj.prefix) - obj.newBlock; + function log(textToLog, varargin) + if Logger.isactive + Logger.writing.handle.log(textToLog, varargin{:}); end - obj.logn(''); - obj.prefix = [obj.prefix ' ']; - obj.logn(title); end - - function newDelimitedSection(obj,title) - if not(isempty(obj.prefix)) - prefixSave = obj.prefix; - obj.prefix = obj.prefix(1); - obj.logn(''); - obj.logn(obj.horizontalDelimiter); - obj.prefix = prefixSave; - obj.logn(''); - obj.prefix = [obj.prefix ' ']; - obj.log(title); - else - obj.newSection(title); + function logn(textToLog, varargin) + if Logger.isactive + Logger.writing.handle.logn(textToLog, varargin{:}); end end - function closeSection(obj) - if (length(obj.prefix) > 3) - obj.prefix = obj.prefix(1:end-2); - obj.logn(''); - elseif (length(obj.prefix) > 0) - obj.closeBlock; + function newSection(title) + if Logger.isactive + Logger.writing.handle.newSection(title); end end - function closeBlock(obj) - if (length(obj.prefix) > 0) - obj.prefix = obj.prefix(1); - obj.logn(''); - obj.log(obj.horizontalDelimiter); - obj.prefix = ''; - obj.logn(obj.horizontalDelimiter); - obj.logn(''); - obj.logn(''); + function newDelimitedSection(title) + if Logger.isactive + Logger.writing.handle.newDelimitedSection(title); end end - function closeLog(obj) - obj.delete; - end - - function deleteExtraLogFiles(obj) - existingLogFiles = dir(['log\' obj.logFileCategory '_*.log']); - numberOfExtraFiles = (length(existingLogFiles) - obj.maxNumberOfLogFiles); - if (numberOfExtraFiles > 0) - for i = 1:numberOfExtraFiles - delete(fullfile(existingLogFiles(i).folder,existingLogFiles(i).name)); - end + function closeSection() + if Logger.isactive + Logger.writing.handle.closeSection(); end end - end - - - - methods (Access = private, Hidden = true) - - function createNewLog(obj) - if isempty(dir('log')) - mkdir('log'); + function closeBlock() + if Logger.isactive + Logger.writing.handle.closeBlock(); end - obj.createLogFile; - obj.deleteExtraLogFiles; - obj.logHeader; - end - - function createLogFile(obj) - obj.startTime.Format = '_yyyy_MM_dd_HHmmss'; - obj.logFid = fopen(fullfile('log',[obj.logFileCategory char(obj.startTime) '.log']),'w'); - end - - function logHeader(obj) - obj.logn([obj.logFileCategory '.log']); - obj.startTime.Format = 'default'; - obj.logn('Date: %s',char(obj.startTime)); - obj.logn(''); - end - - function str = replaceSpecialCharacter(obj,str) - str = strrep(str,'\','/'); - end - - function newBlock(obj) - obj.logn(''); - obj.logn(''); - obj.log(obj.horizontalDelimiter); - obj.prefix = ['| ']; - obj.logn(obj.horizontalDelimiter); - obj.logn(''); - end - - function delete(obj) - obj.closeBlock; - obj.logn(''); - obj.logn(''); - obj.logn('Stop time: %s',char(datetime('now'))); - obj.log('End of log file.'); - fclose(obj.logFid); - obj.logFid = -1; end end - - - end