无法将类型字符串隐式转换为 serilog.formatting.ITextformatter

Posted

技术标签:

【中文标题】无法将类型字符串隐式转换为 serilog.formatting.ITextformatter【英文标题】:Cannot implicitly convert type string to serilog.formatting.ITextformatter 【发布时间】:2019-01-09 13:37:05 【问题描述】:

如何将字符串对象转换为 Serilog.formatting.ITextformatter。

我正在尝试将 Serilog 的日志写入 Cloudwatch,其中一个步骤是创建自定义文本格式化程序。现在我需要转换我的自定义格式以匹配 IText 格式。 我在这个 Github repo 中使用这个库: https://github.com/Cimpress-MCP/serilog-sinks-awscloudwatch

public class LogFactory


    public ILoggerFactory ConfigureLogger()
    


        LoggerFactory factory = new LoggerFactory();

        var logGroupName = "MyLogGroupName";
     var region = Amazon.RegionEndpoint.EUWest1;


        const string outputTemplate = "Timestamp:HH:mm [Level] MachineName EnvironmentUserName (ThreadId) (ProcessId) SourceContext  MessageNewLineException";
        var options = new CloudWatchSinkOptions()
        
            // the name of the CloudWatch Log group for logging
            LogGroupName = logGroupName,

            TextFormatter = outputTemplate, //I get the error here.

            // the main formatter of the log event


            // other defaults defaults
            MinimumLogEventLevel = LogEventLevel.Information,
            BatchSizeLimit = 100,
            QueueSizeLimit = 10000,
            Period = TimeSpan.FromSeconds(10),
            CreateLogGroup = true,
            LogStreamNameProvider = new DefaultLogStreamProvider(),
            RetryAttempts = 5
        ;
        var client = new AmazonCloudWatchLogsClient(region);
    Log.Logger = new LoggerConfiguration()
          .WriteTo.AmazonCloudWatch(options, client)
          .CreateLogger();

        return factory;
    

将 Serilog 写入 Amazon Clouwatch。

【问题讨论】:

github.com/serilog/serilog/wiki/Formatting-Output 我回答你的另一个问题Creating Custom ITextFormatter 【参考方案1】:

你不能在输出模板中使用字符串,它需要一个 ITextFormatter 你可以使用这样的东西:

public class AWSTextFormatter : ITextFormatter

    public void Format(LogEvent logEvent, TextWriter output)
    
        output.Write("Timestamp - 0 | Level - 1 | Message 2 3", logEvent.Timestamp, logEvent.Level, logEvent.MessageTemplate, output.NewLine);
        if (logEvent.Exception != null)
        
            output.Write("Exception - 0", logEvent.Exception);
        
    

然后插入你的代码:

var outputTemplate = new AWSTextFormatter();

【讨论】:

【参考方案2】:

您可以使用Serilog.Formatting.Display.MessageTemplateTextFormatter 并在构造函数中传入您的正常输出模板字符串。

var textFormatter = new MessageTemplateTextFormatter(outputTemplate, null);

【讨论】:

以上是关于无法将类型字符串隐式转换为 serilog.formatting.ITextformatter的主要内容,如果未能解决你的问题,请参考以下文章

匿名托管的 DynamicMethods 程序集:无法将类型“字符串”隐式转换为“整数”

向启用文本框 (C#) 的 Web 部件添加按钮,出现错误:无法将类型“bool”隐式转换为“字符串”

无法将类型“System.DateTime”隐式转换为“string”是啥意思?怎么改正?

Js隐式转换

无法将类型 ('string', 'string') 隐式转换为 System.Net.ICredentialsByHost

无法将类型“unityengine.vector3”隐式转换为“float”