That's what i did:
local function playerFirstSpawn( ply )
if util.tobool( GetConVarNumber( "ulx_logEvents" ) ) then
ulx.logString( string.format( "%s [%s][%s] joined the server.", ply:Nick(), ply:SteamID(), ply:IPAddress() ) )
end
end
hook.Add( "PlayerInitialSpawn", "ULXLogConnect", playerFirstSpawn )
But there is a small "bug": if a player disconnect before spawn it will record "Bla [STEAM_0_0_123456] left the server" but it's like he never joined..not a big problem anyway, just a small bug.