protected override void Append(LoggingEvent loggingEvent)
        {
            var probasContent = new ProbasContent(loggingEvent, Layout);
            var logs          = new List <LogInfo>
            {
                new LogInfo
                {
                    Time     = DateTimeOffset.Now,
                    Contents = probasContent.Contents
                }
            };
            var tags         = new Dictionary <string, string>();
            var source       = "netapi";
            var logGroupInfo = new LogGroupInfo {
                Logs = logs, LogTags = tags, Topic = Settings.Topic, Source = source
            };
            var request = new PostLogsRequest(Settings.Logstore, logGroupInfo);
            var result  = _client.PostLogStoreLogsAsync(request).Result;

            if (!result.IsSuccess)
            {
                var error = new Exception(result.Error.ToString());
                var msg   = $"post log store logs failed {result.RequestId}";
                ErrorHandler.Error(msg, error);
                Console.WriteLine(msg, error);
            }
            else
            {
                Console.WriteLine($"post log store logs request id {result.RequestId}");
            }
        }
        public IEnumerable <WeatherForecast> Get()
        {
            var contents = new Dictionary <string, string> {
                { "content", "This is the log write test." }
            };
            var logs = new List <LogInfo>
            {
                new LogInfo
                {
                    Time     = DateTimeOffset.Now,
                    Contents = contents
                }
            };
            var tags         = new Dictionary <string, string>();
            var source       = "netapi";
            var logGroupInfo = new LogGroupInfo {
                Logs = logs, LogTags = tags, Topic = "test-topic", Source = source
            };
            var request = new PostLogsRequest(_options.Logstore, logGroupInfo);
            var result  = _client.PostLogStoreLogsAsync(request).Result;

            var rng = new Random();

            return(Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
                   .ToArray());
        }
 /// <summary>
 /// 向指定的 LogStore 写入日志数据。目前仅支持写入 PB 格式的 <see cref="LogGroupInfo"/> 日志数据。写入时有两种模式:
 /// <list type="bullet">
 ///   <item>
 ///     <description>负载均衡模式(LoadBalance): 自动根据 Logstore 下所有可写的 shard 进行负载均衡写入。该方法对写入可用性较高(SLA: 99.95%),适合写入与消费数据与 shard 无关的场景,例如不保序。</description>
 ///   </item>
 ///   <item>
 ///     <description>根据 Key 路由 shard 模式(KeyHash):写入时需要传递一个 Key,服务端自动根据 Key 选择当前符合该 Key 区间的 Shard 写入。例如,可以将某个生产者(例如 instance)根据名称 Hash 到固定 Shard 上,这样就能保证写入与消费在该 Shard 上是严格有序的(在 Merge/Split 过程中能够严格保证对于 Key 在一个时间点只会出现在一个 Shard 上,参见 <see cref="http://help.aliyun.com/document_detail/28976.html">shard 数据模型</see>)。</description>
 ///   </item>
 /// </list>
 /// </summary>
 /// <param name="client">client实例。</param>
 /// <param name="logstoreName">日志库名称。</param>
 /// <param name="logGroup">一组日志。</param>
 /// <param name="hashKey">(可选)标记日志应该路由到哪个 shard 的标记。</param>
 /// <param name="project">项目名,此参数将覆盖 client 中默认设置。</param>
 /// <returns>异步响应结果。</returns>
 /// <seealso cref="ILogServiceClient.PostLogStoreLogsAsync"/>
 public static Task <IResponse> PostLogStoreLogsAsync(this ILogServiceClient client,
                                                      String logstoreName, LogGroupInfo logGroup,
                                                      String hashKey = null, String project = null)
 => client.PostLogStoreLogsAsync(new PostLogsRequest(logstoreName, logGroup)
 {
     HashKey     = hashKey,
     ProjectName = project
 });
        async protected override Task EmitBatchAsync(IEnumerable <LogEvent> events)
        {
            if (events == null)
            {
                throw new ArgumentNullException(nameof(events));
            }
            var logGroupInfo = new LogGroupInfo
            {
                Source = source,
                Topic  = topic,
            };

            if (logTags != null)
            {
                logGroupInfo.LogTags = logTags;
            }
            foreach (var logEvent in events)
            {
                var contents = new Dictionary <string, string>(logEvent.Properties.ToDictionary(k => k.Key, v => v.Value.ToString()))
                {
                    { "Level", logEvent.Level.ToString() }
                };

                if (logEvent.Exception != null)
                {
                    contents.Add("Exception", logEvent.Exception.ToString());
                }

                var stringBuilder = new StringBuilder();
                using (var stringWriter = new StringWriter(stringBuilder))
                {
                    this.formatter.Format(logEvent, stringWriter);
                }
                contents.Add("Message", stringBuilder.ToString());

                logGroupInfo.Logs.Add(new LogInfo
                {
                    Time     = logEvent.Timestamp,
                    Contents = contents
                });
            }
            try
            {
                var response = await logServiceClient.PostLogStoreLogsAsync(this.logstoreName, logGroupInfo, hashKey : Guid.NewGuid().ToString("N"), project : project);

                if (!response.IsSuccess)
                {
                    //REDO
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
Пример #5
0
        public static async Task PostLogStoreLogs(ILogServiceClient client)
        {
            // 原始日志
            var rawLogs = new[]
            {
                "2018-05-04 12:34:56 INFO id=1 status=foo",
                "2018-05-04 12:34:57 INFO id=2 status=bar",
                "2018-05-04 12:34:58 INFO id=1 status=foo",
                "2018-05-04 12:34:59 WARN id=1 status=foo",
            };

            // 解释 LogInfo
            var parsedLogs = rawLogs
                             .Select(x =>
            {
                var components = x.Split(' ');

                var date   = components[0];
                var time   = components[1];
                var level  = components[2];
                var id     = components[3].Split('=');
                var status = components[4].Split('=');

                var logInfo = new LogInfo
                {
                    Contents =
                    {
                        { "level",   level     },
                        { id[0],     id[1]     },
                        { status[0], status[1] },
                    },
                    Time = DateTimeOffset.ParseExact($"{date} {time}", "yyyy-MM-dd HH:mm:ss", null)
                };

                return(logInfo);
            })
                             .ToList();

            var logGroupInfo = new LogGroupInfo
            {
                Topic   = "example",
                Source  = "test",
                LogTags =
                {
                    { "example", "true" },
                },
                Logs = parsedLogs
            };

            var response = await client.PostLogStoreLogsAsync(LogStoreName, logGroupInfo);

            // 此接口没有返回结果,确保返回结果成功即可。
            response.EnsureSuccess();
        }
Пример #6
0
        /// <summary>
        ///     日志发送基础方法
        /// </summary>
        /// <param name="keyValuePairs">键值对</param>
        public async void BaseLogSend(Dictionary <string, string> keyValuePairs)
        {
            try
            {
                if (keyValuePairs == null || !keyValuePairs.Any())
                {
                    return;
                }
                if (!options.Enable)
                {
                    return;
                }
                if (Client == null)
                {
                    return;
                }
                var list    = new List <LogInfo>();
                var logItem = new LogInfo
                {
                    Time = DateTimeOffset.Now
                };
                foreach (var keyValuePair in keyValuePairs)
                {
                    if (!string.IsNullOrEmpty(keyValuePair.Key) && !string.IsNullOrEmpty(keyValuePair.Value))
                    {
                        logItem.Contents.Add(keyValuePair.Key, keyValuePair.Value);
                    }
                }
                list.Add(logItem);

                var logGroupInfo = new LogGroupInfo
                {
                    Topic  = name ?? "",
                    Logs   = list,
                    Source =
                        $"[{(options.IsDevelopmentModel ? options.DevelopmentSourcePrefix : options.OnlineSourcePrefix)}]{options.SourceName}"
                };

                await Client.PostLogStoreLogsAsync(options.LogStoreName, logGroupInfo);
            }
            catch (Exception)
            {
                // 作为日志模块不抛出异常
            }
        }
Пример #7
0
        public static void DoPutAsync()
        {
            if (logs.Count == 0)
            {
                return;
            }

            //这里需要是异步
            LogInfo[] arr = null;
            lock (logs)
            {
                arr = logs.ToArray();
                logs.Clear();
            }
            var logGroupInfo = new LogGroupInfo
            {
                Topic   = _appName,
                Logs    = arr,
                Source  = System.Environment.MachineName,
                LogTags =
                {
                    { "ver", _ver },
                },
            };

            try
            {
                var response = _client.PostLogStoreLogsAsync(_config.LogstoreName, logGroupInfo).Result;
                // 此接口没有返回结果,确保返回结果成功即可。
                if (!response.IsSuccess)
                {
                    System.Diagnostics.Debug.WriteLine($"上传日志错误,RequestId:{  response.RequestId},code:{response.Error.ErrorCode} msg:{response.Error.ErrorMessage}");
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"上传日志错误,RequestId:{ex}");
            }
        }