classdef log4matlab < handle
%LOG4MATLAB This is a very simple logger with thoughts of the very
%powerful log4cxx
properties (Constant)
DEBUG = 0;
WARN = 1;
ERROR = 2;
NONE = 3; % No messages at all
end
properties(SetObservable = true)
mlog;
end
properties(Access = protected)
logger;
end
properties(Access = private)
listener2mlog;
end
properties(SetAccess = protected)
fullpath = 'log4matlab.log';
append = false;
commandWindowLevel = log4matlab.NONE;
end
methods
%% ...structors
function self = log4matlab(fullpath_passed,doAppend)
if nargin > 0
path = fullpath_passed;
if nargin > 1
self.setAppend(doAppend);
end
end
self.setFilename(path);
self.listener2mlog = addlistener(self,'mlog','PostSet',@self.WriteToFile);
end
%% setFilename
function setFilename(self,fullpath_passed)
self.fullpath = fullpath_passed;
if ~self.append
fid = fopen(self.fullpath,'w');
fclose(fid);
end
end
%% setLoggerLevel
function setLoggerLevel(self,loggerIdentifier,value)%#ok<MANU>
loggerIdentifier = strrep(loggerIdentifier, '.', '_');
eval(['self.logger.',loggerIdentifier,'.value = ',num2str(value),';']);
end
%% getLoggerLevel
function result = getLoggerLevel(self,loggerIdentifier)
% Default is debug
result = self.DEBUG;
loggerIdentifier = strrep(loggerIdentifier, '.', '_');
if isfield(self.logger,loggerIdentifier)
eval(['result = self.logger.',loggerIdentifier,'.value;']);
else
self.setLoggerLevel(loggerIdentifier,result)
end
end
%% setCommandWindowLevel
function setCommandWindowLevel(self,loggerIdentifier)
self.commandWindowLevel = loggerIdentifier;
end
end
methods (Access = private)
%% setAppend
function setAppend(self,value)
if value
self.append = true;
else
self.append = false;
end
end
%% WriteToFile
function WriteToFile(self,src,evnt) %#ok<INUSD>
if ~iscell(self.mlog) || size(self.mlog,2)~=3
error('Problem with the value of mlog that has been set');
elseif isempty(self.fullpath)
error('You must set fullpath using setFilename() method');
end
loggerIdentifier = strrep(self.mlog{2}, '.', '_');
% If there is no field by this name or the logger level set is
% less than the level passed then print to file
DoIt = true;
if isfield(self.logger,loggerIdentifier)
tempField = getfield(self.logger,loggerIdentifier); %#ok<GFLD>
if self.mlog{1} < tempField.value
DoIt = false;
end
end
if DoIt
if (self.mlog{1} == self.DEBUG), levelStr = 'DEBUG';
elseif (self.mlog{1} == self.WARN), levelStr = 'WARN';
else levelStr = 'ERROR';
end
try
fid = fopen(self.fullpath,'a');
fprintf(fid,'%s %s %s - %s\r\n' ...
, datestr(now,'yyyy-mm-dd HH:MM:SS,FFF') ...
, levelStr ...
, self.mlog{2} ... % Have left this one with the '.' if it is passed
, self.mlog{3});
fclose(fid);
catch ME_1
display(ME_1);
end
end
% If necessary write to command window
if self.commandWindowLevel <= self.mlog{1}
display([self.mlog{2},': ',self.mlog{3}]);
end
end
end
end