Net7使用Serilog+es

扩展包安装

		<PackageReference Include="Serilog" Version="2.12.0" />
		<PackageReference Include="Serilog.AspNetCore" Version="6.1.0" />
		<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />
		<PackageReference Include="Serilog.Settings.Configuration" Version="3.4.0" />
		<PackageReference Include="Serilog.Sinks.Async" Version="1.5.0" />
		<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="9.0.0" />
		<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />

封装


using Masuit.Tools;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Net7.Configuration;
using Serilog;
using Serilog.Events;
using Serilog.Formatting.Elasticsearch;
using Serilog.Sinks.Elasticsearch;

namespace Net7.Core
{
    /// <summary>
    /// Serilog封装
    /// </summary>
    public static class SerilogHostSetup
    {
        /// <summary>
        /// 添加Serilog
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="configuration"></param>
        public static void AddSerilogHost(this IHostBuilder builder, IServiceCollection serviceProvider, ConfigurationManager configuration)
        {
            var options = configuration.GetSection(SerilogOptions.Position).Get<SerilogOptions>();
            Log.Logger = new LoggerConfiguration()
                    .ConfigureFile(options.File)
                    .ConfigureConsole(options.Console)
                    .ConfigureElasticsearch(options.Elasticsearch).Result
                    .CreateLogger();
            builder.UseSerilog();
        }

        /// <summary>
        /// 添加Serilog中间件
        /// </summary>
        /// <param name="app"></param>
        public static void UseSerilogSetup(this IApplicationBuilder app)
        {
            app.UseSerilogRequestLogging();
        }

        private static LoggerConfiguration ConfigureFile(this LoggerConfiguration logger, SerilogFileOptions options)
        {
            if (options == null || options.Minlevels == null || !options.Minlevels.Any())
                return logger;

            //var path = AppDomain.CurrentDomain.BaseDirectory + "/Serilog/" + DateTime.Now.ToString(("yyyy-MM-dd")) + ".txt";
            var path = "Serilog/" + ".txt";
            foreach (var item in options.Minlevels)
            {
                logger.WriteTo.File(
                        path: path,
                        outputTemplate: options.Template,
                        rollingInterval: RollingInterval.Day,
                        shared: true,
                        fileSizeLimitBytes: 10 * 1024 * 1024,
                        rollOnFileSizeLimit: true,
                        restrictedToMinimumLevel: Enum.Parse<LogEventLevel>(item)
                        );
            }
            return logger;
        }

        private static LoggerConfiguration ConfigureConsole(this LoggerConfiguration logger, SerilogConsoleOptions options)
        {
            if (options == null) return logger;
            logger.WriteTo.Console(
                        restrictedToMinimumLevel: Enum.Parse<LogEventLevel>(options.Minlevel),
                        outputTemplate: options.Template
                        );
            return logger;
        }

        private static async Task<LoggerConfiguration> ConfigureElasticsearch(this LoggerConfiguration logger, SerilogElasticsearchOptions options)
        {
            if (options == null || options.Nodes.FirstOrDefault().IsNullOrEmpty()) return logger;
            List<Uri> uris = options.Nodes.Select(x => new Uri(x)).ToList();
            //请求uris如果超时则不连接
            uris = await PingAndFilterUrisAsync(uris);
            if (uris.Count == 0)
            {
                return logger;
            }

            logger.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(uris)
            {
                IndexFormat = options.Indexformat,
                NumberOfShards = options.NumberOfShards, // 主分片数
                NumberOfReplicas = options.NumberOfReplicas,// 复分片数
                CustomFormatter = new ExceptionAsObjectJsonFormatter(renderMessage: true),
                EmitEventFailure = EmitEventFailureHandling.RaiseCallback, // 消息发送失败时,执行回调函数 FailureCallback
                FailureCallback = FailureCallback,
                AutoRegisterTemplate = true,
                AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
                ModifyConnectionSettings = conn =>
                {
                    if (options.UserName.IsNullOrEmpty() || options.Password.IsNullOrEmpty())
                    {
                        conn.BasicAuthentication(options.UserName, options.Password);
                    }
                    return conn;
                }
            });
            return logger;
        }

        private static void FailureCallback(LogEvent e)
        {
          	Console.WriteLine("日志记录失败,信息:" + e.MessageTemplate);
        }

        /// <summary>
        /// 测试节点是否可用
        /// </summary>
        /// <param name="uris"></param>
        /// <returns></returns>
        private static async Task<List<Uri>> PingAndFilterUrisAsync(List<Uri> uris)
        {
            using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(3) };

            var successfulUris = new List<Uri>();

            foreach (var item in uris)
            {
                try
                {
                    // Add "_cluster/health" endpoint to ping the node
                    string healthCheckUri = $"{item.AbsoluteUri}";
                    HttpResponseMessage response = await httpClient.GetAsync(healthCheckUri);

                    if (response.IsSuccessStatusCode)
                    {
                        successfulUris.Add(item);
                    }
                }
                catch (TaskCanceledException)
                {
                    Console.WriteLine($"请求至 '{item}' 超时。");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"请求至 '{item}' 时发生错误:{ex.Message}");
                }
            }
            return successfulUris;
        }
    }
}

调用

//Serilog
builder.Host.AddSerilogHost(builder.Services, configuration);

//Serilog
app.UseSerilogSetup();

效果

在这里插入图片描述

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值