无法使用log4net.Ext.Json使Json登录Sitecore相关项目



正如我们所知,Sitecore已经将log4net封装为默认的日志记录功能(Sitecore.logging(。我的任务是使用log4net.Ext.Json Layout创建Json日志,并将其从Azure馈送到Datadog APM。相应的有用链接如下:https://docs.datadoghq.com/logs/log_collection/csharp/?tab=log4nethttps://docs.datadoghq.com/tracing/connect_logs_and_traces/dotnet?tab=log4nethttps://github.com/DataDog/dd-trace-dotnet/tree/master/samples/AutomaticTraceIdInjection/Log4NetExample

在过去的两周里,我没能做到:

尝试1:在Visual Studio中添加log4net.ext.Json(2.0.8.3版本(NuGet包。由于Sitecore已经封装了log4net(2.0.9版本(,所以我不需要添加log4net-NuGet包。

然后我配置配置文件如下:

<appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="$(dataFolder)/logs/json_log/json_log.json" />
<appendToFile value="true" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100MB" />
<!--json formatted log4net logging-->
<layout type='log4net.Layout.SerializedLayout, log4net.Ext.Json'>
<decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json" />
<!--explicit default members-->
<default />
<!--remove the default preformatted message member-->
<remove value="ndc" />
<remove value="message" />
<!--add raw message-->
<member value="message:messageobject" />
<!--add value='properties' to emit Datadog properties -->
<member value='properties'/>
<member value='dd.env' />
<member value='dd.service' />
<member value='dd.version' />
<member value='dd.trace_id' />
<member value='dd.span_id' />
</layout>
</appender>
<root>
<level value='INFO'/>
<appender-ref ref="JsonFileAppender"/>
</root>

结果是Json文件被创建,而日志文件中没有写入任何内容。

尝试2:我从gitlab官方网站下载了log4net.Ext.Json源代码,并创建了一个空项目,并将log4net.Ext.Jon的所有必要的C#源文件都包含在我的解决方案中。我还将项目名称重命名为log4netExtJson,这不会与现有的开箱即用的log4net.Ext.Json.dll发生冲突。要使log4net.Core正常工作,我还必须添加log4net(2.0.12版本(NuGet包。源代码如下:

https://gitlab.com/reeloadead/log4net.Ext.Json#installation

我把配置文件改成:

<appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="$(dataFolder)/logs/json_log/json_log.json" />
<appendToFile value="true" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100MB" />
<!--json formatted log4net logging-->
<layout type='log4net.Layout.SerializedLayout, log4netExtJson'>
<decorator type="log4net.Layout.Decorators.StandardTypesDecorator, log4netExtJson" />
<!--explicit default members-->
<default />
<!--remove the default preformatted message member-->
<remove value="ndc" />
<remove value="message" />
<!--add raw message-->
<member value="message:messageobject" />
<!--add value='properties' to emit Datadog properties -->
<member value='properties'/>
<member value='dd.env' />
<member value='dd.service' />
<member value='dd.version' />
<member value='dd.trace_id' />
<member value='dd.span_id' />
</layout>
</appender>
<root>
<level value='INFO'/>
<appender-ref ref="JsonFileAppender"/>
</root>

这一轮的结果是,甚至没有创建json日志文件。

尝试3:我联系了Sitecore支持门户网站,得到的回复是他们没有测试log4net.Ext.Json包,他们需要我尝试SitecoreLoggingExtensions NuGet包作为解决方法。源代码如下:

https://github.com/sitecoreops/sitecore-logging-extensions

我写的配置文件如下:

<appender name="JsonFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="$(dataFolder)/logs/json_log/json_log.json" />
<appendToFile value="true" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="100MB" />
<!--json formatted log4net logging-->
<!--SerializedLayout-->
<layout type='SitecoreLoggingExtensions.JsonLayout, SitecoreLoggingExtensions'>  
<!--explicit default members-->
<default />
<!--add value='properties' to emit Datadog properties -->
<member value='properties'/>
<!-- Manual changes: start -->
<member value='dd.env' />
<member value='dd.service' />
<member value='dd.version' />
<member value='dd.trace_id' />
<member value='dd.span_id' />
<!-- Manual changes: end -->
</layout>
</appender>
<root>
<!--<level value='INFO'/>-->
<appender-ref ref="JsonLogFileAppender"/>
</root>

包含内容的Json日志终于创建了!但在我在Azure上进行设置后,日志文件与Datadog没有连接。我的猜测是,带有SitecoreLoggingExtensions布局的Json日志与Datadog不兼容。所以这种方式对我的需求没有用。

我想知道之前是否有人在Sitecore相关项目中成功配置了log4net.Ext.Json包。

类似的经历:空文件、xml配置错误等。放弃了使用JSON扩展,但找到了另一种解决方案。

我使用模式布局,并将模式更改为JSON。在XML配置中,您不能使用双引号,但JsonConvert(用于反序列化(并不在乎:

<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="{'Thread':'%4t', 'Date':'%d{ABSOLUTE}', 'Level':'%-5p', 'Message':%m}%n" />
</layout>

为log4net记录器实现一个简单的包装器,并将一个对象(您选择的(作为日志消息传递。使用JsonConvert对其进行序列化并将其写入日志文件:

public static void Info(LogMessage logMessage)
{
var message = JsonConvert.SerializeObject(logMessage);
logger.Info(message);
}

我最初的意图是能够解析自定义日志文件,生成一些统计信息,但厌倦了使用整洁的字符串操作。因此JSON是我们选择的格式。

最新更新