实现自定义json日志输出

master
Solin 2 years ago
parent 05ff6d0892
commit e2c0e0898c

@ -1,43 +1,31 @@
using log4net.Appender;
using log4net.Core;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net.Core;
using log4net.Layout;
using Newtonsoft.Json;
using System.Numerics;
namespace log4net_json
{
public class CollectionAppender : AppenderSkeleton
public class CustomLayout : PatternLayout
{
public static ObservableCollection<LogItem> logData = new ObservableCollection<LogItem>();
protected override void Append(LoggingEvent loggingEvent)
{
logData.Add(new LogItem(loggingEvent));
}
}
public class LogItem
{
public string Logger { get; private set; }
public string Level { get; private set; }
public string Message { get; private set; }
public DateTime Timestamp { get; private set; }
public Exception ExceptionData { get; private set; }
#region Public Methods and Operators
public bool ShouldSerializeExceptionData() //This keeps things tidy when using Json.net for non exemption entries.
public override void Format(TextWriter writer, LoggingEvent loggingEvent)
{
return ExceptionData != null;
}
var message = loggingEvent.MessageObject.GetType().IsPrimitive || loggingEvent.MessageObject is string || loggingEvent.MessageObject is decimal || loggingEvent.MessageObject is BigInteger
? new { message = loggingEvent.MessageObject }
: loggingEvent.MessageObject;
public LogItem(LoggingEvent data)
{
Logger = data.LoggerName;
Level = data.Level.DisplayName;
Message = data.RenderedMessage;
Timestamp = data.TimeStamp;
ExceptionData = data.ExceptionObject;
writer.WriteLine(JsonConvert.SerializeObject(new
{
timestamp = loggingEvent.TimeStampUtc,
threadId = loggingEvent.ThreadName,
details = message,
logger = loggingEvent.LoggerName,
level = loggingEvent.Level.DisplayName,
user = loggingEvent.UserName
}));
}
#endregion
}
}

@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="log4net" Version="2.0.14" />
<PackageReference Include="log4net.Ext.Json" Version="2.0.10.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>

@ -38,15 +38,36 @@
<decorator type='log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json' />
<default />
<remove value='message' />
<remove value='ndc' />
<member value='version:2.0' />
<member value='message:messageobject' />
</layout>
</appender>
<appender name="RollingLogFileAppender2" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<param name= "File" value= "logs/"/>
<!--多线程时采用最小锁定-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数-->
<!--<param name= "MaxSizeRollBackups" value= "10"/>-->
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2022-05-22.log-->
<param name= "DatePattern" value= "yyyy-MM-dd'.log'"/>
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net_json.CustomLayout">
<conversionPattern value="%level %thread %logger - %preparedMessage%newline" />
</layout>
</appender>
<root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<!--<appender-ref ref="ColoredConsoleAppender"/>-->
<appender-ref ref="RollingLogFileAppender"/>
<!--<appender-ref ref="RollingLogFileAppender"/>-->
<appender-ref ref="RollingLogFileAppender2"/>
</root>
</log4net>
</configuration>
Loading…
Cancel
Save