log4net
editlog4net
editThis Layout implementation formats a log4net event into a JSON representation that adheres to the Elastic Common Schema specification.
Installation
editAdd a reference to the Elastic.CommonSchema.Log4net package:
<PackageReference Include="Elastic.CommonSchema.Log4net" Version="8.6.0" />
Usage
editSetup using configuration
editSpecify layout type in appender’s configuration:
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="ConsoleAppender" />
</root>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="Elastic.CommonSchema.Log4net.EcsLayout, Elastic.CommonSchema.Log4net" />
</appender>
</log4net>
Setup programatically
editvar hierarchy = (Hierarchy)LogManager.CreateRepository(Guid.NewGuid().ToString());
var appender = new ConsoleAppender { Layout = new EcsLayout() }; // Use the ECS layout.
hierarchy.Root.AddAppender(appender);
hierarchy.Root.Level = Level.All;
hierarchy.Configured = true;
The Layout = new EcsLayout() line then instructs log4net to use ECS layout.
The sample above uses the console appender, but you are free to use any appender of your choice, perhaps consider using a
filesystem target and Elastic Filebeat for durable and reliable ingestion.
ECS Aware Properties
editAny valid ECS log template properties that is available under LogTemplateProperties.* e.g LogTemplateProperties.TraceId
is supported and will directly set the appropriate ECS field.
Output
editApart from mandatory fields, the output contains additional data:
-
log.origin.file.nameis taken fromLocationInformation -
log.origin.file.lineis taken fromLocationInformation -
log.origin.functionis taken fromLocationInformation -
event.createdis taken from timestamp -
event.timezoneis equal to local timezone -
host.hostnameis taken fromHostNameproperty -
process.thread.idis taken fromThreadNameif it has numeric value -
process.thread.nameis taken fromThreadNameif it doesn’t have numeric value -
service.nameis taken from entry or calling assembly -
service.versionis taken from entry or calling assembly -
error.messageis taken fromExceptionObject -
error.typeis taken fromExceptionObject -
error.stacktraceis taken fromExceptionObject -
metadatais taken from properties. It also contains message template and arguments in case a formatted message was logged
Sample log event output (formatted for readability):
{
"@timestamp": "2022-08-28T14:06:28.5121651+02:00",
"log.level": "INFO",
"message": "Hi! Welcome to example!",
"metadata": {
"global_property": "Example",
"message_template": "{0}! Welcome to example!"
"0": "Hi"
},
"ecs": {
"version": "8.3.1"
},
"event": {
"timezone": "Central European Time",
"created": "2022-08-28T14:06:28.5121651+02:00"
},
"host": {
"hostname": "HGU780D3"
},
"log": {
"logger": "Elastic.CommonSchema.Log4net.Example.Program",
"original": null,
"origin": {
"file": {
"name": "C:\\Development\\Elastic.CommonSchema.Log4net.Example\\Program.cs",
"line": 17
},
"function": "Main"
}
},
"process": {
"thread": {
"id": 1
}
},
"service": {
"name": "Elastic.CommonSchema.Log4net.Example",
"version": "1.0.0.0"
}
}