Logical clocks are used in distributed systems to determine the order of events. Lamport timestamps assign each process a clock that increments for each local event and message. Vector clocks assign each process an element in a vector that is incremented for local events and updated based on received messages. This allows vector clocks to determine if events are causally before, concurrent, or have no ordering. Examples are given to illustrate how logical and vector clocks work.