from log4matlab by Gavin
Simple logger written with log4cxx in mind

log4matlab
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

Contact us