1) Logical clocks are used to provide a total ordering of events in an asynchronous distributed system where there is no global clock. Each process maintains a local logical clock that is incremented for compute and send events. The clock is updated based on timestamp values piggybacked in received messages.
2) The happened-before relation defines a partial ordering of events based on causality. Logical clocks extend this to a total ordering but the ordering is arbitrary and may not match the perceived order of users.
3) While logical clocks provide total ordering, the timestamps do not preclude concurrent events from having the same value. Vector clocks were developed to address this limitation of Lamport clocks.