diff --git a/CHANGELOG.md b/CHANGELOG.md
index eb1b86f31..9021fa522 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
 - Log a warning to the OpenTelemetry internal logger when a `Span` in `go.opentelemetry.io/otel/sdk/trace` drops an attribute, event, or link due to a limit being reached. (#5434)
 - Document instrument name requirements in `go.opentelemetry.io/otel/metric`. (#5435)
 - Prevent random number generation data-race for experimental rand exemplars in `go.opentelemetry.io/otel/sdk/metric`. (#5456)
+- Fix counting number of dropped attributes of `Record` in `go.opentelemetry.io/otel/sdk/log`. (#5464)
 
 ## [1.27.0/0.49.0/0.3.0] 2024-05-21
 
diff --git a/sdk/log/record.go b/sdk/log/record.go
index 9f8c63d2c..1c413fa6e 100644
--- a/sdk/log/record.go
+++ b/sdk/log/record.go
@@ -275,8 +275,6 @@ func (r *Record) addAttrs(attrs []log.KeyValue) {
 
 // SetAttributes sets (and overrides) attributes to the log record.
 func (r *Record) SetAttributes(attrs ...log.KeyValue) {
-	// TODO: apply truncation to string and []string values.
-	// TODO: deduplicate map values.
 	var drop int
 	attrs, drop = dedup(attrs)
 	r.setDropped(drop)
@@ -391,12 +389,12 @@ func (r *Record) Clone() Record {
 	return res
 }
 
-func (r Record) applyAttrLimits(attr log.KeyValue) log.KeyValue {
+func (r *Record) applyAttrLimits(attr log.KeyValue) log.KeyValue {
 	attr.Value = r.applyValueLimits(attr.Value)
 	return attr
 }
 
-func (r Record) applyValueLimits(val log.Value) log.Value {
+func (r *Record) applyValueLimits(val log.Value) log.Value {
 	switch val.Kind() {
 	case log.KindString:
 		s := val.AsString()
diff --git a/sdk/log/record_test.go b/sdk/log/record_test.go
index f76634496..cbbd89424 100644
--- a/sdk/log/record_test.go
+++ b/sdk/log/record_test.go
@@ -346,9 +346,10 @@ func TestRecordAttrDeduplication(t *testing.T) {
 
 func TestApplyAttrLimitsDeduplication(t *testing.T) {
 	testcases := []struct {
-		name        string
-		limit       int
-		input, want log.Value
+		name             string
+		limit            int
+		input, want      log.Value
+		wantDroppedAttrs int
 	}{
 		{
 			// No de-duplication
@@ -419,6 +420,7 @@ func TestApplyAttrLimitsDeduplication(t *testing.T) {
 				log.String("g", "GG"),
 				log.String("h", "H"),
 			),
+			wantDroppedAttrs: 10,
 		},
 	}
 
@@ -431,11 +433,13 @@ func TestApplyAttrLimitsDeduplication(t *testing.T) {
 			t.Run("AddAttributes", func(t *testing.T) {
 				r.AddAttributes(kv)
 				assertKV(t, r, log.KeyValue{Key: key, Value: tc.want})
+				assert.Equal(t, tc.wantDroppedAttrs, r.DroppedAttributes())
 			})
 
 			t.Run("SetAttributes", func(t *testing.T) {
 				r.SetAttributes(kv)
 				assertKV(t, r, log.KeyValue{Key: key, Value: tc.want})
+				assert.Equal(t, tc.wantDroppedAttrs, r.DroppedAttributes())
 			})
 		})
 	}
@@ -635,3 +639,15 @@ func TestTruncate(t *testing.T) {
 		})
 	}
 }
+
+func BenchmarkSetAddAttributes(b *testing.B) {
+	kv := log.String("key", "value")
+	records := make([]Record, b.N)
+
+	b.ReportAllocs()
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		records[i].SetAttributes(kv)
+		records[i].AddAttributes(kv)
+	}
+}