The only way to do this would be with a proxy of some kind. Squid would work for HTTP transparently, but not HTTPS. If you want to do that, the clients would have to either hardcode the proxy settings or you could setup WPAD and they can use proxy autoconfigure.
Even squid won't get the MAC address, though, just IP, date/time, and URL.
Even if you could write some sort of DPI tool that would log URLs, it would still only work for HTTP.
Another way around this is to give all your clients public IP addresses (which may not be feasible), and then just keep a record of who was assigned which public IP when (PPPoE would help you here, if you forced auth).
Squid shouldn't be too bad performance-wise if you don't really have it caching, just logging.