It's not a simple thing to set up and takes a fair amount of expertise with scripting, script triggers, relationships, etc.
There are two basic approaches that you can take:
Put an "edit" button on your layout. Clicking it duplicates the current record and changes to a layout where editig is permitted. You then identify fields that have changed data by comparing fields in the new copy of the record to the previous copy via a relationship. This generates a lot of nearly duplicate records in your table so this solves one problem but can complicate others. To make it work, you have to be able to "flag" the most recent version of the record and use scripts, finds, portal filters to hide the older copies of the record from view or you export those copies to a different table.
Use script triggers that capture the current value of a field in a global variable when you enter the field. Use an "onObjectSave" trigger to then update yet another global variable with the previous value of the field and the name of the field. Use an OnCommitRecords trigger to then save this data into fields of a "Change Log" table where you log the primary key of the record that was changed, what fields were changed and their previous values.