(* this works well for frontend only*)
$PreRead=(log=OpenAppend["/Users/aaron/mma.log"];Write[log, {$Line, DateString[], MakeExpression[#, StandardForm]}];Close[log];#)&
(* this works for backend and frontend, not so good*)
$Pre=(log = OpenAppend[/Users/aaron/mma.log]; Write[log, {$Line, DateString[], Print[#1]}]; Close[log]; #1) &
(* this just works *)
$PrePrint=(log=OpenAppend["/Users/aaron/mma.log"];WriteString[log, ToString[$Line],"\t", DateString[],"\t", InStri
ng[$Line],"\n"];Close[log];#)&