diff --git a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs index 9baf8d471..0e87d21f3 100644 --- a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs +++ b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs @@ -202,8 +202,8 @@ internal sealed class LoggerProviderSdk : LoggerProvider /// protected override bool TryCreateLogger(string? name, out Logger? logger) { - // TODO: return new LoggerSdk(this, name); - throw new NotImplementedException(); + logger = new LoggerSdk(this, name); + return true; } /// diff --git a/src/OpenTelemetry/Logs/LoggerSdk.cs b/src/OpenTelemetry/Logs/LoggerSdk.cs new file mode 100644 index 000000000..328ad250a --- /dev/null +++ b/src/OpenTelemetry/Logs/LoggerSdk.cs @@ -0,0 +1,65 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#nullable enable + +using OpenTelemetry.Internal; + +namespace OpenTelemetry.Logs; + +/// +/// SDK implementation. +/// +internal sealed class LoggerSdk : Logger +{ + private readonly LoggerProviderSdk loggerProvider; + + public LoggerSdk( + LoggerProviderSdk loggerProvider, + string? name) + : base(name) + { + Guard.ThrowIfNull(loggerProvider); + + this.loggerProvider = loggerProvider; + } + + /// + public override void EmitLog(in LogRecordData data, in LogRecordAttributeList attributes = default) + { + var provider = this.loggerProvider; + var processor = provider.Processor; + if (processor != null) + { + var pool = provider.LogRecordPool; + + var logRecord = pool.Rent(); + + logRecord.Data = data; + logRecord.ILoggerData = default; + + // TODO: logRecord.Logger = this; + + logRecord.Attributes = attributes.Export(ref logRecord.AttributeStorage); + + processor.OnEnd(logRecord); + + // Attempt to return the LogRecord to the pool. This will no-op + // if a batch exporter has added a reference. + pool.Return(logRecord); + } + } +}