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; } }
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(); }
/// <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) { // 作为日志模块不抛出异常 } }
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}"); } }