实现自定义json日志输出

master
Solin 2 years ago
parent 05ff6d0892
commit e2c0e0898c

@ -1,43 +1,31 @@
using log4net.Appender; using log4net.Core;
using log4net.Core; using log4net.Layout;
using System; using Newtonsoft.Json;
using System.Collections.Generic; using System.Numerics;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace log4net_json namespace log4net_json
{ {
public class CollectionAppender : AppenderSkeleton public class CustomLayout : PatternLayout
{ {
public static ObservableCollection<LogItem> logData = new ObservableCollection<LogItem>(); #region Public Methods and Operators
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; }
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) writer.WriteLine(JsonConvert.SerializeObject(new
{ {
Logger = data.LoggerName; timestamp = loggingEvent.TimeStampUtc,
Level = data.Level.DisplayName; threadId = loggingEvent.ThreadName,
Message = data.RenderedMessage; details = message,
Timestamp = data.TimeStamp; logger = loggingEvent.LoggerName,
ExceptionData = data.ExceptionObject; level = loggingEvent.Level.DisplayName,
user = loggingEvent.UserName
}));
} }
#endregion
} }
} }

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

@ -38,15 +38,36 @@
<decorator type='log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json' /> <decorator type='log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json' />
<default /> <default />
<remove value='message' /> <remove value='message' />
<remove value='ndc' />
<member value='version:2.0' />
<member value='message:messageobject' /> <member value='message:messageobject' />
</layout> </layout>
</appender> </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> <root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" /> <level value="all" />
<!--<appender-ref ref="ColoredConsoleAppender"/>--> <!--<appender-ref ref="RollingLogFileAppender"/>-->
<appender-ref ref="RollingLogFileAppender"/> <appender-ref ref="RollingLogFileAppender2"/>
</root> </root>
</log4net> </log4net>
</configuration> </configuration>
Loading…
Cancel
Save