使用 SeriLog 和 PowerShell 的 Hello World
Hello World with SeriLog and PowerShell
我正在尝试了解如何在 PS 中使用 SeriLog。
这是有效的代码示例:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config = [Serilog.Configuration.LoggerSinkConfiguration]$SeriLog_Config_Sink = $SeriLog_Config.WriteTo
[Serilog.Log]::Logger = [Serilog.ConsoleLoggerConfigurationExtensions]::Console($SeriLog_Config_Sink).CreateLogger()
[Serilog.Log]::Information("Logging started")
根据 SeriLogs 网站上为 dotnet 列出的示例,我不明白的是为什么我的所有接收器都丢失了。
示例:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config.WriteTo.Console()
我得到的错误是:
InvalidOperation: Method invocation failed because [Serilog.Configuration.LoggerSinkConfiguration] does not contain a method named 'Console'.
这在一定程度上是有道理的,因为我可以看到它不见了,但我不明白为什么?我已经导入了两个 DLL。我想对我来说,在了解如何使用 PS 中的 DLL 时,我是一个新手。我的运气要好得多,并且有一个可靠的 Log4Net 模块,但我正在尝试迁移到更现代的东西,我正在努力了解如何集成各种接收器,如果 public dotnet 示例不会转换为 PS.
仅供参考,我正在使用 PS 7.1 以防万一。
水槽没有丢失,并且您正在正确加载组件。问题是 Serilog sinks 遵循一个约定,该约定利用了名为“extension methods”的 C# 语言的一个特性,该特性在 PowerShell 中不可用。
如果你查看 source code of the Console sink,你会看到配置它的方法是一个 static 方法,它接收 Serilog 配置作为第一个参数特殊关键字 this:
public static class ConsoleLoggerConfigurationExtensions
{
public static LoggerConfiguration Console(
this LoggerSinkConfiguration sinkConfiguration, ...)
{
// ...
}
}
类型LoggerSinkConfiguration
前的特殊关键字this告诉C#编译器可以调用此方法,就好像它是LoggerSinkConfiguration
的实例方法一样.
LoggerConfiguration
的 属性 WriteTo
是 LoggerSinkConfiguration
类型,这就是为什么你可以这样写:
var config = new LoggerConfiguration();
config.WriteTo.Console();
这只是语法糖。编译器会将调用翻译成如下形式:
var config = new LoggerConfiguration();
ConsoleLoggerConfigurationExtensions.Console(config.WriteTo);
这正是您需要在 PowerShell 中执行的操作:
$config = New-Object Serilog.LoggerConfiguration
[Serilog.ConsoleLoggerConfigurationExtensions]::Console($config.WriteTo) | out-null
因此,为了在 PowerShell 中使用 Serilog 接收器,您必须找出包含配置扩展方法(因每个接收器而异)的 class 的名称,并调用它们作为静态方法。
模式与上面第一段代码中的模式相同:
$serilog = Add-Type -Path "C:\path-to\Serilog.dll" -PassThru
$serilogSinksConsole = Add-Type -Path "C:\path-to\Serilog.Sinks.Console.dll" -PassThru
# ... (add more sink assemblies)
$config = New-Object Serilog.LoggerConfiguration
[Serilog.ConsoleLoggerConfigurationExtensions]::Console($config.WriteTo) | out-null
# ... (configure more sinks)
# (create the logger with all the different sinks configured above)
[Serilog.Log]::Logger = $config.CreateLogger()
[Serilog.Log]::Information("Logging started")
找出您需要用于配置每个接收器的 class 名称的最佳方法是查看您要使用的接收器的源代码。他们通常遵循 <SinkName>LoggerConfigurationExtensions
的约定,但不能保证。
在 main Serilog organization you can find the source code of the official sinks, and for the other community-provided sinks 中,您可以访问它们各自的源代码存储库。
如果你想在PowerShell中使用Serilog,你可以使用PoShLog模块。
我正在尝试了解如何在 PS 中使用 SeriLog。
这是有效的代码示例:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config = [Serilog.Configuration.LoggerSinkConfiguration]$SeriLog_Config_Sink = $SeriLog_Config.WriteTo
[Serilog.Log]::Logger = [Serilog.ConsoleLoggerConfigurationExtensions]::Console($SeriLog_Config_Sink).CreateLogger()
[Serilog.Log]::Information("Logging started")
根据 SeriLogs 网站上为 dotnet 列出的示例,我不明白的是为什么我的所有接收器都丢失了。
示例:
$SeriLog = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.2.10.0\lib\net46\Serilog.dll" -PassThru
$SeriLog_Sink_Console = Add-Type -Path "C:\Program Files\PackageManagement\Serilog.Sinks.Console.3.1.1\lib\net45\Serilog.Sinks.Console.dll" -PassThru
$SeriLog_Config = New-Object Serilog.LoggerConfiguration
$SeriLog_Config.WriteTo.Console()
我得到的错误是:
InvalidOperation: Method invocation failed because [Serilog.Configuration.LoggerSinkConfiguration] does not contain a method named 'Console'.
这在一定程度上是有道理的,因为我可以看到它不见了,但我不明白为什么?我已经导入了两个 DLL。我想对我来说,在了解如何使用 PS 中的 DLL 时,我是一个新手。我的运气要好得多,并且有一个可靠的 Log4Net 模块,但我正在尝试迁移到更现代的东西,我正在努力了解如何集成各种接收器,如果 public dotnet 示例不会转换为 PS.
仅供参考,我正在使用 PS 7.1 以防万一。
水槽没有丢失,并且您正在正确加载组件。问题是 Serilog sinks 遵循一个约定,该约定利用了名为“extension methods”的 C# 语言的一个特性,该特性在 PowerShell 中不可用。
如果你查看 source code of the Console sink,你会看到配置它的方法是一个 static 方法,它接收 Serilog 配置作为第一个参数特殊关键字 this:
public static class ConsoleLoggerConfigurationExtensions
{
public static LoggerConfiguration Console(
this LoggerSinkConfiguration sinkConfiguration, ...)
{
// ...
}
}
类型LoggerSinkConfiguration
前的特殊关键字this告诉C#编译器可以调用此方法,就好像它是LoggerSinkConfiguration
的实例方法一样.
LoggerConfiguration
的 属性 WriteTo
是 LoggerSinkConfiguration
类型,这就是为什么你可以这样写:
var config = new LoggerConfiguration();
config.WriteTo.Console();
这只是语法糖。编译器会将调用翻译成如下形式:
var config = new LoggerConfiguration();
ConsoleLoggerConfigurationExtensions.Console(config.WriteTo);
这正是您需要在 PowerShell 中执行的操作:
$config = New-Object Serilog.LoggerConfiguration
[Serilog.ConsoleLoggerConfigurationExtensions]::Console($config.WriteTo) | out-null
因此,为了在 PowerShell 中使用 Serilog 接收器,您必须找出包含配置扩展方法(因每个接收器而异)的 class 的名称,并调用它们作为静态方法。
模式与上面第一段代码中的模式相同:
$serilog = Add-Type -Path "C:\path-to\Serilog.dll" -PassThru
$serilogSinksConsole = Add-Type -Path "C:\path-to\Serilog.Sinks.Console.dll" -PassThru
# ... (add more sink assemblies)
$config = New-Object Serilog.LoggerConfiguration
[Serilog.ConsoleLoggerConfigurationExtensions]::Console($config.WriteTo) | out-null
# ... (configure more sinks)
# (create the logger with all the different sinks configured above)
[Serilog.Log]::Logger = $config.CreateLogger()
[Serilog.Log]::Information("Logging started")
找出您需要用于配置每个接收器的 class 名称的最佳方法是查看您要使用的接收器的源代码。他们通常遵循 <SinkName>LoggerConfigurationExtensions
的约定,但不能保证。
在 main Serilog organization you can find the source code of the official sinks, and for the other community-provided sinks 中,您可以访问它们各自的源代码存储库。
如果你想在PowerShell中使用Serilog,你可以使用PoShLog模块。