If, for some reason, you wanted to keep track of work regardless of the transaction state, you could use a table variable instead.
Table variables exist outside the scope of the transaction, and therefore are not rolled back.
For example:
DECLARE @CategoryChanges TABLE
( ChangeID int Primary Key Identity
, CategoryID int
, OldCategoryName nvarchar(15)
, NewCategoryName nvarchar(15)
, ModifiedDate datetime2
, LoginID nvarchar(30));
BEGIN TRANSACTION
UPDATE Categories
SET CategoryName = 'Dried Produce'
OUTPUT inserted.CategoryID, deleted.CategoryName
, inserted.CategoryName, getdate(), SUSER_SNAME()
INTO @CategoryChanges
WHERE CategoryID = 7;
SELECT * FROM @CategoryChanges --first select statement
ROLLBACK TRANSACTION
SELECT * FROM @CategoryChanges --second select statement