.net SeriLog和PowerShell的Hello World

.net SeriLog和PowerShell的Hello World,.net,powershell,serilog,serilog-exceptions,.net,Powershell,Serilog,Serilog Exceptions,我想了解如何在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.Co

我想了解如何在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:方法调用失败,因为[Serilog.Configuration.LoggerSinkConfiguration]不包含名为“Console”的方法

这在某种程度上是有意义的,因为我可以看到它丢失了,但我不明白为什么?我已经导入了两个DLL。我想对我来说,在理解如何使用PS中的DLL时,我是一个非常新手。我在Log4Net中有一个可靠的工作模块,而且运气更好,但我正在尝试迁移到更现代的东西,我正在竭尽全力,试图了解如果dotnet的公开示例不能转化为PS,如何集成各种接收器


仅供参考,我正在使用PS 7.1以防出现问题。

接收器没有丢失,并且您正在正确加载程序集。问题是Serilog接收器遵循一种约定,它利用了C#语言中一种称为“”的功能,这在PowerShell中是不可用的

如果查看,您将看到配置它的方法是一个静态方法,该方法将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接收器,您必须找出包含配置扩展方法的类的名称(每个接收器的名称不同),并将它们作为静态方法调用

模式与上面第一段代码中的模式相同:

$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") 

找出配置每个接收器所需的类名的最佳方法是查看要使用的接收器的源代码。它们通常遵循
LoggerConfigurationExtensions
的约定,但这并不能保证


在中,您可以找到官方接收器的源代码,对于,您可以访问每个接收器的单个源代码存储库。

接收器没有丢失,并且您正在正确加载程序集。问题是Serilog接收器遵循一种约定,它利用了C#语言中一种称为“”的功能,这在PowerShell中是不可用的

如果查看,您将看到配置它的方法是一个静态方法,该方法将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接收器,您必须找出包含配置扩展方法的类的名称(每个接收器的名称不同),并将它们作为静态方法调用

模式与上面第一段代码中的模式相同:

$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") 

找出配置每个接收器所需的类名的最佳方法是查看要使用的接收器的源代码。它们通常遵循
LoggerConfigurationExtensions
的约定,但这并不能保证


在中,您可以找到官方接收器的源代码,对于,您可以访问每个接收器的单个源代码存储库。

感谢您的详细回复,非常感谢@Eric.Singer你可能想看看这是一个用C#而不是PowerShell运行脚本的好方法。我来看看,谢谢你的详细回复,谢谢@Eric.Singer你可能想看看它给了你一个用C#而不是PowerShell运行脚本的好方法。我来看看,谢谢