Serilog.Formatting.Log4Net 1.1.0

dotnet add package Serilog.Formatting.Log4Net --version 1.1.0                
NuGet\Install-Package Serilog.Formatting.Log4Net -Version 1.1.0                
此命令打算在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Serilog.Formatting.Log4Net" Version="1.1.0" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以引用包。
paket add Serilog.Formatting.Log4Net --version 1.1.0                
#r "nuget: Serilog.Formatting.Log4Net, 1.1.0"                
#r 指令可用于 F# Interactive 和多语言笔记本。将此内容复制到交互式工具或脚本源代码中以引用包。
// Install Serilog.Formatting.Log4Net as a Cake Addin
#addin nuget:?package=Serilog.Formatting.Log4Net&version=1.1.0

// Install Serilog.Formatting.Log4Net as a Cake Tool
#tool nuget:?package=Serilog.Formatting.Log4Net&version=1.1.0                

Serilog.Formatting.Log4NetSerilog 的一个附加组件,可以将日志事件格式化为与 log4netlog4j 兼容的 XML 格式。

NuGet Continuous Integration Coverage Code Quality Mutation Score

您可以使用 Log4View 来查看此格式器生成的日志文件。

入门

使用 NuGet 包管理器将 Serilog.Formatting.Log4Net NuGet 包添加到您的项目中,或运行以下命令:

dotnet add package Serilog.Formatting.Log4Net

Serilog.Formatting.Log4Net 提供了实现 Serilog 的 ITextFormatter 接口的 Log4NetTextFormatter 类。

下面是如何在简单的 Hello World 应用中使用该类的示例:

using System;
using Serilog;
using Serilog.Formatting.Log4Net;

static class Program
{
    static void Main(string[] args)
    {
        var logger = new LoggerConfiguration()
            .Enrich.WithProperty("AppName", "Program")
            .WriteTo.File(new Log4NetTextFormatter(c => c.UseCDataMode(CDataMode.Never)), "logs.xml")
            .CreateLogger();

        logger.Information("Start app with {Args}", args);
        Console.WriteLine("Hello World!");
        logger.Information("Stop app");
    }
}

运行此应用程序会将以下XML事件写入当前工作目录中的 logs.xml 文件

<log4net:event timestamp="2021-02-24T18:23:40.4496605+01:00" level="INFO" xmlns:log4net="https://logging.apache.ac.cn/log4net/schemas/log4net-events-1.2/">
  <log4net:properties>
    <log4net:data name="Args[0]" value="--first-argument" />
    <log4net:data name="Args[1]" value="--second-argument" />
    <log4net:data name="AppName" value="Program" />
  </log4net:properties>
  <log4net:message>Start app with ["--first-argument", "--second-argument"]</log4net:message>
</log4net:event>
<log4net:event timestamp="2021-02-24T18:23:40.5086666+01:00" level="INFO" xmlns:log4net="https://logging.apache.ac.cn/log4net/schemas/log4net-events-1.2/">
  <log4net:properties>
    <log4net:data name="AppName" value="Program" />
  </log4net:properties>
  <log4net:message>Stop app</log4net:message>
</log4net:event>

配置

您可以通过多种方式配置 Log4NetTextFormatter,流畅的选项构建器将帮助您发现所有可能性。

异常格式化

默认情况下,Log4NetTextFormatter 通过调用 ToString() 来格式化异常。您可以设置自己的格式化委托来自定义此行为。例如,您可以像这样使用 Ben.Demystifier

new Log4NetTextFormatter(c => c.UseExceptionFormatter(exception => exception.ToStringDemystified()))

CDATA

默认情况下,Log4NetTextFormatter 用 CDATA 部分写入所有消息和异常。您可以使用 CDataMode.IfNeeded 将其配置为仅在消息或异常包含 &<> 时使用 CDATA 部分或使用 CDataMode.Never 来永远不写入 CDATA 部分

new Log4NetTextFormatter(c => c.UseCDataMode(CDataMode.Never))

XML 名称空间

您可以通过在选项构建器上调用 UseNoXmlNamespace() 来删除 log4net XML 名称空间。如果您想节省一些字节数,并且日志读取器支持没有名称空间的 log4net XML 事件,这非常有用,例如 Log4View 就这样做。

new Log4NetTextFormatter(c => c.UseNoXmlNamespace())

换行符

默认情况下,Log4NetTextFormatter 使用行换行符 (LF) 字符作为 XML 元素之间的换行符。如果需要,您可以选择使用 CRLF

new Log4NetTextFormatter(c => c.UseLineEnding(LineEnding.CarriageReturn | LineEnding.LineFeed))

缩进

默认情况下,Log4NetTextFormatter 使用两个空格缩进 XML 元素。您可以将其配置为使用空格或制表符。例如,使用一个制表符缩进 XML 元素

new Log4NetTextFormatter(c => c.UseIndentationSettings(new IndentationSettings(Indentation.Tab, 1)))

或者您可以使用不进行缩进,使 log4net 事件在单行中写入

new Log4NetTextFormatter(c => c.UseNoIndentation())

格式提供者

默认情况下,Log4NetTextFormatter 当格式化实现 IFormattable 接口的 Serilog 属性时使用不变文化(Serilog 的默认值)。它可以配置为使用文化特定的格式化信息。例如,使用瑞士法语文化

new Log4NetTextFormatter(c => c.UseFormatProvider(CultureInfo.GetCultureInfo("fr-CH")))

属性过滤器

默认情况下,Log4NetTextFormatter 序列化所有 Serilog 属性。您可以通过配置自定义属性过滤器委托来过滤一些属性

new Log4NetTextFormatter(c => c.UsePropertyFilter((_, name) => name != "MySecretProperty"))

Log4j 兼容模式

格式化程序还支持 log4j 兼容模式。Log4Net 和 Log4j XML 格式非常相似,但有一些关键差异。

  • event 元素在不同的 XML 名称空间中
  • timestamp 属性是毫秒数(log4j)与 ISO 8061 格式的日期(log4net)
  • 异常元素命名为 throwableexception

为了启用兼容模式,请调用 UseLog4JCompatibility()

new Log4NetTextFormatter(c => c.UseLog4JCompatibility())

请注意,与其他流畅配置方法不同,此方法不能链式调用,因为您不应该在启用 log4j 兼容模式后更改选项。

或者,您可以使用配置为 log4j XML 布局的静态属性 Log4NetTextFormatter.Log4JFormatter。此静态属性在使用 Serilog.Settings.Configuration 包时也很有用,可以使用以下访问器使用

Serilog.Formatting.Log4Net.Log4NetTextFormatter::Log4JFormatter, Serilog.Formatting.Log4Net

组合选项

您还可以组合选项,例如,使用 Ben.Demystifier 进行异常格式化、过滤属性和使用 log4j 兼容模式。此示例配置在网络中使用 Serilog.Sinks.Udp 发送日志,并可以通过 Loginator 查看

var appFileName = Path.GetFileName(Environment.GetCommandLineArgs()[0]);
var processId = Process.GetCurrentProcess().Id;
var formatter = new Log4NetTextFormatter(c => c
    .UseExceptionFormatter(exception => exception.ToStringDemystified())
    .UsePropertyFilter((_, name) => name.StartsWith("log4j"))
    .UseLog4JCompatibility()
);
Log.Logger = new LoggerConfiguration()
    .Enrich.WithProperty("log4japp", $"{appFileName}({processId})")
    .Enrich.WithProperty("log4jmachinename", Environment.MachineName)
    .Enrich.WithThreadId()
    .WriteTo.Udp("localhost", 7071, AddressFamily.InterNetwork, formatter)
    .CreateLogger();

增强器

log4Net XML格式定义了一些特殊属性,这些属性默认不包含在Serilog事件中。可以通过使用合适的Serilog 增强器来添加它们。

线程ID

通过使用Serilog.Enrichers.Thread将线程ID包含到log4net事件中

var loggerConfiguration = new LoggerConfiguration().Enrich.WithThreadId();

域名和用户名

通过使用Serilog.Enrichers.Environment将域名和用户名包含到log4net事件中

var loggerConfiguration = new LoggerConfiguration().Enrich.WithEnvironmentUserName();

机器名

通过使用Serilog.Enrichers.Environment将机器名包含到log4net事件中

var loggerConfiguration = new LoggerConfiguration().Enrich.WithMachineName();

调用者

通过使用Serilog.Enrichers.WithCaller包含调用者信息(类、方法、文件、行)

var loggerConfiguration = new LoggerConfiguration().Enrich.WithCaller(includeFileInfo: true);

全部整合

结合这四个增强器会产生一个包含threaddomainusername属性的日志事件,包含包含机器名的log4net:HostName属性和一个locationInfo元素

<event timestamp="2020-06-28T10:07:33.314159+02:00" level="INFO" thread="1" domain="TheDomainName" username="TheUserName">
  <properties>
    <data name="log4net:HostName" value="TheMachineName" />
  </properties>
  <message>The message</message>
  <locationInfo class="Program" method="Main(System.String[])" file="/Absolute/Path/To/Program.cs" line="29" />
</event>

Serilog.Sinks.Log4Net项目与之一致,但依赖于log4net NuGet包,而Serilog.Formatting.Log4Net则不是。此外,Serilog.Sinks.Log4Net是一个收集器,因此除了配置Serilog外还必须配置log4net。

Serilog.Sinks.Udp项目也提供了一个Log4Net格式化器,但它手动(不使用XmlWriter)写入XML,完全忽略Serilog属性,完全没有可配置性(缩进、换行符、命名空间等),且无文档记录。

产品 兼容和额外的计算目标框架版本。
.NET net5.0 已计算。  net5.0-windows 已计算。  net6.0 兼容。  net6.0-android 已计算。  net6.0-ios 已计算。  net6.0-maccatalyst 已计算。  net6.0-macos 已计算。  net6.0-tvos 已计算。  net6.0-windows 已计算。  net7.0 已计算。  net7.0-android 已计算。  net7.0-ios 已计算。  net7.0-maccatalyst 已计算。  net7.0-macos 已计算。  net7.0-tvos 已计算。  net7.0-windows 已计算。  net8.0 已计算。  net8.0-android 已计算。  net8.0-browser 已计算。  net8.0-ios 已计算。  net8.0-maccatalyst 已计算。  net8.0-macos 已计算。  net8.0-tvos 已计算。  net8.0-windows 已计算。 
.NET Core netcoreapp2.0 已计算。  netcoreapp2.1 已计算。  netcoreapp2.2 已计算。  netcoreapp3.0 已计算。  netcoreapp3.1 已计算。 
.NET Standard netstandard2.0 兼容。  netstandard2.1 已计算。 
.NET Framework net461 已计算。  net462 已计算。  net463 已计算。  net47 已计算。  net471 已计算。  net472 已计算。  net48 已计算。  net481 已计算。 
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
有关目标框架.NET Standard的更多信息。

NuGet包

此包未被任何NuGet包使用。

GitHub 仓库

此包未被任何流行的GitHub仓库使用。

版本 下载 最后更新
1.1.0 4,832 5/1/2023
1.0.2 7,145 2/11/2023
1.0.1 422 1/17/2023
1.0.0 5,074 3/8/2022
1.0.0-rc.4 209 11/2/2021
1.0.0-rc.3 196 10/24/2021
1.0.0-rc.2 299 4/1/2021
1.0.0-rc.1 198 2/5/2021
1.0.0-alpha.0.110 155 2/4/2021
1.0.0-alpha.0.104 154 2/3/2021
1.0.0-alpha.0.103 155 2/3/2021
1.0.0-alpha.0.97.5 154 2/3/2021