NLog layout
This Layout implementation formats an NLog event into a JSON representation that adheres to the Elastic Common Schema specification.
Add a reference to the Elastic.CommonSchema.NLog package:
<PackageReference Include="Elastic.CommonSchema.NLog" Version="8.6.0" />
Layout.Register<EcsLayout>("EcsLayout");
var config = new LoggingConfiguration();
var consoleTarget = new ConsoleTarget("console") { Layout = new EcsLayout() };
config.AddRule(LogLevel.Debug, LogLevel.Fatal, consoleTarget);
LogManager.Configuration = config;
var logger = LogManager.GetCurrentClassLogger();
- Register the ECS layout.
- Use the ECS layout.
In the code snippet above Layout.Register<EcsLayout>("EcsLayout") registers the EcsLayout with NLog. The Layout = new EcsLayout() line then instructs NLog to use the registered layout. The sample above uses the console target, but you are free to use any target of your choice; perhaps consider using a filesystem target and Elastic Filebeat for durable and reliable ingestion.
<nlog>
<extensions>
<add assembly="Elastic.Apm.NLog"/>
<add assembly="Elastic.CommonSchema.NLog"/>
</extensions>
<targets>
<target name="console" type="console">
<layout xsi:type="EcsLayout">
<metadata name="MyProperty" layout="MyPropertyValue" /> <!-- repeated, optional -->
<label name="MyLabel" layout="MyLabelValue" /> <!-- repeated, optional -->
<tag layout="MyTagValue" /> <!-- repeated, optional -->
</layout>
</target>
</targets>
<rules>
<logger name="*" minLevel="Debug" writeTo="Console" />
</rules>
</nlog>
- Metadata Options
- IncludeEventProperties - Include LogEvent properties as metadata. Default:
true - IncludeScopeProperties - Include NLog Scope Context Properties as metadata. Default:
false - ExcludeProperties - Comma separated string with names which properties to exclude.
- Event Options
- EventAction -
- EventCategory -
- EventId -
- EventKind -
- EventSeverity -
- Agent Options
- AgentId -
- AgentName -
- AgentType -
- AgentVersion -
- Process Options
- ProcessExecutable - Default:
${processname:FullName=true} - ProcessId - Default:
${processid} - ProcessName - Default:
${processname:FullName=false} - ProcessThreadId - Default:
${threadid} - ProcessTitle - Default:
${processinfo:MainWindowTitle} - Server Options
- ServerAddress -
- ServerIp -
- ServerUser - Default:
${environment-user} - Host Options
- HostId -
- HostIp - Default:
${local-ip:cachedSeconds=60} - HostName - Default:
${machinename} - Log Origin Options
- LogOriginCallSiteMethod - Default:
${exception:format=method} - LogOriginCallSiteFile - Default:
${exception:format=source} - LogOriginCallSiteLine -
- Http Options
- HttpRequestId - Default:
${aspnet-trace-identifier} - HttpRequestMethod - Default:
${aspnet-request-method} - HttpRequestBytes - Default:
${aspnet-request-contentlength} - HttpRequestReferrer - Default:
${aspnet-request-referrer} - HttpResponseStatusCode - Default:
${aspnet-response-statuscode} - Url Options
- UrlScheme - Default:
${aspnet-request-url:IncludeScheme=true:IncludeHost=false:IncludePath=false} - UrlDomain - Default:
${aspnet-request-url:IncludeScheme=false:IncludeHost=true:IncludePath=false} - UrlPath - Default:
${aspnet-request-url:IncludeScheme=false:IncludeHost=false:IncludePath=true} - UrlPort - Default:
${aspnet-request-url:IncludeScheme=false:IncludeHost=false:IncludePath=false:IncludePort=true} - UrlQuery - Default:
${aspnet-request-url:IncludeScheme=false:IncludeHost=false:IncludePath=false:IncludeQueryString=true} - UrlUserName - Default:
${aspnet-user-identity} - Trace Options
- ApmTraceId - Default:
${ElasticApmTraceId} - Transaction Options
- ApmTransactionId - Default:
${ElasticApmTransactionId}*
Additionally any valid ECS log template properties that is available under LogTemplateProperties.* e.g LogTemplateProperties.TraceId is supported and will directly set the appropriate ECS fields.
logger.Info("The time is {TraceId}", "my-trace-id");
Will override trace.id on the resulting ECS json document.
An example of the output is given below:
{
"@timestamp":"2020-02-20T16:07:06.7109766+11:00",
"log.level":"Info",
"message":"Info \"X\" 2.2",
"metadata":{
"value_x":"X",
"some_y":2.2
},
"ecs":{
"version":"1.4.0"
},
"event":{
"severity":6,
"timezone":"AUS Eastern Standard Time",
"created":"2020-02-20T16:07:06.7109766+11:00"
},
"host":{
"name":"LAPTOP"
},
"log":{
"logger":"Elastic.CommonSchema.NLog",
"original":"Info {ValueX} {SomeY}"
},
"process":{
"thread":{
"id":17592
},
"pid":17592,
"name":"dotnet",
"executable":"C:\\Program Files\\dotnet\\dotnet.exe"
}
}