diff --git a/examples/consume.py b/examples/consume.py
index 17667de..2254cd1 100644
--- a/examples/consume.py
+++ b/examples/consume.py
@@ -1,12 +1,19 @@
 import functools
+import logging
 import pika
 
+LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) '
+              '-35s %(lineno) -5d: %(message)s')
+LOGGER = logging.getLogger(__name__)
+
+logging.basicConfig(level=logging.INFO, format=LOG_FORMAT)
+
 def on_message(channel, method_frame, header_frame, body, userdata=None):
-    print('Userdata: {} Message body: {}'.format(userdata, body))
+    LOGGER.info('Userdata: {} Message body: {}'.format(userdata, body))
     channel.basic_ack(delivery_tag=method_frame.delivery_tag)
 
 credentials = pika.PlainCredentials('guest', 'guest')
-parameters =  pika.ConnectionParameters('localhost', credentials=credentials)
+parameters = pika.ConnectionParameters('localhost', credentials=credentials)
 connection = pika.BlockingConnection(parameters)
 
 channel = connection.channel()
diff --git a/pika/adapters/utils/connection_workflow.py b/pika/adapters/utils/connection_workflow.py
index e6926c9..e3567b5 100644
--- a/pika/adapters/utils/connection_workflow.py
+++ b/pika/adapters/utils/connection_workflow.py
@@ -14,6 +14,7 @@ import socket
 import pika.compat
 import pika.exceptions
 import pika.tcp_socket_opts
+from pika import __version__
 
 
 _LOG = logging.getLogger(__name__)
@@ -186,7 +187,8 @@ class AMQPConnector(object):
         self._sock.setblocking(False)
 
         addr = self._addr_record[4]
-        _LOG.info('Connecting to AMQP broker at %r', addr)
+        _LOG.info('Pika version %s connecting to %r',
+                  __version__, addr)
         self._task_ref = self._nbio.connect_socket(
             self._sock,
             addr,
diff --git a/pika/heartbeat.py b/pika/heartbeat.py
index 4eaaa59..3c9f46f 100644
--- a/pika/heartbeat.py
+++ b/pika/heartbeat.py
@@ -12,21 +12,24 @@ class HeartbeatChecker(object):
     intervals.
 
     """
+    DEFAULT_INTERVAL = 60
     MAX_IDLE_COUNT = 2
+
     _STALE_CONNECTION = "Too Many Missed Heartbeats, No reply in %i seconds"
 
-    def __init__(self, connection, interval, idle_count=MAX_IDLE_COUNT):
+    def __init__(self, connection, interval=DEFAULT_INTERVAL, idle_count=MAX_IDLE_COUNT):
         """Create a heartbeat on connection sending a heartbeat frame every
         interval seconds.
 
         :param pika.connection.Connection: Connection object
-        :param int interval: Heartbeat check interval
-        :param int idle_count: Number of heartbeat intervals missed until the
-                               connection is considered idle and disconnects
+        :param int interval: Heartbeat check interval. Note: heartbeats will
+                             be sent at interval / 2 frequency.
 
         """
         self._connection = connection
-        self._interval = interval
+        # Note: see the following document:
+        # https://www.rabbitmq.com/heartbeats.html#heartbeats-timeout
+        self._interval = float(interval / 2)
         self._max_idle_count = idle_count
 
         # Initialize counters

diff --git a/tests/unit/connection_tests.py b/tests/unit/connection_tests.py
index 9f40320..438633c 100644
--- a/tests/unit/connection_tests.py
+++ b/tests/unit/connection_tests.py
@@ -536,7 +536,7 @@ class ConnectionTests(unittest.TestCase):  # pylint: disable=R0904
                                 _adapter_emit_data,
                                 method,
                                 heartbeat_checker):
-        """make sure on connection tune turns the connection params"""
+        """make sure _on_connection_tune tunes the connection params"""
         heartbeat_checker.return_value = 'hearbeat obj'
         self.connection._flush_outbound = mock.Mock()
         marshal = mock.Mock(return_value='ab')
diff --git a/tests/unit/heartbeat_tests.py b/tests/unit/heartbeat_tests.py
index c5a7ca5..eaf339f 100644
--- a/tests/unit/heartbeat_tests.py
+++ b/tests/unit/heartbeat_tests.py
@@ -55,27 +55,31 @@ class ConstructableConnection(connection.Connection):
 
 class HeartbeatTests(unittest.TestCase):
 
-    INTERVAL = 5
+    INTERVAL = 60
+    HALF_INTERVAL = INTERVAL / 2
 
     def setUp(self):
         self.mock_conn = mock.Mock(spec_set=ConstructableConnection())
         self.mock_conn.bytes_received = 100
         self.mock_conn.bytes_sent = 100
         self.mock_conn._heartbeat_checker = mock.Mock(spec=heartbeat.HeartbeatChecker)
-        self.obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        self.obj = heartbeat.HeartbeatChecker(self.mock_conn)
 
     def tearDown(self):
         del self.obj
         del self.mock_conn
 
+    def test_default_initialization_interval(self):
+        self.assertEqual(self.obj._interval, self.HALF_INTERVAL)
+
     def test_default_initialization_max_idle_count(self):
         self.assertEqual(self.obj._max_idle_count, self.obj.MAX_IDLE_COUNT)
 
     def test_constructor_assignment_connection(self):
-        self.assertEqual(self.obj._connection, self.mock_conn)
+        self.assertIs(self.obj._connection, self.mock_conn)
 
     def test_constructor_assignment_heartbeat_interval(self):
-        self.assertEqual(self.obj._interval, self.INTERVAL)
+        self.assertEqual(self.obj._interval, self.HALF_INTERVAL)
 
     def test_constructor_initial_bytes_received(self):
         self.assertEqual(self.obj._bytes_received, 0)
@@ -94,7 +98,7 @@ class HeartbeatTests(unittest.TestCase):
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._setup_timer')
     def test_constructor_called_setup_timer(self, timer):
-        heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        heartbeat.HeartbeatChecker(self.mock_conn)
         timer.assert_called_once_with()
 
     def test_active_true(self):
@@ -122,13 +126,13 @@ class HeartbeatTests(unittest.TestCase):
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._close_connection')
     def test_send_and_check_not_closed(self, close_connection):
-        obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        obj = heartbeat.HeartbeatChecker(self.mock_conn)
         obj.send_and_check()
         close_connection.assert_not_called()
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._close_connection')
     def test_send_and_check_missed_bytes(self, close_connection):
-        obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        obj = heartbeat.HeartbeatChecker(self.mock_conn)
         obj._idle_byte_intervals = self.INTERVAL
         obj.send_and_check()
         close_connection.assert_called_once_with()
@@ -147,19 +151,19 @@ class HeartbeatTests(unittest.TestCase):
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._update_counters')
     def test_send_and_check_update_counters(self, update_counters):
-        obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        obj = heartbeat.HeartbeatChecker(self.mock_conn)
         obj.send_and_check()
         update_counters.assert_called_once_with()
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._send_heartbeat_frame')
     def test_send_and_check_send_heartbeat_frame(self, send_heartbeat_frame):
-        obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        obj = heartbeat.HeartbeatChecker(self.mock_conn)
         obj.send_and_check()
         send_heartbeat_frame.assert_called_once_with()
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._start_timer')
     def test_send_and_check_start_timer(self, start_timer):
-        obj = heartbeat.HeartbeatChecker(self.mock_conn, self.INTERVAL)
+        obj = heartbeat.HeartbeatChecker(self.mock_conn)
         obj.send_and_check()
         start_timer.assert_called_once_with()
 
@@ -202,7 +206,7 @@ class HeartbeatTests(unittest.TestCase):
 
     def test_setup_timer_called(self):
         self.mock_conn._adapter_add_timeout.assert_called_once_with(
-            self.INTERVAL, self.obj.send_and_check)
+            self.HALF_INTERVAL, self.obj.send_and_check)
 
     @mock.patch('pika.heartbeat.HeartbeatChecker._setup_timer')
     def test_start_timer_not_active(self, setup_timer):

Include the Pika version number in the log when opening a connection
See @vitaly-krugl's comment [here](https://github.com/pika/pika/issues/1046#issuecomment-392585166)
tests/unit/heartbeat_tests.py::HeartbeatTests::test_connection_close tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_increment_bytes tests/unit/heartbeat_tests.py::HeartbeatTests::test_setup_timer_called tests/unit/heartbeat_tests.py::HeartbeatTests::test_start_timer_not_active tests/unit/heartbeat_tests.py::HeartbeatTests::test_update_counters_bytes_received tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_increment_no_bytes tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_missed_bytes tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_called_setup_timer tests/unit/heartbeat_tests.py::HeartbeatTests::test_has_received_data_true tests/unit/heartbeat_tests.py::HeartbeatTests::test_bytes_received_on_connection tests/unit/heartbeat_tests.py::HeartbeatTests::test_default_initialization_interval tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_initial_heartbeat_frames_sent tests/unit/heartbeat_tests.py::HeartbeatTests::test_connection_is_idle_false tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_send_heartbeat_frame tests/unit/heartbeat_tests.py::HeartbeatTests::test_has_received_data_false tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_heartbeat_counter_incremented tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_not_closed tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_assignment_connection tests/unit/heartbeat_tests.py::HeartbeatTests::test_update_counters_bytes_sent tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_update_counters tests/unit/heartbeat_tests.py::HeartbeatTests::test_start_timer_active tests/unit/heartbeat_tests.py::HeartbeatTests::test_active_true tests/unit/heartbeat_tests.py::HeartbeatTests::test_connection_is_idle_true tests/unit/heartbeat_tests.py::HeartbeatTests::test_new_heartbeat_frame tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_heartbeat_send_frame_called tests/unit/heartbeat_tests.py::HeartbeatTests::test_default_initialization_max_idle_count tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_initial_idle_byte_intervals tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_initial_bytes_received tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_assignment_heartbeat_interval tests/unit/heartbeat_tests.py::HeartbeatTests::test_received tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_initial_bytes_sent tests/unit/heartbeat_tests.py::HeartbeatTests::test_send_and_check_start_timer tests/unit/heartbeat_tests.py::HeartbeatTests::test_constructor_initial_heartbeat_frames_received tests/unit/heartbeat_tests.py::HeartbeatTests::test_active_false
tests/unit/connection_tests.py::ConnectionTests::test_client_properties_override tests/unit/connection_tests.py::ConnectionTests::test_client_properties tests/unit/connection_tests.py::ConnectionTests::test_on_stream_terminated_invokes_connection_closed_callback tests/unit/connection_tests.py::ConnectionTests::test_channel_on_init_connection_raises_connection_closed tests/unit/connection_tests.py::ConnectionTests::test_close_calls_on_close_ready_when_no_channels tests/unit/connection_tests.py::ConnectionTests::test_close_closes_open_channels tests/unit/connection_tests.py::ConnectionTests::test_connect_no_adapter_connect_from_constructor_with_external_workflow tests/unit/connection_tests.py::ConnectionTests::test_on_data_available tests/unit/connection_tests.py::ConnectionTests::test_on_connection_tune tests/unit/connection_tests.py::ConnectionTests::test_blocked_connection_multiple_blocked_in_a_row_sets_timer_once tests/unit/connection_tests.py::ConnectionTests::test_on_connection_close_ok tests/unit/connection_tests.py::ConnectionTests::test_channel_on_closed_connection_raises_connection_closed tests/unit/connection_tests.py::ConnectionTests::test_on_stream_terminated_invokes_protocol_on_connection_error_and_closed tests/unit/connection_tests.py::ConnectionTests::test_new_conn_should_use_first_channel tests/unit/connection_tests.py::ConnectionTests::test_channel_on_tune_connection_raises_connection_closed tests/unit/connection_tests.py::ConnectionTests::test_add_on_open_error_callback tests/unit/connection_tests.py::ConnectionTests::test_blocked_connection_on_stream_terminated_removes_timer tests/unit/connection_tests.py::ConnectionTests::test_set_backpressure_multiplier tests/unit/connection_tests.py::ConnectionTests::test_add_callbacks tests/unit/connection_tests.py::ConnectionTests::test_on_stream_terminated_invokes_access_denied_on_connection_error_and_closed tests/unit/connection_tests.py::ConnectionTests::test_on_channel_cleanup_non_closing_state tests/unit/connection_tests.py::ConnectionTests::test_send_message_updates_frames_sent_and_bytes_sent tests/unit/connection_tests.py::ConnectionTests::test_add_on_connection_blocked_callback tests/unit/connection_tests.py::ConnectionTests::test_on_channel_cleanup_with_closing_channels tests/unit/connection_tests.py::ConnectionTests::test_on_connection_close_from_broker_passes_correct_exception tests/unit/connection_tests.py::ConnectionTests::test_channel tests/unit/connection_tests.py::ConnectionTests::test_close_raises_wrong_state_when_already_closed_or_closing tests/unit/connection_tests.py::ConnectionTests::test_on_channel_cleanup_closing_state_more_channels_no_on_close_ready tests/unit/connection_tests.py::ConnectionTests::test_blocked_connection_timeout_terminates_connection tests/unit/connection_tests.py::ConnectionTests::test_on_stream_terminated_cleans_up tests/unit/connection_tests.py::ConnectionTests::test_on_stream_terminated_invokes_auth_on_connection_error_and_closed tests/unit/connection_tests.py::ConnectionTests::test_close_channels tests/unit/connection_tests.py::ConnectionTests::test_close_closes_opening_channels tests/unit/connection_tests.py::ConnectionTests::test_client_properties_default tests/unit/connection_tests.py::ConnectionTests::test_on_connection_start tests/unit/connection_tests.py::ConnectionTests::test_on_channel_cleanup_closing_state_last_channel_calls_on_close_ready tests/unit/connection_tests.py::ConnectionTests::test_blocked_connection_unblocked_removes_timer tests/unit/connection_tests.py::ConnectionTests::test_no_side_effects_from_message_marshal_error tests/unit/connection_tests.py::ConnectionTests::test_add_on_close_callback tests/unit/connection_tests.py::ConnectionTests::test_connection_blocked_sets_timer tests/unit/connection_tests.py::ConnectionTests::test_next_channel_number_returns_lowest_unused tests/unit/connection_tests.py::ConnectionTests::test_deliver_frame_to_channel_with_frame_for_unknown_channel tests/unit/connection_tests.py::ConnectionTests::test_blocked_connection_multiple_unblocked_in_a_row_removes_timer_once tests/unit/connection_tests.py::ConnectionTests::test_channel_on_protocol_connection_raises_connection_closed tests/unit/connection_tests.py::ConnectionTests::test_create_with_blocked_connection_timeout_config tests/unit/connection_tests.py::ConnectionTests::test_channel_on_closing_connection_raises_connection_closed tests/unit/connection_tests.py::ConnectionTests::test_on_stream_connected tests/unit/connection_tests.py::ConnectionTests::test_channel_on_start_connection_raises_connection_closed tests/unit/connection_tests.py::ConnectionTests::test_close_does_not_close_closing_channels tests/unit/connection_tests.py::ConnectionTests::test_add_on_connection_unblocked_callback