首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SeriLog和PowerShell的Hello

SeriLog和PowerShell的Hello
EN

Stack Overflow用户
提问于 2020-12-17 00:28:18
回答 2查看 1.4K关注 0票数 1

我正在努力理解如何在PS中使用SeriLog。

这是一个可以工作的代码示例:

代码语言:javascript
复制
$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示例,我不明白为什么我的所有接收器都丢失了。

示例:

代码语言:javascript
复制
$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的话。

JFYI,我在使用PS7.1以防这件事发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-17 02:58:16

接收器没有丢失,您正在正确加载程序集。问题是,Serilog接收器遵循一种惯例,即利用C#语言的一个名为"可拓方法“的特性,这个特性在PowerShell中是不可用的。

如果您查看控制台接收器的源代码,您将看到配置它的方法是一个静态方法,它接收Serilog配置作为第一个参数,带有特殊关键字this

代码语言:javascript
复制
public static class ConsoleLoggerConfigurationExtensions
{
    public static LoggerConfiguration Console(
        this LoggerSinkConfiguration sinkConfiguration, ...)
    {
        // ...
    }
}

在类型之前的特殊关键字这个LoggerSinkConfiguration告诉C#编译器,可以像调用LoggerSinkConfiguration的实例方法一样调用该方法。

属性WriteTo of LoggerConfigurationLoggerSinkConfiguration类型,这就是为什么您可以编写:

代码语言:javascript
复制
var config = new LoggerConfiguration();
config.WriteTo.Console();

这只是语法糖。编译器将将调用转换为如下所示:

代码语言:javascript
复制
var config = new LoggerConfiguration();
ConsoleLoggerConfigurationExtensions.Console(config.WriteTo);

这正是您在PowerShell中需要做的:

代码语言:javascript
复制
$config = New-Object Serilog.LoggerConfiguration
[Serilog.ConsoleLoggerConfigurationExtensions]::Console($config.WriteTo) | out-null

因此,为了在PowerShell中使用Serilog接收器,您必须了解包含配置扩展方法(每个接收器不同)的类的名称,并将它们作为静态方法调用。

该模式与上面第一个代码块中的模式相同:

代码语言:javascript
复制
$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") 

找到配置每个接收器所需的类的名称的最佳方法是查看要使用的接收器的源代码。他们通常遵循<SinkName>LoggerConfigurationExtensions的惯例,但这并不能保证。

主要Serilog组织中,您可以找到正式接收器的源代码,对于其他社区提供的汇,您可以访问它们各自的源代码存储库。

票数 5
EN

Stack Overflow用户

发布于 2022-01-13 10:42:42

如果要在PowerShell中使用Serilog,可以使用PoShLog模块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65333066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档